Mybatis缓存笔记(一级缓存、二级缓存)

Mybatis的概述和入门配置

Mybatis的配置优化和CRUD操作

Mybatis动态SQL语句

Mybatis的关联映射

Mybatis注解式开发

Mybatis缓存

1 Mybatis缓存概念

​ 用mybatis从数据库中查询数据,如果有多个用户使用同一个SQL语句来查询记录,得到相同的查询结果。如果表中记录很多,查询速度比较慢。使用缓存的目的就是为了提升查询的速度。缓存是内存中一个区域,保存已经查询过的记录。

​ 缓存的思想:把常用的查询结果数据存入到内存中,下次可以直接在内存中寻找使用。避免每次都查数据库。缓存是为了提高系统的性能,节约数据库的宝贵资源

在这里插入图片描述

2 一级缓存

一级缓存:默认是开启的,一次会话中的多次相同操作,只有第一次会去数据库查询,后续直接去缓冲中拿数据!

1.第1次查询记录,将查询到的数据写入到缓存中

2.第2次查询的时候,首先从缓存中去读取数据,如果缓存中有数据,直接返回,而不去访问数据库了

3.如果这个会话执行了添加,修改,删除,提交,会关闭清空当前会话的1级缓存

在这里插入图片描述

@Select("select * from user")
List<User> findAll();
@Test
public void query1(){
    // 1、获取与数据库的会话
    SqlSession sqlSession = MybatisSqlSessionFactoryUtils.getSqlSession();
    // 2、获取用户的数据访问层接口的代理对象,会自动找映射文件:UserMapper.xml文件
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    // 3、查询用户对象信息(目的是可以查询出1-1关联的身份证信息 )
    List<User> users = userMapper.findAll();
    for(User u : users){
        System.out.println(u.getUserName());
    }

    //sqlSession.commit(); // 提交也会清空一级缓存!
    System.out.println("------------------------------------");
    // 以下操作进一级缓存拿数据!
    List<User> users1 = userMapper.findAll();
    for(User u : users1){
        System.out.println(u.getUserName());
    }

    // 4、关闭会话
    MybatisSqlSessionFactoryUtils.close(sqlSession);
}

一级缓存效果如图,就是直接拿数据,不用再访问数据库。
在这里插入图片描述

一级缓存提交之后的效果:
在这里插入图片描述

3 二级缓存

默认是关闭的。
1.开启二级缓存配置:核心配置文件mybatis-config.xml

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

​ 2.如果是映射文件中的查询操作需要使用二级缓存,同学们直接在映射文件中上方加上 标签

 <cache/> <!-- 本映射文件中的全部查询将开启二级缓存!-->

​ 3.注解的方式实现二级缓存
@CacheNamespace //对注解下的接口中的全部查询实现二级缓存

4.增删操作也会清空二级缓冲

​ 注意:二级缓存的对象必须实现序列化接口,如果缓存的对象太多,Mybatis可以把对象缓存到文件中。

public class User implements Serializable

在这里插入图片描述

 @Test
    public void query2(){
        // 1、获取与数据库的会话
        SqlSession sqlSession = MybatisSqlSessionFactoryUtils.getSqlSession();
        // 2、获取用户的数据访问层接口的代理对象,会自动找映射文件:UserMapper.xml文件
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 3、查询用户对象信息(目的是可以查询出1-1关联的身份证信息 )
        List<User> users = userMapper.findAll();
        for(User u : users){
            System.out.println(u.getUserName());
        }
        sqlSession.close(); //会话关闭!!!

        System.out.println("-----------------------------------------------------");
        // 增删操作也会清空二级缓冲!!
//        SqlSession sqlSession2 = MybatisSqlSessionFactoryUtils.getSqlSession();
//        // 2、获取用户的数据访问层接口的代理对象,会自动找映射文件:UserMapper.xml文件
//        UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
//        userMapper2.deleteById(6);
//        sqlSession2.commit();
//        sqlSession2.close();


        System.out.println("------------------------------------");
        // 以下操作进一级缓存拿数据!
        // 1、获取与数据库的会话
        SqlSession sqlSession1 = MybatisSqlSessionFactoryUtils.getSqlSession();
        // 2、获取用户的数据访问层接口的代理对象,会自动找映射文件:UserMapper.xml文件
        UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
        // 3、查询用户对象信息(目的是可以查询出1-1关联的身份证信息 )
        List<User> users1 = userMapper1.findAll();
        for(User u : users1){
            System.out.println(u.getUserName());
        }
        sqlSession1.close(); //会话关闭!!!
    }

@CacheNamespace  //对注解下的接口中的全部查询实现二级缓存
public interface UserMapper {
    @Select("select * from user")
    List<User> findAll();

    @Delete("delete from user where id = #{xadfds}")
    void deleteById(int id);
}

开启二级缓存:
在这里插入图片描述

二级缓存提交:

在这里插入图片描述
整个重新加载一遍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值