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);
}
开启二级缓存:
二级缓存提交:
整个重新加载一遍。