mybatis 缓存

延迟加载

就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.

  • 开启延迟加载
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING" />
    <!--延迟加载相关-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
  • 修改连接
<resultMap id="userMap" type="user">
    <id column="id" property="id"/>
    <result column="username" property="username"/>
    <result property="address" column="address"/>
    <result property="birthday" column="birthday"/>
    <result property="sex" column="sex"/>
    <collection property="account" ofType="Account" select="wang.ismy.mybatis.dao.AccountDao.findById" column="id">
        <id column="account_id" property="id"/>
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
    </collection>
</resultMap>

使用的动态代理实现的延迟加载

缓存

批注 2020-05-18 103307

一级缓存

一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

命中原则:

  • statementId相同
  • 查询参数相同(hash的方式)
  • 分页参数
  • sql语句
  • 同一环境(environment属性)

生命周期:

缓存销毁:

  • session close
  • commit
  • clearCache主动清除

设计理念:

  • 不过期
  • 不更新
  • 不限制

二级缓存

二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

二级缓存中存放的是数据而不是对象

开启

  • 第一步:在 SqlMapConfig.xml 文件开启二级缓存
<!--默认为true,可以省略-->
<setting name="cacheEnabled" value="true"/>
  • 第二步:配置相关的 Mapper 映射文件
<cache/>
  • 第三步:配置 statement 上面的 useCache 属性
<select id="findAll" resultMap="userMap" useCache="true">
    SELECT * FROM user
</select>

命中原则

  • 同一 session factory
  • statement id 相同
  • 参数相同
  • environment 环境相同
  • sql session close 或 commit

生命周期

创建:

  • sql session close 或 commit

销毁:

  • sql session update

缓存清除策略

批注 2020-05-18 105408

results matching " "

No results matching " "

results matching " "

No results matching " "