第四章 MyBatis的关联映射和缓存机制
MyBatis的关联映射是指将多个表之间的关联关系映射到Java对象之间的关联关系,从而方便进行复杂的数据库操作。关联映射可以分为一对一、一对多、多对一和多对多四种类型。
MyBatis的缓存机制是指将查询结果缓存到内存中,下次查询相同的数据时可以直接从缓存中读取,从而提高查询效率。MyBatis的缓存机制分为一级缓存和二级缓存两种。
关联映射和缓存机制的作用是提高MyBatis的查询效率,特别是在进行复杂的数据库操作时更为明显。同时也可以降低数据库的压力,提高系统的稳定性和性能。
4.1 关联映射概述
一对一关联映射是指两个表之间只有一条关联记录,例如一个人只有一个身份证。一对多关联映射是指一个表中的一条记录可以对应另一个表中的多条记录,例如一个部门可以有多个员工。多对一关联映射是指多条记录可以对应另一个表中的一条记录,例如多个员工属于同一个部门。多对多关联映射是指两个表之间有多条关联记录,例如一个学生可以选修多门课程,一门课程也可以被多个学生选修。
在Java对象中,可以使用以下方式表示不同的关联关系:
一对一关联:使用一个对象作为属性表示关联对象,例如一个部门对象中包含一个负责人对象。
public class Department {
private Integer id;
private String name;
private Employee manager; // 一对一关联,部门的负责人
// 省略getter和setter方法
}
public class Employee {
private Integer id;
private String name;
private Department department; // 一对一关联,员工所在的部门
// 省略getter和setter方法
}
一对多关联:使用一个集合作为属性表示关联对象列表,例如一个部门对象中包含多个员工对象。
public class Department {
private Integer id;
private String name;
private List<Employee> employees; // 一对多关联,部门的员工列表
// 省略getter和setter方法
}
public class Employee {
private Integer id;
private String name;
private Department department; // 一对一关联,员工所在的部门
// 省略getter和setter方法
}
多对多关联:使用一个集合作为属性表示关联对象列表,例如一个学生对象中包含多个课程对象,一个课程对象中也包含多个学生对象。
public class Student {
private Integer id;
private String name;
private List<Course> courses; // 多对多关联,学生选修的课程列表
// 省略getter和setter方法
}
public class Course {
private Integer id;
private String name;
private List<Student> students; // 多对多关联,选修该课程的学生列表
// 省略getter和setter方法
}
需要注意的是,在进行关联映射时,Java对象的属性名称应与数据库中的字段名保持一致。如果不一致,可以通过MyBatis的映射配置来指定映射关系。
一级缓存是指在同一个SqlSession中进行的查询会话,MyBatis会将查询结果缓存到内存中,下次查询相同的数据时可以直接从缓存中读取。一级缓存是默认开启的,可以通过配置文件进行关闭。二级缓存是指在多个SqlSession之间共享查询结果缓存,可以提高查询效率。二级缓存需要在MyBatis的配置文件中进行配置,支持多种缓存实现方式,例如内存缓存、Redis缓存等。
4.2 一对一查询
在现实生活中,一对一关联关系是十分常见的。例如一个人只能有一个身份证,同时一个身份证也只对应一个人。人与身份证之间的关联关系如图4-3所示。在MyBatis中,通过<association>元素来处理一对关联关系。<association>元素提供了一系列属性用于维护数据表之间的关系。

<association>元素的属性如下:
<association>元素用于处理一对一关联关系的映射。其作用是将两个实体类之间的一对一关联关系映射到数据库中,方便进行查询、插入、更新和删除等操作。
以下是<association>元素的所有属性:
属性名 |
描述 |
property |
当前实体类中与关联实体类相关联的属性名 |
javaType |
关联实体类的类型 |
resultMap |
关联实体类对应的结果集映射,可以嵌套使用 |
select |
关联查询语句,查询结果必须是一条记录,将结果映射到关联实体类 |
column |
当前实体类中的属性在数据库中对应的字段名 |
notNullColumn |
当前实体类中的属性在数据库中对应的字段名,不能为null |
foreignColumn |
关联实体类在数据库中对应的字段名 < |