持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
mybaits提供一级缓存和二级缓存。默认开启一级缓存。
2. 一级缓存
第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。如果sqlSession去执行commit操作(执行插入、更新、删除),则清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。如果没有重复第一次查询操作。如下图。
测试代码
@Test\
public void testCacheOne() {\
//一级缓存基于SqlSession的\
//取出用户ID为7的用户\
Users u1 = mapper.getById(7);\
System.out.println("第一次访问数据库得到的u=" + u1);\
//再取一次,看看有没有访问数据库,就知道开没有开启一级缓存\
Users u2 = mapper.getById(7);\
System.out.println("第二次访问数据库得到的u=" + u2);\
}\
@Test\
public void testCacheOneClose() {\
//一级缓存基于SqlSession的\
//取出用户ID为7的用户\
Users u1 = mapper.getById(7);\
System.out.println("第一次访问数据库得到的u=" + u1);\
//关闭session,也会清除缓存\
session.close();\
//再取一次,看看有没有访问数据库,就知道开没有开启一级缓存\
session = factory.openSession();\
mapper = session.getMapper(UsersMapper.class);\
Users u2 = mapper.getById(7);\
System.out.println("第二次访问数据库得到的u=" + u2);\
}\
@Test\
public void testCacheOneCommit() {\
//一级缓存基于SqlSession的\
//取出用户ID为7的用户\
Users u1 = mapper.getById(7);\
System.out.println("第一次访问数据库得到的u=" + u1);\
\
//完成数据更新操作\
int num = mapper.update(new Users(38, "abc", new Date(), "1", "朝阳"));\
session.commit();\
System.out.println(num + "==================");\
\
Users u2 = mapper.getById(7);\
System.out.println("第二次访问数据库得到的u=" + u2);\
\
}