MyBatis——級聯

MyBatis的級聯有三種:

  1. 鑑別器
  2. 一對一
  3. 一對多

沒有多對多,因爲多對多可以由兩個多對一進行替換。列如用戶和角色就是多對多的關係。一個用戶在不同場合有不同的角色,而一個角色由不同的用戶扮演。

一、首先看一下一對一級聯。

這裏假設一個用戶僅僅對應一個角色。
角色實體類:

public class Role implements Serializable {
    private String id;
    private String userId;

    public String getId() {
        return id;
    }

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

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
    
    @Override
    public String toString() {
        return "Role{" +
                "id='" + id + '\'' +
                ", userId='" + userId + '\'' +
                '}';
    }
}}

用戶實體類:

public class User implements Serializable {
    private  String id;
    private  Role role;

    public String getId() {
        return id;
    }

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



    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }

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

用戶和角色的xml。

角色表字段:
id
user_id
用戶表字段:
id
角色表通過user_id關聯用戶表。
映射xml關鍵部分:
角色xml:

<resultMap id="resultMap" type="com.mybatis.domain.Role">
    <id property="id" column="id"/>
    <result property="userId" column="user_id"/>
</resultMap>

<select id="findById" resultMap="resultMap" parameterType="string">
select * from role where user_id=#{id}
</select>

用戶xml:

<resultMap id="resultMap" type="com.itheima.domain.User">
    <id property="id" column="id"/>
    <association property="role" column="id" select="com.itheima.dao.IRole.findById"/>
</resultMap>
 <select id="findAll" resultMap="resultMap">
     select * from user
 </select>

一對一映射同resultMap標籤association子標籤實現,select取值爲命名空間+SQl id組成用於關聯一條sql語句,colum表示表的列名,作爲參數傳遞給select定位的sql語句,property表示將select定位到的sql語句的結果映射到實體類的某個屬性上。
二、一對多映射
假設一個用戶對應多個角色。
實體類只需將

private  Role role;

改爲:

private  List<Role> role;

即可。
用戶的xml配置文件將resultMap改成:

<resultMap id="resultMap" type="com.itheima.domain.User">
    <id property="id" column="id"/>
    <collection property="role" column="id" select="com.itheima.dao.IRole.findById"/>
</resultMap>

即將association改成collection,collection表示一對多級聯
三、多對多級聯
mybatis本身沒有多對多級聯,因爲多對多級聯關係複雜化和困難,並且可以通過兩個一對多實現。
上面實現了用戶和角色的一對多級聯,只要再實現角色對用戶的一對多級聯就可以形成多對多級聯。
四、鑑別器
鑑別器時一個根據某些條件來決定採用具體實現類級聯的方案。比如體檢表要根據男女來區分。
首先建立三個實體類:

  1. 員工類
  2. 男員工體檢表類
  3. 女員工體檢表類

首先員工類和兩個體檢表類的對應關係都是一對一的,先建立一對一級聯關係。

<resultMap id="man" type="com.itheima.domain.Man">
    <association property="manForm" column="id" select="com.itheima.dao.IMan.findById"/>
</resultMap>
<resultMap id="woman" type="com.itheima.domain.Woman">
    <association property="womanForm" column="id" select="com.itheima.dao.IWoman.findById"/>
</resultMap>
``

配置鑑別器:

<resultMap id="resultMap" type="com.itheima.domain.Frm">
    <discriminator javaType="Long" column="sex">
        <case value="1" resultMap="man"/>
        <case value="2" resultMap="woman"/>
    </discriminator>
</resultMap>

column表示鑑別的屬性,javaType表示column的數據類型,case類似java的switch case 。resultMap表述調用那個resultMap。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章