mybatis 一级缓存
时间: 2025-02-24 17:30:24 浏览: 46
### MyBatis 一级缓存工作机制
#### 定义与作用范围
MyBatis 的一级缓存是指本地缓存,其作用范围仅限于 `SqlSession` 实例。这意味着当通过同一个 `SqlSession` 执行查询操作时,查询的结果会被保存在该会话的缓存中[^4]。
#### 生命周期管理
一级缓存的有效期贯穿整个 `SqlSession` 的生命周期,在此期间内保持有效;一旦 `SqlSession` 关闭或提交事务之后,缓存即被清空。因此,为了使缓存生效并减少不必要的数据库访问次数,建议在一个较短的时间窗口内重用同一 `SqlSession` 来执行相似的操作[^1]。
#### 缓存结构设计
内部采用哈希表(HashMap)形式存储数据项,其中键由查询语句及其参数构成,而对应的值则是实际获取的数据记录集合。这种映射关系使得后续相同请求可以直接命中已有条目而不必重复发起SQL指令给DBMS处理。
#### Cache接口及CacheKey定义
为了支持更复杂的场景需求,MyBatis 提供了一个抽象层——`Cache` 接口用于扩展不同的缓存策略实现类,并引入了专门的对象模型 `CacheKey` 表达唯一标识符以便精准定位所需资源位置。
```java
public interface Cache {
String getId();
int getSize();
void putObject(Object key, Object value);
Object getObject(Object key);
boolean hasKey(Object key);
void removeObject(Object key);
}
```
#### 使用示例代码展示
下面给出一段简单的Java程序片段来演示如何利用MyBatis框架中的默认一级缓存功能:
```java
// 创建一个新的 SqlSessionFactoryBuilder 对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = factory.openSession()) { // 获取一个可复用的 Session
UserMapper mapper = session.getMapper(UserMapper.class);
// 首次查询用户信息并将结果放入缓存
List<User> usersFirstTime = mapper.selectUsers();
System.out.println("第一次查询:");
for (User user : usersFirstTime) {
System.out.println(user.getName());
}
// 再次查询同样的数据集应该来自缓存而非数据库
List<User> usersSecondTime = mapper.selectUsers();
System.out.println("\n第二次查询(应从缓存加载):");
for (User user : usersSecondTime) {
System.out.println(user.getName());
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e.getCause());
}
```
阅读全文
相关推荐


















