第三课 关于MyBatis的映射,懒加载,缓存

映射

在使用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来设置属性与字段之间的关系。

关联查询
一对一关联
  1. 现在实体类中添加关联对象
Staff.java
// 所属部门  一对一关联
private Dept dept;

  1. 在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>
  1. 在需要使用映射的Select语句上添加resultMap的配置
<select id="selectAll" resultMap="staff">
	select * from staff
</select>
一对多关联
  1. 现在实体类中添加关联对象
// Dept.java
// 一下部门下可以有很多员工
// 一对多
private List<Staff> staffs;
  1. 在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>
  1. 在需要使用映射的Select语句上添加resultMap的配置
<select id="selectAll" resultMap="dept">
	select * from dept
</select>
关联类型
  1. 一对一:使用MyBatis的两个单向的一对一描述。
  2. 一对多:使用一个一对多和一个一对一描述。
  3. 多对多:使用两个一对多描述。

懒加载

在使用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"/>

配置二级缓存:

  1. evication:缓存数据的清除策略。

LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

  1. flushInterval:设置缓存刷新的时间。单位是毫秒

  2. size:大小,按照缓存的引用数。

  3. readOnly:设置只读,缓存中的数据是不能修改的。

注意:

二级缓存在缓存对象时,需要序列化,必须要求实体类实现Serializable接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值