1. 程式人生 > >Mybatis之高階對映【一對多對映】

Mybatis之高階對映【一對多對映】

一對多對映(兩種方式)
三張表關聯查詢。當然resultType也能實現,需要將所查詢的資訊定義到一個pojo(詳情見一對一對映中的resultType),這裡講的是resultMap。
需求:查詢人員、部門資訊並關聯查詢其父級部門資訊。
隨意定義資料庫的三張表:

人員表:
這裡寫圖片描述
部門表:
這裡寫圖片描述
父級部門表:
這裡寫圖片描述

方式一:association (一對一對映)+collection(一對多對映)
a.建立人員表的pojo:

package com.example.data;

import java.util.List;

public class User {
    private
String id; private String deptId; private String name; private String sex; private String age; private String remark; /** * User表中有一個dept_id欄位,要在User類中定義一個dept屬性, * 用於維護dept和user之間的一對一關係 */ private Dept dept; //使用一個List<Pdept>集合屬性表示父級部門中的子部門 private
List<Pdept> pdepts; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDeptId() { return deptId; } public void setDeptId(String deptId) { this.deptId = deptId; } public String getName
() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } public List<Pdept> getPdepts() { return pdepts; } public void setPdepts(List<Pdept> pdepts) { this.pdepts = pdepts; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", deptId='" + deptId + '\'' + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", age='" + age + '\'' + ", remark='" + remark + '\'' + ", dept=" + dept + ", pdepts=" + pdepts + '}'; } }

b.建立部門表的pojo:

package com.example.data;

public class Dept {
    private String id;
    private String deptName;
    private String parentId;

    public String getId() {
        return id;
    }

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

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "id='" + id + '\'' +
                ", deptName='" + deptName + '\'' +
                ", parentId='" + parentId + '\'' +
                '}';
    }
}

b.建立父級部門表的pojo:

package com.example.data;

public class Pdept {
    private String id;
    private String pdeptName;

    public String getId() {
        return id;
    }

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

    public String getPdeptName() {
        return pdeptName;
    }

    public void setPdeptName(String pdeptName) {
        this.pdeptName = pdeptName;
    }

    @Override
    public String toString() {
        return "Pdept{" +
                "id='" + id + '\'' +
                ", pdeptName='" + pdeptName + '\'' +
                '}';
    }
}

b.編寫Mapper.xml:

<select id="selectOneToMany"  resultMap="selectRstMapTwo">
        <![CDATA[
            select * from bank_user,bank_dept,bank_pdept where bank_user.dept_id=bank_dept.id 
            and bank_dept.parent_id=bank_pdept.id
        ]]>
    </select>

    <!--定義resultmap
        column:資料庫中對應的列名(名字必須完全一樣)
        property:實體類pojo中的屬性名(名字必須完全一樣)-->
    <resultMap type="com.example.data.User" id="selectRstMapTwo">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <!--association:一對一關聯對映-->
        <association property="dept" javaType="com.example.data.Dept">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
        </association>

        <!-- collection:一對多關聯對映 
             property表示集合型別屬性名稱,也就是User實體類中定義的部門List名字
             ofType表示集合中的物件的型別-->
        <collection property="pdepts" ofType="com.example.data.Pdept">
            <id column="id" property="id"/>
            <result column="pdept_name" property="pdeptName"/>
        </collection>
    </resultMap>

c.編寫Mapper.java:

    //一對多查詢:查詢人員、部門資訊並關聯查詢其父級部門資訊
    public List<User> selectOneToMany()throws Exception;

輸出結果日誌:

這裡寫圖片描述

<select id="selectOneToMany"  resultMap="selectRstMapTwo">
        <![CDATA[
            select * from bank_user,bank_dept,bank_pdept where bank_user.dept_id=bank_dept.id 
            and bank_dept.parent_id=bank_pdept.id
        ]]>
    </select>

    <!--定義resultmap
        column:資料庫中對應的列名(名字必須完全一樣)
        property:實體類pojo中的屬性名(名字必須完全一樣)
        extends:繼承一個resultMap,把其中的所有配置都繼承(這裡繼承的是上一篇一對一對映的resultMap)
        使用extends,只編寫collection元素即可。
    -->
    <resultMap type="com.example.data.User" id="selectRstMapTwo" extends="selectRstMap">
        <!-- collection:一對多關聯對映 
             property表示集合型別屬性名稱,也就是User實體類中定義的部門List名字
             ofType表示集合中的物件的型別-->
        <collection property="pdepts" ofType="com.example.data.Pdept">
            <id column="id" property="id"/>
            <result column="pdept_name" property="pdeptName"/>
        </collection>
    </resultMap>