mybatis-demo04-延迟和缓存

一、Mybatis 延迟加载策略
理解:在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
1.在 SqlMapConfig.xml 文件中添加延迟加载的配置

<settings>  
 <setting name="lazyLoadingEnabled" value="true"/> 
  <setting name="aggressiveLazyLoading" value="false"/>
 </settings> 
<!-- collection 是用于建立一对多中集合属性的对应关系    
	ofType 用于指定集合元素的数据类型 
   select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)  
     column 是用于指定使用哪个字段的值作为条件查询    --> 
  <collection property="accounts" ofType="account"    
    select="IAccountDao.findByUid"     column="id">   </collection>

二、Mybatis 缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。

配置xml文件可以省略
 <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

验证

 /**
     * 判断一级缓存是否存在
     * @throws IOException
     */
    @Test
    public void OneLevelCache() throws IOException{
    
    
      user users = iuserDao.FindById(41);
        System.out.println(users);
        user  users1 = iuserDao.FindById(41);
        System.out.println(users1);
        System.out.println(users1==users);
        //true
    }

    /**
     * 把一级缓存关掉后,看看什么情况
     * @throws IOException
     */
    @Test
    public void OneLevelCache1() throws IOException{
    
    
        user users = iuserDao.FindById(41);
        System.out.println(users);
     /*   sqlSession.close();//关掉建造的对象
        sqlSession = factory.openSession();//重新打开
       */
        sqlSession.clearCache();//清除掉缓存
        iuserDao= sqlSession.getMapper(IuserDao.class);
        user users1 = iuserDao.FindById(41);
        System.out.println(users1);
        System.out.println(users1==users);//false 与上面不一样

    }

    /**
     * 更行后数据如何查找
     * @throws IOException
     */
    @Test
    public void uptateCache1() throws IOException{
    
    
        user  user1 = iuserDao.FindById(41);
        user1.setUsername("张三");
        user1.setAddress("南京");
        iuserDao.updateById(user1);
        System.out.println(user1);
        user  users1 = iuserDao.FindById(41);
        System.out.println(users1==user1);//false 与上面不一样

    }

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

<settings> 
 <!-- 开启二级缓存的支持 -->
   <setting name="cacheEnabled" value="true"/> </settings>

因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为 false 代表不开启二级缓存。
第二步:配置相关的 Mapper 映射文件 ,配置 statement 上面的 useCache 属性

<mapper namespace="dao.IuserDao">

    <cache/>
    <select id="FindById" resultType="user" parameterType="int" useCache="true">
      SELECT *FROM USER where  id = #{
    
    id};
    </select>
    </mapper>

将 UserDao.xml 映射文件中的标签中设置 useCache=”true”代表当前这个 statement 要使用 二级缓存,如果不使用二级缓存可以设置为 false。 注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
测试:
public class secendCache {
private IuserDao iuserDao =null;
private InputStream is=null;
private SqlSessionFactory factory=null;
@Before
public void init()
{
is = Resources.class.getResourceAsStream("/X1sqlMybatisConfig.xml");
//2.创建SqlSessionFactory工厂 mybatis使用了构建者模式(类似工厂)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
}
@After
public void destory() throws IOException {

    is.close();
}

/**
 * 判断er级缓存是否存在
 * @throws IOException
 */
@Test
public void Cache() throws IOException{
    SqlSession sqlSession = factory.openSession();
    IuserDao iuserDao = sqlSession.getMapper(IuserDao.class);
    user user = iuserDao.FindById(41);
    System.out.println(user);
    sqlSession.close();

    SqlSession sqlSession1 = factory.openSession();
    IuserDao iuserDao1= sqlSession1.getMapper(IuserDao.class);
    damain.user user1 = iuserDao1.FindById(41);
    System.out.println(user1);
    sqlSession1.close();
    System.out.println(user==user1);

}

}

猜你喜欢

转载自blog.csdn.net/weixin_46809332/article/details/115585225
今日推荐