MyBatis缓存介绍

MyBatis的缓存机制

缓存在实际开发项目中是非常重要的,我们开发一款产品对客户而言最终要的就是用户体验,当客户使用一款产品的时候除了最直观的的界面,接下来就是获取数据了,当获取数据十分缓慢,那么这个产品的用户体验就是很差的,也可以说这个产品是失败的,而常用的SSM框架中Mybatis就提供了缓存机制来缓存数据,它分为一级缓存(sqlswssion级)和二级缓存(mapper级):

  • 一级缓存(sqlswssion级)
    使用一级缓存的时候在操作数据库的时候,我们需要构造SqlSession对象,存储数据利用的是对象中的HashMap.
    那么缓存是如何来实现数据库性能的呢:当我们在同一个SqlSession对象中执行多次相同的sql语句,第一次执行会去数据库查找,完成之后会将查询到的数据保存到缓存中,当第二次执行相同查询时,就直接从缓存中读取数据,而不会在对数据库查询从而提高了效率,当执行DML操作时,SqlSeeion中缓存的数据会被清空,这是为了保证缓存中的数据是最新的,避免脏数据

注意:
Mybatis的缓存机制是基于id进行缓存的,以HashMap为容器,以对象的id作为key,对象作为value。
- 示例
假设有一个用户表t_user,我们向里面插入几条数据:aaa,男,22;bbb,男,19;ccc,男,20……
写一个测试类:
public class TestOneLevelCache{
public static void main(String args[]){
TestOneLevelCache t = new TestOneLevelCache();
t.testCache();
public void testCache(){
//使用工厂类获取SqlSession对象
SqlSession s = XxSqlSessionFactory.getSqlSession();
//获得usermapping对象
UserMapper u = s.getMapper(UserMapper .classs);
//查询id为1 的用户对象
User user = u.查询的方法名(1);
//输出user
……..
//再次定义一个user2执行相同操作并输出user2
…..
//最后关闭
s.close();
}
}
}
- 结果分析
查看打印结果发现第一个执行的查询方法打印出了Sql语句,但是第二次确没有打印。
- *新建一个示例TestOneLevelCache2
代码基本一样,在代码中加入了DML操作
public class TestOneLevelCache2{
public static void main(String args[]){
TestOneLevelCache t = new TestOneLevelCache();
t.testCache();
public void testCache(){
//使用工厂类获取SqlSession对象
SqlSession s = XxSqlSessionFactory.getSqlSession();
//获得usermapping对象
UserMapper u = s.getMapper(UserMapper .classs);
//查询id为1 的用户对象
User user = u.查询的方法名(1);
//输出user
……..
//执行一个DML操作
u.DML的方法名();
s.commit();
//再次定义一个user2执行相同操作并输出user2
…..
//最后关闭
s.close();
}
}
}
- 结果分析
我们可以看到:每个业务房发都生成了sql语句;注意:当没有s.commit();时,结果就会是TestOneLevelCache的结果
- 注意:
当我们先调用s.close();之后再次执行查询,执行结果依然有sql语句,这是因为关闭sqlsession对象之后,再去获取sqlsession对象的话是一个新的对象,里面没有数据缓存。
同时:在Mybatis中,一级缓存是默认开启的,不需要我们做任何配置。
- 二级缓存(mapper)
二级缓存()——————使用时是多个sqlsession对象使用同一个mapper的sql语句去操作数据库,得到的数据会存在二级缓存中。同样是HashMap存储。
mybatis的二级缓存要在setting中配置



在XML影射文件去开启:eg:UserMapper.xml

eviction 表示收回策略
例子跟前面基本类似,有兴趣的可以试试。。。。


猜你喜欢

转载自blog.csdn.net/qq_37659176/article/details/79374963