MyBatis关联查询的实现
作者:慢热型
时间:2026-07-14
浏览:0
MyBatis中通过association实现多对一、collection实现一对多关联映射,使用resultMap解决字段名差异,结合JOIN完成多表查询。三表连接案例展示了套餐、明细与检查项的嵌套关联。
### 前言
所谓关联查询,就是在一个查询里同时从多个表中取数据,然后组合在一起展示。要实现关联,至少需要两个表。
先看一下数据库的建表语句,这里准备了`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
```
别忘了在 `
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
win10笔记本外出联网如何阻止自动下载更新包
2026-10-06 11:33
photoshop智能对象不能直接编辑
2026-10-05 13:52
3dmax动画制作教程视频零基础入门步骤讲解
2026-09-23 12:06
CPU硅脂涂抹方法图解及正确操作步骤
2026-09-22 15:23
网易2026年Q2财报:营收301亿元,游戏收入增10%,三款重点新游披露进展
2026-09-08 17:51
上一篇:
Golang在Linux中的性能怎样优化
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多










































