第四章 MyBatis的关联映射和缓存机制 作业答案
时间: 2025-06-11 12:55:02 浏览: 13
### MyBatis 第四章 关联映射与缓存机制解析
#### 一、关联映射的核心概念
MyBatis 提供了强大的 `resultMap` 功能来支持复杂对象之间的关系映射。这种映射可以通过一对一、一对多以及多对多的关系实现数据表间的连接操作[^1]。具体来说:
- **一对一映射**:适用于两个实体之间存在唯一对应关系的情况,例如订单和客户。
- **一对多映射**:用于描述一个父类拥有多个子类实例的情形,比如部门和员工。
- **多对多映射**:涉及中间表的场景下非常常见,例如学生选课。
为了完成上述映射,在 XML 文件中通常需要定义 `<association>` 或者 `<collection>` 节点,并指定外键字段作为条件进行匹配[^2]。
#### 二、缓存机制详解
MyBatis 支持两种类型的缓存——一级缓存和二级缓存。其中,一级缓存自动启用,而二级缓存则需显式配置才能生效。
##### (1) 一级缓存概述
一级缓存的作用范围仅限于单个 SqlSession 实例内部。当同一个 SqlSession 中重复执行相同的 SQL 查询时,如果未发生任何修改,则可以直接返回之前的结果集而不重新访问数据库[^3]。
##### (2) 二级缓存设计原理
相比之下,二级缓存覆盖整个 Mapper 层面,默认关闭状态。一旦激活之后,它允许不同线程间共享同一命名空间内的查询结果存储区。这意味着即使来自其他地方发起的新请求也可能利用已存在的高速缓冲副本而非再次调用底层物理磁盘读取动作[^2][^3]。
以下是启动二级缓存所需的几个关键步骤:
1. 修改全局 mybatis-config.xml 配置文件中的 settings 参数项,确保 cacheEnabled 设置为 true;
2. 在具体的 mapper xml 文档里加入 `<cache />` 声明节点或者通过 `<cache-ref namespace="otherMapperNamespace"/>` 方式引入外部定义好的公共缓存方案;
3. 可选项调整更多高级属性值如 eviction(驱逐算法), flushInterval(清理时间间隔秒数), size(最大条目数量限制),readOnly(true/false表示是否可序列化保存至硬盘文件系统上)[^3]。
下面给出一段简单的 Java 测试代码片段展示如何验证二级缓存效果:
```java
// 创建第一个 session 并加载数据
try(SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.getUserById(1)); // 输出第一次查得的对象信息
}
// 创建第二个独立 session 尝试获取同样 id 数据
try(SqlSession anotherSqlSession = sqlSessionFactory.openSession()) {
UserMapper userMapper = anotherSqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.getUserById(1)); // 此处应该直接命中二级缓存无需再发 db 请求
}
```
注意以上例子假设已经正确设置了相关环境变量并且确认目标方法满足只读特性才可能观察到预期行为变化情况。
---
阅读全文
相关推荐


















