MyBatis是一个实现数据持久化的开源框架。
ORMapping:Object Relation Mapping 对象关系映射
Java到Oracle 的映射,以面向对象的思想管理关系型数据库
开发方式:
- 使用原生接口
- Mapper代理实现自定义接口
原生接口方法
- MyBatis 框架需要开发者自定义SQL语句,写在Mapper.xml文件中,实际开发中,会为每个实体类创建对应的Mapper.xml,定义管理该对象数据的SQL。
- namespace 通常设置为文件所在包+文件名的形式
- insert 标签表示执行添加操作
- select 标签表示执行查询操作
- update标签表示执行更新操作
- delete 标签表示执行删除操作
- id 是实际调用MyBatis 方法时需要用到的参数
- parameter Type 是调用对应方法时参数的数据类型
-
在全局配置文件 config.xml中注册AccountMapper.xml
-
调用MyBatis的原生接口执行添加操作
Mapper代理实现自定义接口
- 自定义接口 定义相关业务方法
- 编写与方法相对应的Mapper.xml
- 自定义接口 interface
- 创建接口对应的Mapper.xml,定义接口对应的sql语句
statement标签可根据sql执行的任务选择 insert select delete update。
MyBatis会根据规则自动创建接口实现类的代理对象。
规则:
- Mapper.xml中 namespace 为接口的全类名。
- Mapper.xml中 statement 的 id 为接口中对应的方法名。
- Mapper.xml中 statement 的 parameterType 和接口中对应方法的参数类型一致。
- Mapper.xml中 statement 的 resultType 和接口中对应方法的返回值类型一致。
- 在config.xml中注册 AccountRepository.xml
- 调用接口的代理对象完成相关的业务操作
Mapper.xml
- statement 标签: select update delete insert
- parameterType:参数数据类型
-
基本数据类型,通过id查询Account
-
String类型,用name查询account
-
包装类,通过id查询account
基本数据类型无法接收null值
-
多个参数,通过 name 和 age 查询 account
arg0和arg1 或者param1和param2 -
Java Bean
-
- resultType:结果类型
- 基本数据类型, 统计account总数
- 包装类, 统计account总数
- String类, 通过id查询account的name
- java bean类型
- 基本数据类型, 统计account总数
级联查询
- 一对多 一个班级对应多个学生
student
classes
studentRepository
studentRepository.xml
根据班级查询学生列表
classRepository
classRepository.xml
集合用collection标签
逆向工程
MyBatis 框架需要: 实体类、自定义Mapper接口、Mapper.xml
传统开发中上述三个组件需要开发者手动创建,逆向工程可以帮助开发者自动创建三个组件,减轻开发者的工作量,提高工作效率。
缺点:
- 逆向工程只能创建一次
- 更改表结构后需要重新执行逆向工程
如何使用
MyBatis Generator,简称MBG,是一个专门为MyBatis框架开发者定制的代码生成器,可自动生成MyBatis框架所需的实体类、Mapper接口、Mapper.xml,支持基本的CRUD操作,但是一些相对复杂的SQL需要开发者自己来完成。
1. 新建Maven工程,pom.xml
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
- 创建MBG配置文件 generatorConfig.xml
- jdbcConnection 配置数据库连接信息
- javaModelGenerator 配置JavaBean的生成策略
- sqlMapGenerator 配置sql映射文件生成策略
- javaClientGenerator 配置mapper接口的生成策略
- table 配置目标数据表(tableName:表名, domainObjectName:JavaBean类名)
MyBatis缓存
使用缓存可以减少java应用与数据库的交互次数,从而提升程序的运行效率,第一次查询出之后会自动将该对象保存在缓存中,下一次无需再次访问数据库。
分类
-
一级缓存:SqlSession级别,默认开启,且不能关闭。
操作数据库时需要创建SqlSession对象,在对象中有一个HashMap用于存储缓存数据,不同SqlSession之间缓存数据区域是互不影响的。一级缓存的作用域是SqlSession范围的,当在同一个SqlSession中执行两次相同的SQL语句时,第一次执行完毕会将结果保存到缓存中,第二次查询时直接从缓存中获取。
需要注意的是,如果SqlSession执行了DML操作(insert、update、delete),MyBatis必须将缓存清空,以保证数据的准确性。
-
二级缓存:Mapper级别,默认关闭,可以开启
使用二级缓存时,多个SqlSession使用同一个Mapper的SQL语句操作数据库,得到的数据会存在二级缓存区,同样是使用HashMap进行数据存储,相较于一级缓存,二级缓存范围更大,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存是多个SqlSession共享的,其作用域是Mapper的同一个namespace,不同的SqlSession两次执行相同的namespace下的sql语句,参数也相等,则第一次执行成功后会将数据保存到二级缓存中,第二次可直接从二级缓存中取出数据。
MyBatis自带的二级缓存
- config.xml中配置开启二级缓存
- Mapper.xml中配置二级缓存
- 实体类实现序列化接口
- ehcache二级缓存
MyBatis 动态SQL
使用动态SQL可简化代码开发,减少开发者工作量,程序可以自动根据业务参数来决定SQL的组成。
- if 标签
- where 标签
where标签可以自动判断是否要删除语句块中的 and 关键字,如果检测到 where 直接跟 and 拼接,则自动删除 and 。
通常情况下,if和where结合起来使用。
- choose when
- trim标签
trim标签中的prefix和suffix属性会被用于生成实际的SQL语句,会和标签内部的语句进行拼接。如果语句前后出现了prefixOverrides或者suffixOverrides属性中指定的值,myBatis框架会自动将其删除。
- set标签
set标签用于update操作,会自动根据参数选择生成SQL语句。
- foreach标签
迭代生成一系列值,主要用于SQL的in语句。
select * from t_account where id in (1,4,5);