MyBatis的級聯有三種:
- 鑑別器
- 一對一
- 一對多
沒有多對多,因爲多對多可以由兩個多對一進行替換。列如用戶和角色就是多對多的關係。一個用戶在不同場合有不同的角色,而一個角色由不同的用戶扮演。
一、首先看一下一對一級聯。
這裏假設一個用戶僅僅對應一個角色。
角色實體類:
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本身沒有多對多級聯,因爲多對多級聯關係複雜化和困難,並且可以通過兩個一對多實現。
上面實現了用戶和角色的一對多級聯,只要再實現角色對用戶的一對多級聯就可以形成多對多級聯。
四、鑑別器
鑑別器時一個根據某些條件來決定採用具體實現類級聯的方案。比如體檢表要根據男女來區分。
首先建立三個實體類:
- 員工類
- 男員工體檢表類
- 女員工體檢表類
首先員工類和兩個體檢表類的對應關係都是一對一的,先建立一對一級聯關係。
<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。