本文将向大家介绍 MyBatis 中的多表关联查询
主要通过两个示例来说明在 MyBatis 中如何实现 一对多,多对一 和 多对多 查询
第一个示例:老师和学生关联
老师和学生是一对多的关系,一名老师管教多名学生
学生和老师是多对一的关系,多名学生被一名老师管教
那么如何查询所有学生以及管教他们的老师呢?
又如何查询所有老师和他所管教的学生呢?
第二个示例:账户和课程关联
在网上选课系统中,账户和课程是多对多关系,
一个账户可以选择多门课程,而一门课程也可以被多个账户选择
那么如何查询账户以及此账户所选择的课程呢?
又如何查询课程以及选择这门课程的账户呢?
下面我们就来一步一步解决这两个问题吧
一、搭建测试环境(一对多和多对一)
(一)创建测试数据库
CREATE TABLE `t_teacher` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
CREATE TABLE `t_student` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`tid` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
(二)根据测试数据库创建实体类
-
学生类
package com.jarreet.test.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @NoArgsConstructor @AllArgsConstructor @ToString public class Student { private Integer id; private String name; private Integer tid; // 学生关联一个老师 private Teacher teacher; }
-
老师类
package com.jarreet.test.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Teacher {
private Integer id;
private String name;
// 老师关联一群学生
private List<Student> studentList = new ArrayList<>();
}
(三)文件配置
-
在 application.yml 配置 mybatis
mybatis: type-aliases-package: com.jarreet.test.pojo mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true
-
在 TestApplication 启动类上加上包扫描注解
@MapperScan("com.jarreet.test.dao")
二、多对一查询
我们根据上面搭建的环境,给出一个查询需求:查询所有学生的信息及他们的老师
(一)数据持久化层
-
StudentDao.java
package com.jarreet.test.dao; import com.jarreet.test.pojo.Student; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface StudentDao { public List<Student> getAllStudents(); }
-
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jarreet.test.dao.StudentDao"> <!-- 查询文章管理列表多对一配置 --> <resultMap id="studentAndTeacher" type="com.jarreet.test.pojo.Student"> <id property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="stid"/> <association property="teacher" javaType="com.jarreet.test.pojo.Teacher"> <id property="id" column="tid"/> <result property="name" column="tname"/> </association&g