未配置二级缓存时,查数据执行了两次(User的toString方法先删掉):
@Test
public void testFindOne() throws IOException{
SqlSession sqlSession = factory.openSession();
//使用sqlsession获取dao的代理对象
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
User user = userDao.findByID(41);
System.out.println(user);
// 释放一级缓存
sqlSession.close();
SqlSession sqlSession1 = factory.openSession();
//使用sqlsession获取dao的代理对象
IUserDao userDao1 = sqlSession1.getMapper(IUserDao.class);
user = userDao1.findByID(41);
System.out.println(user);
// 释放一级缓存
sqlSession.close();
}
1、配置配置文件,开启二级缓存,不过默认就是开启的,知道就得了,不用改:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<!-- 配置 properties 文件的位置 -->
<properties resource="jdbcConfig.properties"></properties>
<!--配置开启二级缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 配置别名的注册 -->
<typeAliases>
<package name="com.itheima.domain"/>
</typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置 mysql 的环境 -->
<environment id="mysql">
<!-- 配置事务的类型是 JDBC -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射信息 -->
<mappers>
<!-- 配置 dao 接口的位置,它有两种方式
第一种:使用 mapper 标签配置 class 属性
第二种:使用 package 标签,直接指定 dao 接口所在的包
-->
<package name="com.example.dao"/>
</mappers>
</configuration>
2、使用注解配置接口文件,使操作也支持二级缓存
结果只执行了一遍: