Mybatis框架笔记01

34 篇文章 1 订阅
4 篇文章 0 订阅

教程指路:这里

Github指路(少量代码):这里

 

目录

1.前言

简单使用Mybatis

简单使用Mybatis方法2(接口式编程)

2.全局配置文件

2.1properties

2.2settings

2.3typeAliases

2.4typeHandlers(暂略)

2.5plugins(暂略)

2.6environments

2.7databaseIdProvider

2.8mappers

2.9标签顺序

3.映射文件

增删改操作实例:

获取自增主键

参数处理

参数值的获取

select

记录封装map

重要属性

resultMap

关联查询(resultMap)

使用asspciation分步查询

延迟加载

关联查询(collection)

传递多列的值

鉴别器discriminator(了解)


 

1.前言

之前所学到的JDBC->Dbutils->jdbcTemplate。都是工具,而Mybatis是一套整体的持久层(数据库)解决方案。

 

上述的功能简单,,sql在代码里,硬编码高耦合。

Hibernate框架:全自动ORM(Object Relation Mapping)框架,旨在消除sql

 

Mybatis半自动框架:把sql编写交给了程序员来实现,并且由于是在配置文件中,我们的sql语句和java代码分离。

 

有两个配置文件:

mybatis全局配置文件(非必须):数据库连接池信息,事务管理器信息等

sql映射文件:保存了每个sql语句的映射信息

使用映射文件还是接口?:

重要的,复杂的Dao接口我们使用sql映射文件

不太重要的,简单的Dao接口我们使用注解

简单使用Mybatis

1.下载jar包-github中,导包

 

2.数据库创建表和字段

 

3.在idea中创建对应类和getset方法

 

4.创建xml文件

 

5.创建测试类,和sqlSessionFactory

 

6.创建xml文件,编写sql语句这里我们的id为sql的唯一标识

 

7.获取session实例,用完关闭

 

8.写好的sql映射文件配置到全局配置文件中

 

9.注意事项(我的错误记录)

创建类的时候属性名称需要和数据库一致,如果不一致我们可以在slq语句中使用别名

   

在配置数据库的时候最后一个对应的是自己的那个·数据库名称

 

简单使用Mybatis方法2(接口式编程)

上述方式是以前版本,现在使用接口来描述参数返回值等内容。

接口可以和配置文件动态绑定

mybatis会为接口自动创建一个代理对象,代理对象去执行增删改查。

  

为什么常用这种方法? 有明确的返回值,有明确的输入,抽象出了规范。

sqlsession代表了和数据库的一次会话,用完要关闭,线程不安全的

 

1.配置文件中的namespace我们指定为接口的全类名

 

1.创建接口

 

2.把配置文件中的id修改为接口中的方法id,这样实现绑定

 

3.测试

 

2.全局配置文件

在全局配置文件中,我们使用这个dtd约束文件(需要联网),点击重新开启这个文件即可出现提示信息。

什么是dtd约束文件?用来确定语法规则的文件

 

2.1properties

Mybatis可以使用properties来引入外部properties配置文件的内容(和jdbc中的类似)(时候和pring一起使用时使用很少,配置都交给了spring)

resource:引入类路径的资源

url:引入网络路径或者是磁盘路径的资源

   

2.2settings

包含很多的重要设置项

name:设置项名

value:设置项取值

下例使用的是驼峰命名法案例:

 

2.3typeAliases

别名处理器,可以为我们的java类型起别名。可以启用别名和批量起别名。别名不区分大小写

 

会出现问题,如果我们的包下面还有一个子包,这个子包中有一个类和上级目录有相同的类名,这个时候就会识别不出来所需要的包,解决方法:解决注解

 

2.4typeHandlers(暂略)

java数据和数据库的映射,java类型和数据库中的类型相互转换

1.3.4之后已经整合到mybatis中无需我们配置

  

2.5plugins(暂略)

可以拦截sql的核心操作,和兴实现方法就是动态代理

 

2.6environments

mybatis可以配置多种环境

environment:配置一个具体的环境信息,必须有下面两个标签,id表示当前环境的唯一标识(可以动态的切换所需要的环境,例如还发环境和测试 使用default指定使用某种环境)

transactionManager:事务管理器

type:事务管理器类型,有两种类型JDBC , MANAGED (一般都是在pring中进行事务管理)

dataSource:数据源

type:数据元配置,有三种类型支持UNPOOLED , POOLED(缺省) , JNDI

dataSource:

  

2.7databaseIdProvider

