映射
在使用MyBatis时,只需要定义Mapper接口,不需要编写实现类,而是通过xml或注解的方式指定接口方法的行为,这就是动态Mapper
MyBatis的底层是基于反射,动态代理。
SQL标签
在配置SQL语句时,根据SQL语句不同使用不同的标签
insert
<insert id="方法名" paramenterType="参数的类型" >
SQL语句
</insert>
获取数据库的自增主键
<insert id="方法名" paramenterType="参数的类型"
useGeneratedKeys="true"
keyColmun="数据表主键字段名"
keyProperty="实体类属性名"
>
SQL语句
</insert>
delete
update
select
<select id="方法名" paramenterType="参数的类型" resultType="返回数据的类型" resultMap="返回数据的映射">
SQL语句
</select>
参数验证
#{}参数的绑定:
{}可以是参数的名字,也可以是参数的属性。
针对于简单类型(基本数据类型及其包装类,字符串),{}写啥都行。
可以避免SQL注入。
${}字符串的拼接 :{}只能说参数的属性,存在SQL注入
sql 片段
就是一段可复用的SQL语句,使用include标签引入。
高级映射
默认情况下, 使用resultType设置查询方法的返回结果的类型,MyBatis底层会使用反射创建对象,注入属性值。
比如实体类的属性名与数据表的字段不一样。此时就需要使用resultMap来设置属性与字段之间的关系。
关联查询
一对一关联
- 现在实体类中添加关联对象
Staff.java
// 所属部门 一对一关联
private Dept dept;
- 在Mapper的映射文件中添加resultMap的配置
<!-- 定义一个映射 -->
<resultMap type="com.situ.entity.Staff" id="staff">
<!-- 主键的映射 -->
<id column="id" property="id"/>
<!-- 将数据表中joinTime映射成实体类的joinDate -->
<result column="joinTime" property="joinDate"/>
<!-- 一对一的关联查询
根据deptId, 调用 DeptMapper中的selectById()的方法
-->
<association column="deptId" property="dept"
select="com.situ.dao.DeptMapper.selectById">
</association>
</resultMap>
- 在需要使用映射的Select语句上添加resultMap的配置
<select id="selectAll" resultMap="staff">
select * from staff
</select>
一对多关联
- 现在实体类中添加关联对象
// Dept.java
// 一下部门下可以有很多员工
// 一对多
private List<Staff> staffs;
- 在Mapper的映射文件中添加resultMap的配置
<!-- 声明一个映射 -->
<resultMap type="com.situ.entity.Dept" id="dept">
<!-- 映射ID -->
<id column="id" property="id"></id>
<!-- 一对多关联查询,当前部门下的所有的员工 -->
<collection column="id" property="staffs" ofType="com.situ.entity.Staff"
select="com.situ.dao.StaffMapper.selectByDeptId"></collection>
</resultMap>
- 在需要使用映射的Select语句上添加resultMap的配置
<select id="selectAll" resultMap="dept">
select * from dept
</select>
关联类型
- 一对一:使用MyBatis的两个单向的一对一描述。
- 一对多:使用一个一对多和一个一对一描述。
- 多对多:使用两个一对多描述。
懒加载
在使用MyBatis的关联查询时,如果开启懒加载,当关联的数据不需要使用时,不会加载这些数据。
默认情况下,MyBatis的懒加载是关闭的,需要在核心配置文件中开启全局的懒加载。
<!-- 设置 -->
<settings>
<!-- 打开全局的懒加载开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
也可以关联查询上单独设置懒加载
fetchType="eager/lazy"
缓存
在MyBatis中为了进一步提升查询效率,还引入了缓存机制。
缓存主要针对的是查询操作。将查询过的数据保存到内存中,如果再有相同的查询,则直接从内存中读取,而不需要再次查询数据库。
一级缓存:是session中的缓存,作用域是同一个session上,当同一个session执行相同的sql语句(参数,SQL都一样)时,从缓存中读取,不需要再次查询。默认情况下一级缓存是开启的。
二级缓存:是Mapper中的缓存,Mapper缓存是全局的缓存,在多个Session上都是有效的,默认情况下二级缓存是关闭的。
二级缓存的群居开关在核心配置中。
//打开全局的二级缓存
<setting name ="cacheEnabled" value="true"/>
在Mapper中使用cache的换标签打开当前Mapper的二级缓存。
<!-- 开启二级缓存 -->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
配置二级缓存:
- evication:缓存数据的清除策略。
LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
-
flushInterval:设置缓存刷新的时间。单位是毫秒
-
size:大小,按照缓存的引用数。
-
readOnly:设置只读,缓存中的数据是不能修改的。
注意:
二级缓存在缓存对象时,需要序列化,必须要求实体类实现Serializable接口。