Mybatis个人学习笔记(六)——延迟加载与缓存

延迟加载:

在真正使用数据时才发起查询,不用的时候不查询,按需加载。(懒加载)

举例:一个用户关联100个账户,查询用户时,是否需要把关联的账户信息全部查询出来?

立即加载:

举例:查询账户时,需要用到用户信息,则需要立即把关联的用户信息一起查询出来

只要以调用方法,立即发起查询

在对应的四种表关系中:

一对多,多对多:通常采用延迟加载

一对一,多对一:通常采用立即加载

实现延迟加载:

举例:IAcountDao.xml:实现查询账户时对用户信息的延迟加载(正常情形下不使用)

 <!-- 定义封装account和user的resultMap -->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="id"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!-- 一对一的关系映射:配置封装user的内容
        select属性指定的内容:查询用户的唯一标识:
        column属性指定的内容:用户根据id查询时,所需要的参数的值
        -->
        <association property="user" column="uid" javaType="user" select="com.itheima.dao.IUserDao.findById"></association>
    </resultMap>
   <!-- 查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        select * from account
    </select>
   <!-- 根据用户id查询账户列表 -->
    <select id="findAccountByUid" resultType="account">
        select * from account where uid = #{uid}
    </select>

IUserDao.xml实现查询用户时对多个账户信息的延迟加载

    <!-- 定义User的resultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置user对象中accounts集合的映射 -->
        <collection property="accounts" ofType="account" select="com.itheima.dao.IAccountDao.findAccountByUid" column="id"></collection>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="userAccountMap">
        select * from user
    </select>
  <!-- 根据id查询用户 -->
    <select id="findById" parameterType="INT" resultType="user">
        select * from user where id = #{uid}
    </select>

association标签对account类中的要延迟加载的User属性进行配置。

值得注意的是:Sql查询语句不再直接对两个表进行查询,而是仅对当前表查询,对相关表的查询则通过相关表映射文件里面的对应sql语句实现。

比如用户查询所有操作,会通过IUserDao中的findAll()先把用户表中的信息查询出来,然后在调用IAccountDao类的findAccountByUid()方法查询账户信息

 

主配置文件:

 <!--配置参数-->
    <settings>
        <!--开启Mybatis支持延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"></setting>
    </settings>

 

缓存:

存在于内存中的临时数据,目的是减少和数据库的交互次数,提高执行效率。适用于经常查询且不经常改变的数据,另外应保证数据的正确与否对最终的结果影响不大。

Mybatis的一级缓存与二级缓存:

一级缓存:SqlSession对象的缓存。(无须配置)

当执行查询操作后,查询结果存入到SqlSession提供的Map结构的一块区域。当再次查询同样数据时,Mybatis会先去SqlSession查询是否有,有则直接用。当调用修改,添加,删除或关闭SqlSession对象时,缓存清空。另外还可以主动调用clearcache()方法。

二级缓存:SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。

使用步骤:

1) 让Mybatis框架支持二级缓存(主配置文件)默认为true,可不配置

<settings>
    <setting name="cacheEnabled" value="true"/>
<settings>

2)让当前的映射文件支持二级缓存(映射文件)

<!--开启user支持二级缓存-->
<cache/>

3)让当前操作支持二级缓存(在select 标签中)

<!--useCache标签-->
 <select id="findAll" resultType="com.mbtest.domain.User" useCache="true">
            select * from userinfo
 </select>

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值