当前位置:   article > 正文

MyBatis中复杂查询(一对多和多对一)

MyBatis中复杂查询(一对多和多对一)

一,介绍

        在MyBatis中处理一对多(1)和多对一(N:1)关系是常见的需求,尤其是在操作数据库中存在关联表时。这些关系的管理能让数据查询更加直观和灵活。下面分别介绍如何在MyBatis中配置和查询这两种类型的关系。

二,一对多(1)关系

        一对多关系指的是一个记录在一个表中可以关联多个记录在另一个表中。例如,一个课程可以有多个学生。通常我们需要用外键关联学生与课程并一同返回结果。

 2.1映射配置

        首先在MyBatis的映射文件中配置这种关系。假设我们有两个实体类:Course和 Student,其中 Course可以有多个 Student。

2.2 Course类

  1. public class Course {
  2. private int id;
  3. private String name;
  4. private List<Student> students; // 课程对应的学生列表
  5. // getters 和 setters
  6. }

2.3 Student类:

  1. public class Student {
  2. private int id;
  3. private String name;
  4. private int courseId; // 外键
  5. // getters 和 setters
  6. }

2.4 Mapper文件

  1. <select id="selectCourse" resultMap="CourseResultMap">
  2. SELECT * FROM Course
  3. LEFT JOIN Student ON Course.id = Student.course_id
  4. WHERE Course.id = #{id}
  5. </select>
  6. <resultMap id="CourseResultMap" type="Course">
  7. <id property="id" column="id" />
  8. <result property="name" column="name" />
  9. <collection property="students" ofType="Student"
  10. resultMap="StudentResultMap"/>
  11. </resultMap>
  12. <resultMap id="StudentResultMap" type="Student">
  13. <id property="id" column="id" />
  14. <result property="name" column="name" />
  15. <result property="courseId" column="course_id" />
  16. </resultMap>

二,多对一(N:1)关系

        多对一关系指的是多个记录在一个表中可以关联到另一个表中的单个记录。例如,多个学生可以属于同一个课程。

 2.1 映射配置(添加字段名与类属性名不一致的情况)

        通过映射文件中的配置来指定数据库字段名和类属性名之间的对应关系。我在多对一(N:1)关系的例子中加入字段名和参数名不一样的情况。比如,在数据库中字段名为id而在类中的对应字段名为courseId。

2.2 Student类:

  1. public class Student {
  2. private int id;
  3. private String name;
  4. private int courseId; // 对应数据库中的 course_id 字段
  5. private Course course; // 关联的课程对象
  6. // getters 和 setters
  7. }

2.3 Course类

  1. public class Course {
  2. private int courseId; // 注意,这里使用了 courseId 而不是 id
  3. private String name;
  4. // getters 和 setters
  5. }

2.4 Mapper文件配置

  1. <!-- 结果映射定义,处理字段名和属性名不一致的情况 -->
  2. <resultMap id="CourseResultMap" type="Course">
  3. <id property="courseId" column="id" /> <!-- 映射数据库的 id 字段到类的 courseId 属性 -->
  4. <result property="name" column="name" />
  5. </resultMap>
  6. <resultMap id="StudentResultMap" type="Student">
  7. <id property="id" column="id" />
  8. <result property="name" column="name" />
  9. <result property="courseId" column="course_id" /> <!-- 映射数据库的 course_id 字段到类的 courseId 属性 -->
  10. <association property="course" javaType="Course"
  11. resultMap="CourseResultMap" />
  12. </resultMap>
  13. <!-- 查询学生及其课程信息,处理字段名映射 -->
  14. <select id="selectStudent" resultMap="StudentResultMap">
  15. SELECT Student.id, Student.name, Student.course_id,
  16. Course.id, Course.name
  17. FROM Student
  18. JOIN Course ON Student.course_id = Course.id
  19. WHERE Student.id = #{id}
  20. </select>

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号