我们首先要知道mybatis中的一级缓存是在没有关闭session的时候,执行相同的select时候,二次以后的查询不会发送select语句至数据库,以减少对数据库的联机操作。
二级缓存是建立了2个session以后执行相同的select语句后依然也不会再数据库执行select语句,而内容依然从缓存中读取出来。
我们看一下如果使用mybatis的二级缓存;希望大家可以仔细阅读,里面有一些注意细节,这些细节对于初学者很有帮助。
(1)在mybatis的核心配置文件中开启二级环境配置
<settings>
<!--开启二级缓存的全局配置 -->
<setting name="cacheEnabled" value="true"/>
</settings>
(2)pojo映射类实现Serializable接口
package com.zxf.pojo;
import java.io.Serializable;
public class Employee implements Serializable{
private String emp_no;
private String emp_name;
private String dept_id;
private String emp_gender;
public String getEmp_gender() {
return emp_gender;
}
public void setEmp_gender(String emp_gender) {
this.emp_gender = emp_gender;
}
public String getDept_id() {
return dept_id;
}
public void setDept_id(String dept_id) {
this.dept_id = dept_id;
}
public String getEmp_name() {
return emp_name;
}
public void setEmp_name(String emp_name) {
this.emp_name = emp_name;
}
public String getEmp_no() {
return emp_no;
}
public void setEmp_no(String emp_no) {
this.emp_no = emp_no;
}
}
(3) Mapper数据库操作接口
public interface EmployeeMapper {
public List<Employee> getAll4();
}
(4) Mapper接口映射配置文件
<?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.zxf.mapper.EmployeeMapper">
<!--二级缓存 -->
<cache eviction="FIFO" flushInterval="6000" readOnly="false" size="1024"></cache>
<select id="getAll4" resultType="emp">
select <include refid="emp_1"/> from employee_basic
</select>
</mapper>
(5)测试类
@Test
public void test2() throws Exception{
InputStream is= Resources.getResourceAsStream("mybatis_config.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
SqlSession session1=factory.openSession();
SqlSession session2=factory.openSession();
EmployeeMapper mapper1 = session1.getMapper(EmployeeMapper.class);
EmployeeMapper mapper2=session2.getMapper(EmployeeMapper.class);
List<Employee> all_1 = mapper1.getAll4();
List<Employee> all_2 = mapper2.getAll4();
for(Employee e:all_1){
System.out.println(e.getEmp_name()+":"+e.getEmp_no());
}
session1.close();
/*
这里要记住一个地方,第二次查询必须要等第一次的session关闭以后才可以。
否则二级缓存没有作用,依然还会执行二次select语句发送至数据库
*/
for(Employee e:all_2){
System.out.println(e.getEmp_name()+"===>"+e.getEmp_no());
}
session2.close();
}
(6)运行结果1
运行结果2