针对不同的数据库厂商,动态的发送不同的sql。

写在environment外面,得到数据库厂商的标识(getDatabaseProductName()),mybatis根据数据库厂商表示来执行不同sql.

我们通过下述方式取别名

 

然后在映射xml文件中使用别名即可

 

2.8mappers

将sql映射注册到全局配置中

resource:引用类路径下的sql映射文件

url:引用网络路径或者是磁盘路径下的sql映射文件

class:直接引用(注册)接口

1:有slq映射文件,映射文件和接口同名,且放在接口同一目录下

2:使用sql映射文件,所有的sql都是利用注解写在接口上

在开始的时候,我们使用这个标签把sql映射文件注册到了全局配置文件中

    

2.9标签顺序

 

3.映射文件

 

增删改操作实例:

    

获取自增主键

 

如果是oracle我们使用下面方法:

首先我们通过selectKey先获取到id值,因为使用了order我们在insert前面执行,然后返回值交给keyProperty,最终的结果类型为reslutType类型。

 

参数处理

 

我们需要用下面方法取值

 

或者使用命名参数:即明确指定封装参数时map的key

需要在几口中明确指定名称

  

下面是使用map的案例

   

注意:这里如果的是数组,List等类型是:

  

参数值的获取

 

区别:

#{}:是以预编译的形式,将参数设置到sql语句中,防止sql注入

${}:去除的值直接拼装在sql语句中,有安全隐患

大多是情况下我们应该使用#{}

原生jdbc不支持占位符的地方我们就使用${}进行取值

下述方法就是其中一个案例,如果我们使用year进行了薪水表的拆分,我们就需要使用${}来动态的获取表的名称

然后我们同样需要使用${}来动态的确定升序或者降序

 

#{}的其他用法:规定参数的一些规则

  

jdbcType通常需要在某种特定的条件下被设置:我们数据为null的时候,有些数据库(Oracle)无法识别mybatis对mull的默认处理。mybatis对于所有的null都映射的是原生jdbc的OTHER类型,不能正确处理。

jdbcType设置的是某一个参数的默认类型

这里的意思是如果email为空,我们对应的是jdbc中的null类型而不是other类型

 

另一种方式为:在setting中配置

 

select

如果返回值是一个list我们在resultType中需要写的是list中对象的类型,而不是list类型

 

然后在测试类中写需要模糊查询的内容

 

记录封装map

我们可以直接使用map类型,因为mybatis已经封装好了

  

如果我们需要返回的是多条Map记录,我们使用的类型是值的类型

 

为了能够让程序知道我们的键是什么,我们需要在接口中使用一个注解。哪个属性作为map的key,下述案例就是使用id作为map的key

  

重要属性

 

resultMap

在类名和javabean的属性名姓名不一样:

1.起别名

2.开启驼峰命名法(符合驼峰命名法才可以)

3.使用resultMap:可以实现高级结果集映射

小案例:

  

关联查询(resultMap)

联表查询

小案例:添加类

  

设置数据库和外键:

 

sql编写:

方式一:这里使用级联属性的方式:

 

方拾二:使用association来定义关联的单个对象封装规则

 

结果测试:

  

使用asspciation分步查询

小案例:

 

在deptMapper.xml中有一个方法

 

 

 

我们把d_id的值传递给getDeptById这个方法,然后通过这个方法获取到的值,封装给dept属性

 

可以看到有两条查询语句

 

延迟加载

  

需要我们在主要配置文件中配置

 

我们的查询操作不涉及到部门信息,看看到结果只有一条查询语句。

  

关联查询(collection)

当需要关联集合类型的属性的3时候我们没法使用上面的级联属性,而是要使用collection

小案例2:查询部门的时候将对应的所有员工信息查询出来,使用的是嵌套结果集的方式

在sql的xml文件中写对应sql语句

 

然后需要定义resultMap的规则

  

测试:

 

:小案例2-2:分步查询

  

这个放在了EmployeeMapper.xml中

 

resultMap:collection中的select表示选择的是哪个xml文件中的哪个方法名称,column表示的使用上述的哪个column

 

测试:

 

 

 

注意:这里同样适用延迟加载!!

 

传递多列的值

  

鉴别器discriminator(了解)

mybatis可以使用鉴别器判断某列的值,然后根据某列的值修改封装行为

小案例:封装Employee,如果查出的是女生,把部门信息查出来,如果是男生就把last_name赋值给赋值给email

鉴别器中使用case来区分情况

  

结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值