Mybatis
初始Mybatis(上篇文章的链接)
上一篇文章了解了Mybatis,并且懂得主配置文件的元素属性的基础了解和配置,这篇文章我们学习sql映射文件mapper.xml和接口的编写
内容如图:
一、Mybatis的强大
- Mybatis真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单
二、SQL映射文件(mapper.xml文件)
顶级元素介绍(按照定义的顺序)
- mapper namespace
- cache 配置给定命名空间的缓存
- cache-ref 从其他命名空间引入缓存配置
- resultMap 用来描述数据库结果集和对象的对应关系
- sql 可以重用的SQL块,也可以被其他语句引用
- insert 映射插入语句
- update 映射更新语句
- delete 映射删除语句
- select 映射查询语句
mapper元素详解
- namespace:命名空间
- namespace和子元素的id联合保证唯一,区别不同的mapper
- 绑定DAO接口(关键)
- namespace的命名必须跟某个接口同名
- 接口中的方法与映射文件中的SQL语句id一 一对应
示例:
userDao接口中有个selectAll方法,那么在同级目录下要创建一个userDao.xml配置文件,其中该文件的mapper的namespace为userDao的完整路径(包名+文件名),
同时在该xml文件中有一个< selelct id=“selectAll”>< /select>元素标签
select元素详解(重点)
select是Mybatis中最常用的元素之一
select语句是很多属性可以详细配置每一条语句
id属性
- id
- 命名空间中唯一的标识符
- 接口中的方法与映射文件中的SQL语句id 一 一对应
parameterType属性
- parameterType
- 传入SQL语句的参数类型
- 基本数据类型
- int、String、Date等
- 只能传入一个,通过#{参数名}获取传入的值
- 当参数参数使用@Param(“别名”)时,使用#{别名}获取
- 复杂数据类型
- Java实体类、Map等
- 通过#{属性名}或者#{map的keyName}即可获取传入的值
resultType属性
- resultType
- SQL语句返回值类型的完整类名或别名
- 基本数据类型
- 复杂数据类型
resultMap属性
- resultMap:对外部resultMap的引用
- 应用场景
- 数据库字段信息与对象属性不一致(对象属性roleid和数据库role_id)
- 复杂的联合查询,自由控制映射结果(如多对一等)
注意:
- 应用场景
resultMap和resultType不能同时存在
resultMap自动映射(自动匹配)
- 如何使用resultMap自动映射呢?
-
字段名与属性名相匹配
-
<setting name="autoMappingBehavior" value="NONE"/>
-
举例
- 首先我们看一下实体类:
数据库表字段名展示:
然后我们在默认不配置setting标签(就是说默认字段属性匹配开启的情况下)配置mapper文件,如下:
然后我们关闭自动匹配,如下:
select元素小结
insert元素详解
- insert
- id
- parameterType
- 没有返回值参数,直接就是插入成功的记录数
示例:
update元素详解
- id
- parameterType
示例:
update元素详解
- id
- parameterType
示例:
delete元素详解
- id
- parameterType
示例:
resultMap属性
- id
- resultMap的唯一标识
- type
- Java实体类
id属性
一般对应数据库中该行的主键id,设置该项可提高Mybatis性能(当然也可以用result来映射)
result
映射到JavaBean的某个“简单类型”属性
association
- 简介
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类(一对一、多对一) - 属性
- property:映射数据库列的实体对象的属性
- JavaType:完整Java类名或者别名
- resultMap:引用外部resultMap
- 子元素
- id
- result
- property:映射数据库列的实体对象的属性
- column:数据库列名或者别名
示例(一个用户对应一个角色):
- 首先改造我们的用户实体类如下:
collection
-
简介
映射到JavaBean的某个“复杂类型”属性,比如集合(一对多、多对多) -
属性
- property:映射数据库列的实体对象的属性
- ofType:完整Java类名或者别名(集合所包括的类型)
- resultMap:引用外部resultMap
-
子元素
- id
- result
- property:映射数据库列的实体对象的属性
- column:数据库类名或者别名
示例(一个角色对应多个用户):
- 首先改造角色实体
- 测试
resultMap自动映射(自动匹配)进阶
上面我们提到了该setting配置的两个值(NONE、PARTIAL),接下来我们来说一下FUll属性
在上面的一对多的案例下:
我们手动映射字段的情况下(未配置settings下 PARTIAL):
接下来注释掉手动映射:
在接下来我们设置<setting name="autoMappingBehavior" value="FULL"/>
Mybatis的缓存
更多缓存内容可以看mybatis一级缓存和二级缓存
一级缓存
一级缓存的声明周期存在在sqlSession中,
sqlSession关闭,缓存失效
二级缓存
注:以下文字来源原文地址
- eviction:缓存回收策略
LRU:最少使用原则,移除最长时间不使用的对象
FIFO:先进先出原则,按照对象进入缓存顺序进行回收
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极的移除移除基于垃圾回收器状态和弱引用规则的对象flushInterval:刷新时间间隔,单位为毫秒,这里配置的100毫秒。如果不配置,那么只有在进行数据库修改操作才会被动刷新缓存区
size:引用额数目,代表缓存最多可以存储的对象个数
readOnly:是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),
如果设置为false,则相同的sql,后面访问的是cache的clone副本。
可以在Mapper的具体方法下设置对二级缓存的访问意愿:
<select id="save" parameterType="XX" flushCache="true"
useCache="false"> </select>
如果没有去配置flushCache、useCache,那么默认是启用缓存的
flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。 在insert、update、delete语句时:
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
useCache属性在该情况下没有。update 的时候如果
flushCache=“false”,则当你更新后,查询的数据数据还是老的数据。
二级缓存测试成功!