### 前言
所谓关联查询,就是在一个查询里同时从多个表中取数据,然后组合在一起展示。要实现关联,至少需要两个表。
先看一下数据库的建表语句,这里准备了`teacher`和`student`两张表,用外键关联:
```sql
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS teacher;
CREATE TABLE teacher
(
tid int PRIMARY KEY auto_increment,
tname VARCHAR(30)
);
CREATE TABLE student
(
sid int PRIMARY KEY auto_increment,
sname VARCHAR(30),
age int,
tid int,
foreign key (tid) references teacher(tid)
);
```
对应的实体类也很直观。`Student`中除了自身字段,还增加了一个`Teacher`对象,方便后续关联查询时直接拿到老师信息:
```ja va
public class Student {
private Integer sid;
private String sname;
private Integer age;
private Teacher teacher;
// 自动生成 Getter、Setter、toString()、有参无参方法
}
```
```ja va
public class Teacher {
private Integer tid;
private String tname;
// 自动生成 Getter、Setter、toString()、有参无参方法
}
```
关于映射文件中几个关键标记,先记住三点:
1. 主键列用 `
` 标记
2. 普通列用 `` 标记
3. 关联查询的映射用 `` 或 `` 标记
下面开始正式介绍两种最常见的关联场景。
---
## 多对一关联 association
`` 标签用于描述一对一(或从“多”方角度的一对一)的关联关系。常见场景:多个学生属于同一个老师。
先在 `main/ja va` 中创建学生和老师的接口,以及对应的映射文件。映射文件的 `namespace` 必须是接口的完整限定名。
需求:查询所有学生,同时关联出对应的老师。所以学生接口中定义方法:
```ja va
public interface StudentMapper {
List queryAllStudents();
}
```
学生映射文件中,SQL 语句采用 SQL99 的 `JOIN` 写法:
```xml
```
写好 SQL 后,一定要先在 Na vicat 里跑一遍,确保语法无误。

这里有一个细节:查询结果中 `t.tid` 和 `tname` 这两列,在 `Student` 类里并没有对应的普通属性,而是属于 `teacher` 对象的。所以需要手动配置 `resultMap`,把这两列映射到 `teacher` 属性上。

最终的映射文件如下:
```xml
```
测试类也很好理解:获取 `StudentMapper`,直接调用 `queryAllStudents()`,然后循环打印结果即可。
```ja va
@Test
public void queryStudent() {
StudentMapper mapper = session.getMapper(StudentMapper.class);
List list = mapper.queryAllStudents();
for (Student student : list) {
System.out.println(student);
}
}
```

---
## 一对多关联 collection
`` 标签用于描述一对多的关联关系。比如一个老师对应多个学生。
需求:查询老师时,同时关联出该老师的所有学生。
首先修改 `Teacher` 的实体类,增加一个 `List` 属性——因为不确定有几个学生,用集合更合适:
```ja va
private List students;
// 生成Getter、Setter
```
老师接口中定义方法:
```ja va
List queryAllTeachers();
```
映射文件中,先写 SQL:
```xml
```
同样,先在 Na vicat 里验证。

接下来配置结果映射。因为返回的是 `Teacher`,并且需要把学生集合映射到 `students` 属性上,所以用 ``:
```xml
```
别忘了在 `
本文转载于:https://www.jb51.net/program/362716xx3.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。