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。