MyBatis四
Mybatis 延迟加载
什么是延迟加载?
- 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
- 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
- 坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
一般对于对多查询时使用延迟加载,而对于对一查询时不使用延迟加载。
如:之前的查找用户对应的账户操作时可以使用延迟加载,提高性能
映射文件配置:
<resultMap type="account" id="accountMap"> <id column="aid" property="id"/> <result column="uid" property="uid"/> <result column="money" property="money"/> <!-- 它是用于指定从表方的引用实体属性的 --> <association property="user" javaType="user"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="birthday" property="birthday"/> <result column="address" property="address"/> </association> </resultMap>
SQL语句:
SELECT u.*, acc.id id, acc.uid, acc.money FROM user u LEFT JOIN account acc ON u.id = acc.uid
开启延迟加载后的映射文件:
<resultMap type="account" id="accountMap"> <id column="aid" property="id"/> <result column="uid" property="uid"/> <result column="money" property="money"/> <!-- 它是用于指定从表方的引用实体属性的 --> <association property="user" javaType="user" select="com.itheima.dao.IUserDao.findById" column="uid"> </association> </resultMap> <select id="findAll" resultMap="accountMap"> select * from account </select>
如何开启延迟加载
在主配置文件中设置
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
Mybatis 缓存
像大多数的持久化框架一样,Mybatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能。
Mybatis 中缓存分为一级缓存,二级缓存。
一级缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。
一级缓存中存放的是实体类对象。
二级缓存
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
一级缓存中存放的是数据。
共享二级缓存的对象中如果有一个对象对二级缓存所对应的sql语句执行了增删改操作,将会清空该二级缓存区域的数据
二级缓存的开启与关闭:
在 SqlMapConfig.xml 文件开启二级缓存
<settings> <!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/> </settings>
配置相关的 Mapper 映射文件
- 在映射文件中添加
<cache></cache>
- 在映射文件中添加
配置对应的想用二级缓存方法
<select id="findById" resultType="user" parameterType="int" useCache="true"> select * from user where id = #{uid} </select>
Mybatis 注解开发
mybatis 的常用注解说明
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
使用注解进行一对一查询时,可在@Results对应的@Result中配置,如:
@Result(column="uid", property="user", one=@One(select="com.itheima.dao.IUserDao.findById", fetchType=FetchType.EAGER) )
使用注解一对多查询时,可在@Results对应的@Result中配置,如:
@Result(column="id",property="accounts", many=@Many( select="com.itheima.dao.IAccountDao.findByUid", fetchType=FetchType.LAZY ) )
mybatis 基于注解的二级缓存
在主配置文件中配置二级缓存
<settings> <setting name="cacheEnabled" value="true"/> </settings>
在持久层接口中使用注解配置二级缓存
@CacheNamespace(blocking=true) public interface IUserDao {}