本文将阐述mybatis中的延迟加载。
1、环境约束
- win10 64位操作系统
- idea2018.1.5
- jdk-8u162-windows-x64
- mybatis3.2.8
- mysql 6.5
2、前提约束
- 完成mybatis一对一查询 https://www.jianshu.com/p/71ccf2f13f45 并且加入log4j.properties
3、操作步骤
3.1 一级缓存是默认的,所以直接进行一级缓存测试
//关键代码
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//下面这句语句执行的时候,在命令行中打印了sql语句,证明连接了数据库,执行了sql
List<Login> loginList = userMapper.selectLogin();
//下面这句语句执行的时候,在命令行中不会打印sql语句,证明没执行sql,用的是之前的缓存
List<Login> loginList1 = userMapper.selectLogin();
注意,update操作会使得缓存失效,下次查询还会先查询数据库。
3.2 配置和测试二级缓存
- 在pom.xml中加入依赖
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
- 修改mybatis-config.xml
<settings>
<setting name="cacheEnabled" value="true"></setting>
</settings>
- 在UserMapper.xml中增加以下内容
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
- 在resources文件夹中加入ehcache.xml
<ehcache>
<diskStore path="D:\cache_test" />
<defaultCache eternal="false" maxElementsInMemory="1000"
timeToIdleSeconds="20" timeToLiveSeconds="20" overflowToDisk="true"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="20" memoryStoreEvictionPolicy="LRU" />
</ehcache>
- 测试
//关键代码
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//获取session1
SqlSession session1 = sqlSessionFactory.openSession();
UserMapper userMapper = session1.getMapper(UserMapper.class);
User user1 = userMapper.findUserById(1);
session1.close();
//获取session2
SqlSession session2 = sqlSessionFactory.openSession();
UserMapper userMapper2 = session2.getMapper(UserMapper.class);
//使用session2执行第二次查询,由于开启了二级缓存这里从缓存中获取数据不再向数据库发出sql
User user2 = userMapper2.findUserById(1);
//关闭session2
session2.close();
注意,update操作会使得二级缓存失效,下次查询还会先查询数据库。
以上就是mybatis中一二级缓存的测试过程。