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。

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