Mybatis延迟加载与缓存

总结

Posted by Will Wang on September 3, 2018
  • 延迟加载
    • 第一步:在核心配置文件SqlMapConfig.xml
        <settings>
            <setting name="lazyLoadingEnabled" value="true"  />
            <setting name="aggresiveLazyLoading" value="false"  />
        </settings>
      
    • 第二步:
      1. 一对一(多对一) IAccountDao.xml ```xml
        与IUserDao.xml的映射文件
        ```xml
        <select id="findUserById2" parameterType="int" >
            select * from user where id=#{aaa}
        </select>
      
    1. 一对多(多对多) IUserDao.xml
       <resultMap type="user">
           <id column="id2" property="id" />
      
           <collection property="accountList" ofType="cn.flyingd.domain.Account" 
               javaType="java.util.List"  
               column="id2" select="cn.flyingd.dao.IAccountDao.findAccountsByUid2"
           ></collection>
       </resultMap>
      

      IAccountDao.xml

       <select id="findAccountsByUid2" parameterType="int">
           select * from account where uid = #{aaa}
       </select>
      
    • 延迟加载:
      • 基于性能的考虑,查询A对象的时候,要不要把A关联的B对象,或者是List集合对象查出来。
      • 当然,有些情况下,还必须得用立即加载,比如说商品详情。
  • 缓存,Mybatis默认支持一级缓存、二级缓存(企业中不用)
    • 一级缓存,其实就是SqlSession级别的缓存
        IUserDao userDao = sqlSession.getMapper(IUserDao.class);
        User user1 = userDao.findById(41);
        User user2 = userDao.findById(41);
        此时只发一条sql语句并且user1与user2是同一个对象一级缓存缓存的是对象
      

      ``` IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user1 = userDao.findById(41); sqlSession 增、删、改 sqlSession.clearCache(); User user2 = userDao.findById(41); 此时只发两条sql语句,并且user1与user2不是同一个对象

    IUserDao userDao = sqlSession.getMapper(IUserDao.class); User user1 = userDao.findById(41); sqlSession.close();

    sqlSession = sqlSessionFacotry.openSession(); userDao = sqlSession.getMapper(IUserDao.class); User user2 = userDao.findById(41); 此时只发两条sql语句,并且user1与user2不是同一个对象

      - 二级缓存,其实就是SqlSessionFactory级别的缓存
      ```xml
      第一步:在核心配置文件SqlMapConfig.xml配置
      	<settings>
      		<setting name="cacheEnabled" value="true" />
      	</settings>
      第二步:在IUserDao.xml映射文件中使用二级缓存
      	<cache />
      	<select id="" parameterType="" useCache="true">
      		select ...
      	</select>
    
      IUserDao userDao = sqlSession.getMapper(IUserDao.class);
      User user1 = userDao.findById(41);
      sqlSession.close();
        
      sqlSession = sqlSessionFacotry.openSession();
      userDao = sqlSession.getMapper(IUserDao.class);
      User user2 = userDao.findById(41);
      此时只发一条sql语句并且user1与user2不是同一个对象
      为什么不是同一个对象因为二级缓存中缓存的数据本身而不是缓存对象