学习Mybatis之缓存机制

Mybatis提供了缓存功能,在查询的时候会将结果存入缓存,当以后查询的时候会先从缓存里面去找,找不到再到数据库里面找,这样就提高了查询的效率。

Mybatis对缓存分成了一二级缓存,效果是一样的,只是两个的作用域不同。

1.一级缓存:mybatis的默认启动项,作用域为同一个SqlSession对象,当一个SqlSession对象多次查询数据库的时候会先从缓存里面找。但是有一个前提:SqlSession不能被close,因为一旦被close之后,该SqlSession回话就失效了,也就没用了。还有一点,SqlSession对象执行了增删改操作的时候会刷新缓存,也就是以前的缓存就没了。

示例代码:一个SqlSession对同一条件查询两次,然后输出两个对象的hashcode值。

public User_Info selectByPrimaryKey(Integer id) {
    String statement = "cn.wzy.dao.User_InfoMapper.selectByPrimaryKey";
    SqlSession sqlSession = factory.openSession();
    System.out.println((sqlSession.selectOne(statement, id)).hashCode());
    return sqlSession.selectOne(statement, id);
}
测试代码:
@Test
public void selectByPrimaryKey() {
    User_Info user1 = dao.selectByPrimaryKey(1);
    System.out.println(user1.hashCode());
}

控制台输出:

hashcode值一样(hashcode值的规则未修改的情况哦),说明两个的结果是同一个。

2.二级缓存:作用域为所有的SqlSession对象,即所有的SqlSession查询过的数据都会存入二级缓存,但是必须SqlSession要提交事务,数据才会存入二级缓存,二级缓存为所有的SqlSession公用,即使一个SqlSession对象close了,它所加入的缓存也会依然存在。

示例代码:

public  User_Info selectByPrimaryKey(Integer id) {
     String statement =  "cn.wzy.dao.User_InfoMapper.selectByPrimaryKey" ;
     SqlSession sqlSession = factory.openSession();
     System.out.println((sqlSession.selectOne(statement, id)).hashCode());
     sqlSession.commit();
     sqlSession.close();
     SqlSession sqlSession1 = factory.openSession();
     System.out.println((sqlSession1.selectOne(statement, id)).hashCode());
     return  sqlSession1.selectOne(statement, id);
}

结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值