一级缓存
一级缓存,在开启sqlSession后会自动开启,关闭sqlSession,就可以关闭一级缓存
1.查询相同的数据,不会刷新缓存
例子
public void getUserById (){ SqlSession sqlSession = sqlSessionFactory.getsqlSession(); userMapper mapper = sqlSession.getMapper(userMapper.class); user user1 = mapper.getUserById(2); System.out.println(user1); System.out.println("========="); user user2 = mapper.getUserById(2); System.out.println(user2); sqlSession.close(); }
结果
Opening JDBC Connection Created connection 454884231. Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87] ==> Preparing: select * from user where id=? ==> Parameters: 2(Integer) <== Columns: id, name, pwd <== Row: 2, 小落, 12341234 <== Total: 1 com.Google.pojo.user@19b89d4 ========= com.Google.pojo.user@19b89d4 Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87] Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87] Returned connection 454884231 to pool.
2.当执行 增 删 改 命令时,会刷新缓存
例子
public void getUserById (){ SqlSession sqlSession = sqlSessionFactory.getsqlSession(); userMapper mapper = sqlSession.getMapper(userMapper.class); user user1 = mapper.getUserById(2);//查找用户 System.out.println(user1); int i = mapper.updateUser(new user(2, "aaa", "bbb"));//修改用户 if(i>0){ sqlSession.commit(); }else{ sqlSession.rollback(); } System.out.println("========="); user user2 = mapper.getUserById(2); System.out.println(user2); sqlSession.close(); }
运行结果
Opening JDBC Connection Created connection 136393487. Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] ==> Preparing: select * from user where id=? ==> Parameters: 2(Integer) <== Columns: id, name, pwd <== Row: 2, 小落, 12341234 <== Total: 1 user(id=2, name=小落, pwd=12341234) ==> Preparing: update user set name = ?,pwd = ? where id=? ==> Parameters: aaa(String), bbb(String), 2(Integer) <== Updates: 1 ========= ==> Preparing: select * from user where id=? ==> Parameters: 2(Integer) <== Columns: id, name, pwd <== Row: 2, aaa, bbb <== Total: 1 user(id=2, name=aaa, pwd=bbb) Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] Returned connection 136393487 to pool.
这里我们可以清楚的看到,即使是查询两次相同的结果,缓存还是刷新了。这是因为更新了数据库,所有得强制刷新缓存,要不然,得到的数据就是旧数据
3.手动刷新缓存
public void getUserById (){ SqlSession sqlSession = sqlSessionFactory.getsqlSession(); userMapper mapper = sqlSession.getMapper(userMapper.class); user user1 = mapper.getUserById(2);//查找用户 System.out.println(user1); sqlSession.clearCache();//刷新缓存 System.out.println("========="); user user2 = mapper.getUserById(2); System.out.println(user2); sqlSession.close(); }
运行结果
Opening JDBC Connection Created connection 136393487. Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] ==> Preparing: select * from user where id=? ==> Parameters: 2(Integer) <== Columns: id, name, pwd <== Row: 2, aaa, bbb <== Total: 1 user(id=2, name=aaa, pwd=bbb) ========= ==> Preparing: select * from user where id=? ==> Parameters: 2(Integer) <== Columns: id, name, pwd <== Row: 2, aaa, bbb <== Total: 1 user(id=2, name=aaa, pwd=bbb) Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f] Returned connection 136393487 to pool.
这里用于手动刷新了缓存,所以出现了两个sql
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决