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

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

1.一對一對映 兩表關聯查詢。有兩種方案:對映檔案中輸出對映使用resultType或者resultMap。 需求:查詢人員資訊並關聯其部門。 資料庫兩張表: 人員表: 這裡寫圖片描述 部門表: 這裡寫圖片描述

(1.)使用resultType對映: a.建立部門表的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類userdept,將人員表user和部門表dept中的屬性合併在一起,以便將查詢出來的記錄對映到該pojo上。 (用到了extends )

package com.example.data;

public class UserDept extends Dept{
        private String id;
        private String name;
        private String sex;
        private String age;
        private String remark;

        public String getId() {
            return id;
        }

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

        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;
        }
        @Override
        public String toString() {
            return "UserDept{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age='" + age + '\'' +
                ", remark='" + remark + '\'' +
                '}';
        }
    }

c.編寫Mapper.xml:

<!--查詢人員資訊並關聯其部門-->
<!--resultType對映的實體類就是構建的user跟dept的組合類-->
<select id="selectMessage"  resultType="com.bestvike.example.data.UserDept">
        <![CDATA[
            select * from bank_user,bank_dept where bank_user.dept_id=bank_dept.id
        ]]>
    </select>

d.編寫Mapper.java:

//查詢人員資訊並關聯其部門
public List<UserDept> selectMessage()throws Exception;

輸出結果日誌: 這裡寫圖片描述 (1.)使用resultMap對映:(兩種方式)

方式一:巢狀結果 resultMap不需要構造新的pojo,只需將查詢出來的記錄的值通過resultMap對映到指定到pojo的屬性上。 a.建立人員表的pojo:

package com.example.data;

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;

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", deptId='" + deptId + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age='" + age + '\'' +
                ", remark='" + remark + '\'' +
                ", dept=" + dept +
                '}';
    }
}

b.編寫Mapper.xml:

<select id="selectByResultMap"  resultMap="selectRstMap">
        <![CDATA[
            select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id
        ]]>
    </select>

    <!--定義resultmap
        id:指定查詢列中的唯一標識,連線select查詢標籤內的resultmap。如果多個列組成唯一標識,配置多個id
        type:返回物件型別。(介面中要定義的物件)
        id標籤:主鍵標籤。
        column:查詢出的列名(給資料庫中的列名定義的別名) 
        property:對應type所指定的java實體類POJO中的屬性名
        -->
    <resultMap type="com.bestvike.example.data.User" id="selectRstMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>

        <!--定義association:一對一對映(將另一張表要查詢的資訊對映到物件屬性傳出到一個物件上,
            那個物件就擁有要查詢的兩張表的資訊)
            property:把一對一對映的查詢資訊封裝到物件屬性上,封裝的物件就是javaType裡定義的pojo
            javaType:property屬性的型別
        -->
        <association property="dept" javaType="com.bestvike.example.data.Dept">
            <id column="id" property="id"/>
            <result column="dept_name" property="deptName"/>
        </association>
    </resultMap>

c.編寫Mapper.java:

//resultmap:查詢人員資訊並關聯其部門
    public List<User> selectByResultMap();

輸出結果日誌: 這裡寫圖片描述

方式二:巢狀查詢 與方式一不同點在Mapper.xml:

<select id="selectByResultMap"  resultMap="selectRstMap">
        <![CDATA[
            select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id
        ]]>
    </select>

    <!--定義resultmap-->
    <resultMap type="com.bestvike.example.data.User" id="selectRstMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <!--association:一對一對映
            column:(dept_id)user表中的欄位,用來與dept表關聯
            select:定義與select標籤連線的標識,select元素通過id引用此名字
        -->
        <association property="dept" column="dept_id" select="getDept"/>
    </resultMap>

    <!--id:連線association裡select定義的名字-->
    <select id="getDept" resultType="com.bestvike.example.data.Dept">
        SELECT dept_name name FROM bank_dept WHERE id=#{id}
    </select>

輸出結果日誌:每個id查詢一次,最終彙總 這裡寫圖片描述 總結: resultType:pojo中沒有包括查詢出來的所以列名,則需要增加列名對應的屬性(整合所有要查詢的資訊封裝到物件),完成對映。 resultMap:不需要建立新的pojo,但需要在mapper.xml檔案中建立association一對一對映。