区别
一级缓存(Local Cache)的作用域:一个SqlSession(底层是hashmap,线程不安全,所以每个Sqlsession不会共享一级缓存)
二级缓存(Second Level Cache)的作用域:namespace(底层是LinkedHashMap,线程安全,不同的SqlSession可以共享二级缓存)
Mybatis中缓存原理简图如下
Demo
package com.cy.pj.sys.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cy.pj.sys.entity.SysRole;
@SpringBootTest
public class DaoMemoryTests {
@Autowired
private SqlSessionFactory sqlSessionFactory;
//MyBatis一级缓存测试
//特点:默认开启,不可以跨SqlSession共享。
@Test
public void testFirstLevelCache() {
//1.获取sqlSession对象(DefaultSqlSession-线程不安全)
SqlSession sqlSession=sqlSessionFactory.openSession();
System.out.println("sqlSession="+sqlSession);
//2.执行查询操作
String statement="com.cy.pj.sys.dao.SysRoleDao.findPageObjects";
Map<String,Object> parameterMap=new HashMap<>();
parameterMap.put("name", "");
parameterMap.put("startIndex", 0);
parameterMap.put("pageSize", 3);
List<SysRole> list=sqlSession.selectList(statement, parameterMap);
System.out.println("list.size="+list.size());
//使用同一个sqlSession执行同样的查询,第二查询会从cache中获取。
list=sqlSession.selectList(statement, parameterMap);
System.out.println("list.size="+list.size());
//3.释放资源
sqlSession.close();
}
@Test
public void testSecondLevelCache() {
doQueryRoles();
doQueryRoles();
}
private void doQueryRoles() {
//1.获取sqlSession对象(DefaultSqlSession-线程不安全)
SqlSession sqlSession=sqlSessionFactory.openSession();
System.out.println("sqlSession="+sqlSession);
//2.执行查询操作
String statement="com.cy.pj.sys.dao.SysRoleDao.findPageObjects";
Map<String,Object> parameterMap=new HashMap<>();
parameterMap.put("name", "");
parameterMap.put("startIndex", 0);
parameterMap.put("pageSize", 3);
List<SysRole> list=sqlSession.selectList(statement, parameterMap);
System.out.println("list.size="+list.size());
//3.释放资源
sqlSession.close();
}
}
关于Mybatis使用的模式
~装饰模式: