1. 程式人生 > >Mybatis關聯查詢之一對多XML配置詳解

Mybatis關聯查詢之一對多XML配置詳解

但是有些地方沒有解釋詳細,自己研究了一會,決定將之詳細化

  • 首先是有兩張表,頭行結構。相當於是一張老師表一張學生表。 學生表 老師表 邏輯結構就是一個老師有多個學生,我們在查詢的時候想要的結果是查出所有的老師的資料以及每一個老師所對應的學生的資料。

  • 建立實體bean 頭表和行表都需要建立相應的實體類。在頭表中需要新增一個欄位(表中不存在的),用來存放行表中查出的對應的資料。

@VersionAudit
@ModifyAudit
@Table(name = "teacher")
public class TeacherDTO {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "class_name")
    private String className;

    @Transient
    private List<StudentDTO> students;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public List<StudentDTO> getStudents() {
        return students;
    }

    public void setStudents(List<StudentDTO> students) {
        this.students = students;
    }
}

我這裡用students來存放 行表 中查詢的出的資料。@Transient這個註解表示該實體中定義資料庫中沒有的欄位。

  • 配置Mapper.xml檔案 在查詢了網上資料以及翻閱相關書籍後,總結出mybatis中一對多的方式,其實這個方法的效率是比較高的,所以優先用這個方法,前文中的連結中也有提到這種方法,就是連結中的第二種方法。 程式碼的詳解放在程式碼的註釋中
<?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="test.mapper.TeacherMapper">

    <!-- type 頭表的返回格式,也就是頭表的實體類-->
    <resultMap id="teacherMap" type="test.domain.TeacherDTO">
        <id property="id" column="id"/>
        <result column="name" property="name"/>
        <result column="class_name" property="className"/>
        <!-- ofType 行表的返回格式-->
        <!-- select 行表的sql查詢語句的id-->
        <!--column 頭表與行表的連線欄位,注意這裡用的是下劃線,下面用的是駝峰-->
        <collection property="students" ofType="test.domain.StudentDTO" select="findStudents" column="id">
        </collection>
    </resultMap>

    <!--頭表查詢語句-->
    <select id="findTeacherAndStudent" resultMap="teacherMap">

        SELECT
            id,
            NAME,
            class_name
        FROM
            `teacher`
    </select>

    <!--行表查詢語句-->
    <select id="findStudents" resultType="test.domain.StudentDTO">

        SELECT
            id,
            teacher_id,
            name,
            class_name
        FROM
            `student`
        WHERE
            1=1
--         這裡遞進來的的引數是駝峰格式
        AND id = #{id}

    </select>

</mapper>
  • 這是mybatis的拼接方式,有時候其實也可以用java的拼接方式,獨立出兩個查詢介面,然後在java中拼接

這是service實現類中的拼接方式

public List<TeacherDTO> findTeacherAndStudentByJava(String id) {
        List<TeacherDTO> result = teacherMapper.findTeacher(id);
        //遍歷頭表中查詢到的每一條資料
        for (TeacherDTO teacherDTO : result) {
            //將行表查詢到的資料放在頭表中的students欄位中
            teacherDTO.setStudents(teacherMapper.findStudents(teacherDTO.getId()));
        }
        return result;
    }