MyBatis四

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语句执行了增删改操作,将会清空该二级缓存区域的数据

  • 二级缓存的开启与关闭:

    1. 在 SqlMapConfig.xml 文件开启二级缓存

      <settings>
      <!-- 开启二级缓存的支持 --> 
          <setting name="cacheEnabled" value="true"/>
      </settings>
    2. 配置相关的 Mapper 映射文件

      • 在映射文件中添加<cache></cache>
    3. 配置对应的想用二级缓存方法

      <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 基于注解的二级缓存

  1. 在主配置文件中配置二级缓存

    <settings>        
        <setting name="cacheEnabled" value="true"/>
    </settings>
  2. 在持久层接口中使用注解配置二级缓存

    @CacheNamespace(blocking=true)
    public interface IUserDao {}
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信