Mybatis的一级缓存

Mybatis的缓存: 提高查询效率

   查询数据 --> 发送sql语句--> 到数据库执行sql, 返回查询到的数据

Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,

第一次执行完毕会将数据库中查询的数据写到缓存(内存),

第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。

当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。

一级缓存图解

一级缓存区域是根据SqlSession为单位划分的。

每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。

Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句value为从查询出来映射生成的java对象,

sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域

代码:(执行一条sql语句)

@Test
    public void testCache1() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //下边查询使用一个SqlSession
        //第一次发起请求,查询id为1的用户
        User user1 = userMapper.findUserById(1);
        System.out.println(user1);
//        如果sqlSession去执行commit操作(执行插入、更新、删除),
清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读
//更新user1的信息 user1.setUsername("aa"); userMapper.updateUser(user1); //执行commit操作去清空缓存 sqlSession.commit(); //第二次发起请求,查询id为1的用户 User user2 = userMapper.findUserById(1); System.out.println(user2); sqlSession.close(); }

脏读: 读取的数据与数据库不一致.

原文地址:https://www.cnblogs.com/64Byte/p/13039554.html