一级缓存
- 一级缓存也叫本地缓存:SqlSession
- 与数据库同一次会话期间查询到的数据会放在本地缓存中。
- 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;
测试:
1.开启日志
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
2.测试在一个session中查询两次相同的日志
3.查看日志输出
代码演示
核心配置文件
<?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 resource="db.properties" />
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--可以给实体类取别名-->
<typeAliases>
<typeAlias type="com.tian.pojo.User" alias="User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.xml都需要在mybatis核心配置文件中注册!-->
<mappers>
<mapper class="com.tian.dao.UserMapper"/>
</mappers>
</configuration>
UserMapper
//根据id查询
User queryUserById(@Param("id") int id);
UserMapper.xml
<select id="queryUserById" resultType="User">
select * from user where id=#{id}
</select>
测试类
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user1 = userMapper.queryUserById(1);
System.out.println(user1);
System.out.println("--------------");
User user2 = userMapper.queryUserById(1);
System.out.println(user2);
System.out.println(user1==user2);
sqlSession.close();
}
运行结果
Opening JDBC Connection
Created connection 1026055550.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d285d7e]
==> Preparing: select * from user where id=?
==> Parameters: 1(Integer)
<== Columns: id, name, pwd
<== Row: 1, 狂神, 123456
<== Total: 1
User(id=1, name=狂神, pwd=123456)
--------------
User(id=1, name=狂神, pwd=123456)
true
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d285d7e]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3d285d7e]
Returned connection 1026055550 to pool.
缓存失效的情况
1.查询不同的东西
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user1 = userMapper.queryUserById(1);
System.out.println(user1);
System.out.println("--------------");
User user2 = userMapper.queryUserById(2);
System.out.println(user2);
System.out.println(user1==user2);
sqlSession.close();
}
⒉.增删改操作,可能会改变原来的数据,所以必定会刷新缓存!
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user1 = userMapper.queryUserById(1);
System.out.println(user1);
userMapper.updateUser(new User(1,"haha","123123"));
System.out.println("--------------");
User user2 = userMapper.queryUserById(1);
System.out.println(user2);
System.out.println(user1==user2);
sqlSession.close();
}
3.查询不同的Mapper.xml
4.手动清理缓存!
sqlSession.clearCache();//手动清理缓存
小结:
- 一级缓存默认是开启的,只在一次SqlSession中有效,也就是拿到连接到关闭连接这个区间段!