mybatis的缓存2

原文:https://blog.csdn.net/qq_38274974/article/details/100898145

mybatis的缓存分为一级缓存、二级缓存
那么,我们为什么要使用缓存呢?
       对于经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,这样就大大降低了效率,所以这里就引入了缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据库的交互来提高效率,这就是缓存的优势。

一级缓存
       一级缓存是SqlSession级别的缓存(默认是支持一级缓存,不需要再配置文件中配置一级缓存),在操作数据库时,每个SqlSession类的实例对象中有一个数据结构(HashMap)可以用来存储缓存数据,不同的SqlSession类的实例对象缓存的数据区域(HashMap)是互不影响的。当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行sql直接从内存中获取。

public class MyBatisTest {
    //mybatis的一级缓存,是SqlSession级别的缓存,只有一个SqlSession对象。
    @Test
    public void test1(){
        SqlSessionFactory ssf=MyBatisUtil.getFactory();
        SqlSession session=ssf.openSession();
        UserMapper um1=session.getMapper(UserMapper.class);
        User user1=um1.selectbyid(1);
        System.out.println(user1.getUsername());
        //session.clearCache();//清理缓存
        //session.commit();//模拟增删改
        UserMapper um2=session.getMapper(UserMapper.class);
        User user2=um2.selectbyid(1);
        System.out.println(user2.getUsername());
        session.close();
    }
}

结果:

由此可见,因为缓存,只发生了一次与数据库的交互

如何清理缓存?

方法一:模拟增删改

session.commit();

方法二:调用clearCache()方法

session.clearCache();

 而清理缓存后:

二级缓存
       二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。对于访问多的查询请求且用户对查询结果实时性要求不高,此时便可采用mybatis的二级缓存。

 1.启动
在核心配置文件mybatis-config.xml中加入

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

2.调用实体类实现序列化接口

实现序列化接口的目的:
     ·为了将数据取出执行反序列化操作
     ·标记接口,打个标记,表示具有一些功能,可以被其它功能对象调用
     ·序列号有方法,可以将对象序列化成二进制文件,也可以将二进制文件反序列化成对象
3.在对应的mapper.xml中加入cache标签

4.测试

@Test
    public void test2(){
    //mybatis的二级缓存,是mapper级别的缓存,有多个SqlSession对象。
        SqlSessionFactory ssf=MyBatisUtil.getFactory();
        SqlSession session1=ssf.openSession();
        SqlSession session2=ssf.openSession();
        SqlSession session3=ssf.openSession();
        UserMapper um1=session1.getMapper(UserMapper.class);
        User user1=um1.selectbyid(1);
        System.out.println(user1.getUsername());
        session1.close();
        
        UserMapper um2=session2.getMapper(UserMapper.class);
        User user2=um2.selectbyid(1);
        System.out.println(user2.getUsername());
        session2.close();
        
        UserMapper um3=session3.getMapper(UserMapper.class);
        User user3=um3.selectbyid(1);
        System.out.println(user3.getUsername());
        session3.close();
    }

运行结果:

原文地址:https://www.cnblogs.com/lvchengda/p/12598103.html