MyBatis之关联查询

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
MyBatis之关联查询


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、一对一关联查询
  • 二、一对多关联查询
  • 三、多对多关联查询
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在使用MyBatis进行数据库操作时,关联查询是一种重要的查询方式。它能够在一个查询中同时检索多个表中的数据,从而提高查询效率和性能。在开始学习和使用MyBatis的关联查询之前,我们需要先了解一些基础概念和知识,包括数据库表、实体类、Mapper接口和Mapper.xml文件等。
在接下来的博客文章中,我们将逐步学习如何使用MyBatis进行关联查询,并通过示例代码演示如何实现多对一和一对多的关联查询。希望通过这些介绍,你能够掌握MyBatis关联查询的基本知识和技能,并能够在实际项目中应用这些知识。


提示:以下是本篇文章正文内容,下面案例可供参考

一、一对一关联查询

在 MyBatis 中,一对一关联查询是指通过在查询语句中使用连接(JOIN)操作,从多个表中获取相关联的数据。这样可以一次性获取到涉及多个表的数据,避免了多次查询和手动关联的麻烦。
一对一关联查询通常涉及到两个表,其中一个表包含主要数据,称为“主表”,另一个表包含与主表关联的数据,称为“从表”。在关联查询中,通过在主表和从表之间建立连接条件,可以将相关的数据关联起来。
在 MyBatis 的映射文件中,可以使用标签来配置一对一关联查询。以下是一个简单的示例:

<resultMap id="studentMapper" type="com.zhangsan.pojo.Student">
  
  <id property="sid" column="sid">id>
  
  <result property="name" column="name">result>
  <result property="age" column="age">result>
  <result property="sex" column="sex">result>
  
  <association property="classes" column="classId" javaType="com.zhangsan.pojo.Classes">
    
    <id property="cid" column="cid">id>
    
    <result property="className" column="className">result>
  association>
resultMap>

<select id="findAll" resultMap="studentMapper">
   select * from student left join classes on student.classId = classes.cid;
select>

二、一对多关联查询

在 MyBatis 中,一对多关联查询是指通过在查询语句中使用连接(JOIN)操作,从一个表中查询出与之关联的多个表的数据。
一对多关联查询通常涉及到两个表,其中一个表包含主键,另一个表包含外键,并且外键与主键之间存在关联关系。例如,一个学生表(student)和一个成绩表(score)之间存在一对多的关联关系,学生表中的主键是学生 ID(student_id),成绩表中的外键是学生 ID(student_id),并且每个学生可能有多个成绩记录。
以下是一个示例,展示了如何在 MyBatis 中使用一对多关联查询:假设有一个学生表(student)和一个成绩表(score),学生表包含学生 ID(student_id)和学生姓名(student_name),成绩表包含学生 ID(student_id)和成绩(score)。
1.在学生表的映射文件中定义一个关联的结果集映射,用于获取学生的成绩:


<mapper namespace="com.example.studentMapper">
    <resultMap id="studentWithScore" type="com.example.Student">
        <id column="student_id" property="studentId" />
        <result column="student_name" property="studentName" />
        <collection property="scores" ofType="com.example.Score">
            <id column="student_id" property="studentId" />
            <result column="score" property="score" />
        collection>
    resultMap>

    <select id="selectStudentWithScore" parameterType="int" resultMap="studentWithScore">
        SELECT s.student_id, s.student_name, sc.score
        FROM student s
        INNER JOIN score sc ON s.student_id = sc.student_id
        WHERE s.student_id = #{studentId}
    select>
mapper>

2.在使用 MyBatis 进行查询时,可以使用关联的结果集映射来获取关联的数据:

// 学生表的实体类
class Student {
    private Integer studentId;
    private String studentName;
    private List<Score> scores;
    // getter 和 setter 方法
}

// 成绩表的实体类
class Score {
    private Integer scoreId;
    private Integer studentId;
    private Integer score;
    // getter 和 setter 方法
}

public class Main {
    public static void main(String[] args) {
        // 创建学生表的 Mapper 对象
        StudentMapper studentMapper = new StudentMapper();
        // 创建成绩表的 Mapper 对象
        ScoreMapper scoreMapper = new ScoreMapper();

        // 输入学生 ID
        int studentId = 1;

        // 使用 MyBatis 查询学生及其成绩
        Student student = studentMapper.selectStudentWithScore(studentId);

        // 输出学生信息和成绩
        System.out.println("Student: " + student);
    }
}

上述示例中,通过在学生表的映射文件中定义了一个关联的结果集映射studentWithScore,将学生表和成绩表关联起来。然后,在成绩表的映射文件中,添加了对关联结果集映射的引用,并在使用时通过标签进行关联。
在查询学生信息时,使用了studentMapper.selectStudentWithScore(studentId)方法,该方法将返回一个包含学生信息和成绩的Student对象。通过该对象可以获取学生的信息和关联的成绩。

三、多对多关联查询

多对多关联查询通常涉及到三个或更多的表,其中至少有两个表之间存在多对多的关联关系。以下是一个示例,展示了如何在 MyBatis 中使用多对多关联查询:
MyBatis多对多关联查询本质就是两个一对多关联查询。例如有老师类和班级类:一个老师对应多个班级,也就是老师类中有一个班级集合属性。一个班级对应多个老师,也就是班级类中有一个老师集合属性。现在通过一个示例,将查询班级的时候,把同学和老师都查出来:

<resultMap id="classesMapper" type="com.zhangsan.pojo.Classes">
  <id property="cid" column="cid">id>
  <result property="className" column="className">result>
  
  <collection property="studentList" column="classId" ofType="com.zhangsan.pojo.Student">
    <id property="sid" column="sid">id>
    <result property="name" column="name">result>
    <result property="age" column="age">result>
    <result property="sex" column="sex">result>
  collection>
  <collection property="teacherList" column="cid" ofType="com.zhangsan.pojo.Teacher">
    <id property="tid" column="tid">id>
    <result property="tname" column="tname">result>
  collection>
resultMap>


<select id="findAll" resultMap="classesMapper">
   select *
   from classes
   left join student
   on classes.cid = student.classId
   left join classes_teacher
   on classes.cid = classes_teacher.cid
   left join teacher
   on classes_teacher.tid = teacher.tid;
select>


总结

提示:这里对文章进行总结:

关联查询是 MyBatis 中一种常见的查询方式,它通过在映射文件中使用JOIN语句和结果集映射来实现。在使用关联查询时,需要注意表之间的关联关系、结果集映射的配置以及查询语句的编写。通过合理使用关联查询,可以方便地获取相关联的数据,提高查询效率和数据的完整性。

你可能感兴趣的:(Mybatis,mybatis,java,数据库,关联查询)