java取出缓存中得结果集,MyBatis 查询结果的缓存,

MyBatis 查询结果的缓存,

MyBatis的缓存指的是缓存查询结果,当以后使用相同的sql语句、传入相同的参数进行查询时,可直接从mybatis本地缓存中获取查询结果,而不必查询数据库。

mybatis的缓存包括一级缓存、二级缓存,一级缓存默认是开启的,二级缓存默认是关闭的。

一级缓存:

SqlSession级别,在SqlSession中有一个Map,key是由sql语句、参数等信息组成的唯一值,value是查询出来的结果对象。

二级缓存:

mapper级别,同一个namespace下的mapper,有一个Map。

de891cbb9843d17cc462a12b3204c130.png

二级缓存可以使这些sqlSession做到查询结果共享。

一级缓存

一级缓存默认是开启的。

User user1 = mapper.queryUserById(1);

User user2= mapper.queryUserById(1);

第一次查询时,就将查询结果放到一级缓存中。

如果后续使用的sql语句相同、传入的实参也相同,则结果对象也会相同,直接从一级缓存中获取结果对象,不再查询数据库。

User user1 = mapper.queryUserById(1);

sqlSession.commit();

User user2= mapper.queryUserById(1);

如果此sqlSession调用了commit()方法,会自动清空此sqlSession的一级缓存。

因为使用commit(),会将修改提交到数据库,下一次相同的查询,查询结果可能变了,之前的一级缓存不能再用,所以会自动清空。

User user1 = mapper.queryUserById(1);

HashMap map = new HashMap<>();

map.put("username", "张三");

map.put("id", 1);

mapper.updateUser(map);

User user2= mapper.queryUserById(1);

事实上,只要此sqlSession调用了、、这些会修改数据库的元素,就会清空此sqlSession的一级缓存,不管有没有使用commit()提交。

二级缓存

SqlSession sqlSession1 =MyBatisUtils.getSqlSession();

UserMapper mapper1= sqlSession1.getMapper(UserMapper.class);

User user1= mapper1.queryUserById(1);

System.out.println(user1);

SqlSession sqlSession2=MyBatisUtils.getSqlSession();

UserMapper mapper2= sqlSession2.getMapper(UserMapper.class);

User user2= mapper2.queryUserById(1);

System.out.println(user2);

不使用二级缓存,会执行2次查询。

二级缓存的使用步骤,此处以UserMapper为例:

(1)pojo类要是可序列化的

public class User implementsSerializable {//......

}

(2)在mybatis全局配置文件中开启二级缓存

二级缓存默认是关闭的,需要手动开启。

(3)在mapper映射文件中指定二级缓存的实现方式,必须显式指定

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT* FROM user_tb WHERE id=#{id}

UPDATE user_tb SET username=#{username} WHERE id=#{id}

完整写法:

type指定二级缓存的实现方式,缺省type时默认使用mybatis自带的perpetualCache。

(4)需要调用close()关闭sqlSession,才会将此sqlSession的查询结果(一级缓存)写入到二级缓存中

SqlSession sqlSession1 =MyBatisUtils.getSqlSession();

UserMapper mapper1= sqlSession1.getMapper(UserMapper.class);

User user1= mapper1.queryUserById(1);

System.out.println(user1);

sqlSession1.close();

SqlSession sqlSession2=MyBatisUtils.getSqlSession();

UserMapper mapper2= sqlSession2.getMapper(UserMapper.class);

User user2= mapper2.queryUserById(1);

System.out.println(user2);

只执行1次查询。后续使用相同sql语句、传入相同的实参进行查询时,直接从二级缓存中获取结果对象。

提交修改时,会清空整个二级缓存:

SqlSession sqlSession1 =MyBatisUtils.getSqlSession();

UserMapper mapper1= sqlSession1.getMapper(UserMapper.class);

User user1= mapper1.queryUserById(1);

System.out.println(user1);

HashMap hashMap = new HashMap<>();

hashMap.put("username", "j");

hashMap.put("id", 1);

mapper1.updateUser(hashMap);

sqlSession1.commit();

SqlSession sqlSession2=MyBatisUtils.getSqlSession();

UserMapper mapper2= sqlSession2.getMapper(UserMapper.class);

User user2= mapper2.queryUserById(2);

System.out.println(user2);

只写了commit()、实际没有调用 | | ,不会清空二级缓存,反而会将之前查询结果写入到二级缓存。

写了commit()、有调用 | | ,会清空整个二级缓存。

先后调用commit()、close(),不会写入二级缓存,因为commit()的存在,反而会清空整个二级缓存。

相关文章暂无相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值