欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis多表查询--多对多操作(选课示例)

程序员文章站 2022-07-12 23:20:46
...

需求描述
Mybatis是一个优秀的持久层框架,利用Mybatis可以实现对数据库的多表查询操作,假设有两个实体类,分别是学生实体类和课程实体类,它们之间是多对多的关系,即一个学生可以选多门课程,而一门课程可以被多个学生选择。属性如下:

学生表

字段属性 类型 备注
studentId int 学生ID,主键
studentName varchar 学生姓名
studentAge int 学生年龄

课程表

字段属性 类型 备注
courseId int 课程ID,主键
courseName varchar 课程名称

中间表

字段属性 类型 备注
sid int 学生ID
cid int 课程ID

其中主键为(学生ID+课程ID),它们又分别是外键。

数据库信息

Mybatis多表查询--多对多操作(选课示例)
要求一:查询所有的学生信息以及各自的选修课程

student实体类

 private int studentId;
 private String studentName;
 private int studentAge;
 private List<Course>list;

studentDao接口

 /**
 * 查询所有的学生信息,并且加上所选的课程
 */
public List<Student> findAll();

XML文件

<resultMap id="studentMap" type="student">
    <id column="studentId" property="studentId"></id>
    <result property="studentName" column="studentName"></result>
    <result property="studentAge" column="studentAge"></result>
    <collection property="list" ofType="course">
        <id column="courseId" property="courseId"></id>
        <result property="courseName" column="courseName"></result>
    </collection>
</resultMap>

<select id="findAll" resultMap="studentMap">
  select * from student left outer join sc on student.studentId=sc.sid left outer join course on course.courseId=sc.cid;
</select>

测试类

@Test
public void findAll(){
   List<Student> list=studentDao.findAll();
   for(Student student:list){
       System.out.println(student);
   }
}

结果

Mybatis多表查询--多对多操作(选课示例)

要求二:查询所有的课程信息以及所对应所有的选修信息

course实体类

private int courseId;
private List<Student> list;
private String courseName;

courseDao接口

 /**
 * 查询所有的课程以及对应的选修学生信息
 * @return
 */
public List<Course> findAll();

XML文件

<select id="findAll" resultMap="courseMap">
    select * from course left outer join sc on course.courseId=sc.cid left outer join student on student.studentId=sc.sid;
</select>

<resultMap id="courseMap" type="course">
    <id column="courseId" property="courseId"></id>
    <result property="courseName" column="courseName"></result>
    <collection property="list" ofType="student">
        <id column="studentId" property="studentId"></id>
        <result property="studentName" column="studentName"></result>
        <result property="studentAge" column="studentAge"></result>
    </collection>
</resultMap>

测试类

@Test
public void findAll(){
  List<Course> list=courseDao.findAll();
  for(Course course:list){
      System.out.println(course);
  }
}

结果

Mybatis多表查询--多对多操作(选课示例)

学习代码:https://download.csdn.net/download/weixin_45680962/12597435
本博客纯属个人学习笔记,如有错误,感激指正