Mybatis 的一级缓存
1.创建 Mapper
@Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE name = #{name} limit 1") User selectOne(@Param("name") String name); @Select("SELECT * FROM user WHERE age = #{age}") List<User> selectList(@Param("age") Integer age); @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") int insert(@Param("name") String name, @Param("age") Integer age); }
测试数据
userMapper.insert("贝贝", 23); userMapper.insert("琪琪", 23); userMapper.insert("二狗", 23);
示例1:
userMapper.selectOne("贝贝"); userMapper.selectOne("贝贝"); userMapper.selectList(23);
总共发出了 3条请求,并且每个请求都会创建一个新的 sqlSession
示例2:
try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper2 = sqlSession.getMapper(UserMapper.class); userMapper2.selectOne("贝贝"); userMapper2.selectOne("贝贝"); userMapper2.selectList(23); sqlSession.commit(); }
公用一个 sqlSession,只发了 2条请求,其中第2个语句没有发请求(利用了 mybatis 一级缓存)
示例3:
@Transactional public void query() { userMapper.selectOne("贝贝"); userMapper.selectOne("贝贝"); userMapper.selectList(23); }
类似于示例2,只创建一个 sqlSession,并且第 2个语句依然直接使用了缓存
一级缓存可能会出现脏数据(旧缓存没有清除),可参考 聊聊MyBatis缓存机制
233