缓存
缓存的重要性是不言而喻的。 使用缓存, 我们可以避免频繁的与数据库进行交互, 尤其是在查询越多、缓存命 中率越高的情况下, 使用缓存对性能的提高更明显。
mybatis 也提供了对缓存的支持, 分为一级缓存和二级缓存。 但是在默认的情况下, 只开启一级缓存。
一级缓存
缓存的原理
在同一个 SqlSession 中, Mybatis 会把执行的方法和参数通过算法生成缓存的键值, 将键值和结果存放在一个 Map 中, 如果后续的键值一样, 则直接从 Map中获取数据;
缓存的开启:
默认开启
缓存的生命周期
- 在一个 SqlSession 生命周期中有效. SqlSession 关闭, 缓存清空;
- 不同的 SqlSession 之间的缓存是相互隔离的;
缓存的清空:
- 用一个 SqlSession,可以通过配置使得在查询前清空缓存;在具体xml文件的select语句中使用flushCache=“true” 就能
- 任何的 UPDATE, INSERT, DELETE 语句都会清空缓存
缓存的注意点
线程级别的缓存, SqlSession 的缓存;
具体例子:
UserMapper接口
package com.xxxx.mappers;
import com.xxxx.pojo.User;
import java.util.List;
//测试一级缓存
public interface UserMapper {
//查询所有的数据
List<User> queryAll();
}
UserMapper.xml (如果在下面的select标签中 使用了属性 flushCache=“true” 那么会清空缓存,第二次就不会使用缓存)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxxx.mappers.UserMapper">
<!--测试一级缓存-->
<select id="queryAll" resultType="user"> <!-- flushCache="true"-->
select username,password from t_user
</select>
</mapper>
测试:这里可以看到使用了缓存查询,所以第二次查询没有打印出日志的sql
(必须要使用同一个Session并且调用的是同一个方法才有一级缓存)
package com.xxxx.test;
import com.xxxx.mappers.UserMapper;
import com.xxxx.pojo.User;
import com.xxxx.utils.SessionUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
/*
一级缓存: 默认开启 SqlSession
*/
public class CacheDemo02 {
public static void main(String[] args) {
SqlSession session = SessionUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
System.out.println("--------------默认开启一级缓存----------------");
System.out.println("--------------第一次查询----------------");
List<User> list = mapper.queryAll();
list.forEach(System.out::println);
System.