Mybatis--级联

Posted 大-雄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis--级联相关的知识,希望对你有一定的参考价值。

级联是resultMap中的配置。

级联分为3种

  • 鉴别器(discrimination):根据某些条件采用具体实现具体实现类级联,如体检表根据性别去区分
  • 一对一:学生和学生证
  • 一对多:班主任和学生。

 

 

bean:
public class Employee {

    private Long id;
    private String realName;
    private SexEnum sex = null;
    private Date birthday;
    private String mobile;
    private String email;
    private String position;
    private String note;
    //工牌按一对一级联
    private WorkCard workCard;
    //雇员任务,一对多级联
    private List<EmployeeTask> employeeTaskList = null;
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getRealName() {
        return realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public SexEnum getSex() {
        return sex;
    }
    public void setSex(SexEnum sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    public WorkCard getWorkCard() {
        return workCard;
    }
    public void setWorkCard(WorkCard workCard) {
        this.workCard = workCard;
    }
    public List<EmployeeTask> getEmployeeTaskList() {
        return employeeTaskList;
    }
    public void setEmployeeTaskList(List<EmployeeTask> employeeTaskList) {
        this.employeeTaskList = employeeTaskList;
    }
}

public class FemaleEmployee extends Employee {

    private FemaleHealthForm femaleHealthForm = null;

    public FemaleHealthForm getFemaleHealthForm() {
        return femaleHealthForm;
    }

    public void setFemaleHealthForm(FemaleHealthForm femaleHealthForm) {
        this.femaleHealthForm = femaleHealthForm;
    }
}

public class MaleEmployee extends Employee {

    private MaleHealthForm maleHealthForm = null;

    public MaleHealthForm getMaleHealthForm() {
        return maleHealthForm;
    }

    public void setMaleHealthForm(MaleHealthForm maleHealthForm) {
        this.maleHealthForm = maleHealthForm;
    }
}

public class WorkCard {
    private Long id;
    private Long empId;
    private String realName;
    private String department;
    private String mobile;
    private String position;
    private String note;

}

public class EmployeeTask {
    private Long id;
    private Long empId;
    private Task task = null;
    private String taskName;
    private String note;
}

mapper:
public interface EmployeeMapper {

    public Employee getEmployee(Long id);
    
    public Employee getEmployee2(Long id);
}

XML:
<mapper namespace="com.ssm.chapter5.mapper.EmployeeMapper">
    <resultMap type="com.ssm.chapter5.pojo.Employee" id="employee">
        <id column="id" property="id" />
        <result column="real_name" property="realName" />
        <result column="sex" property="sex"
            typeHandler="com.ssm.chapter5.typeHandler.SexTypeHandler" />
        <result column="birthday" property="birthday" />
        <result column="mobile" property="mobile" />
        <result column="email" property="email" />
        <result column="position" property="position" />
        <result column="note" property="note" />
        <association property="workCard" column="id" //一对一
            select="com.ssm.chapter5.mapper.WorkCardMapper.getWorkCardByEmpId" /> //应用另外一个 xml map中 id为"getWorkCardByEmpId"的select
        <collection property="employeeTaskList" column="id"//一对多
            fetchType="eager"
            select="com.ssm.chapter5.mapper.EmployeeTaskMapper.getEmployeeTaskByEmpId" />
        <discriminator javaType="long" column="sex">
            <case value="1" resultMap="maleHealthFormMapper" />//鉴别器级联
            <case value="2" resultMap="femaleHealthFormMapper" />
        </discriminator>
    </resultMap>

    <resultMap type="com.ssm.chapter5.pojo.FemaleEmployee" id="femaleHealthFormMapper"
        extends="employee">
        <association property="femaleHealthForm" column="id"
            select="com.ssm.chapter5.mapper.FemaleHealthFormMapper.getFemaleHealthForm" />
    </resultMap>

    <resultMap type="com.ssm.chapter5.pojo.MaleEmployee" id="maleHealthFormMapper"
        extends="employee">
        <association property="maleHealthForm" column="id"
            select="com.ssm.chapter5.mapper.MaleHealthFormMapper.getMaleHealthForm" />
    </resultMap>

    <select id="getEmployee" parameterType="long" resultMap="employee">
        select
        id, real_name as realName, sex, birthday, mobile, email, position,
        note from t_employee where id = #{id}
    </select>

    <resultMap id="employee2" type="com.ssm.chapter5.pojo.Employee">
        <id column="id" property="id" />
        <result column="real_name" property="realName" />
        <result column="sex" property="sex"
            typeHandler="com.ssm.chapter5.typeHandler.SexTypeHandler" />
        <result column="birthday" property="birthday" />
        <result column="mobile" property="mobile" />
        <result column="email" property="email" />
        <result column="position" property="position" />
        <association property="workCard" javaType="com.ssm.chapter5.pojo.WorkCard"/一对一级联
            column="id">
            <id column="wc_id" property="id" />
            <result column="id" property="empId" />
            <result column="wc_real_name" property="realName" />
            <result column="wc_department" property="department" />
            <result column="wc_mobile" property="mobile" />
            <result column="wc_position" property="position" />
            <result column="wc_note" property="note" />
        </association>
        <collection property="employeeTaskList" ofType="com.ssm.chapter5.pojo.EmployeeTask"//一对多级联
            column="id">
            <id column="et_id" property="id" />
            <result column="id" property="empId" />
            <result column="task_name" property="taskName" />
            <result column="note" property="note" />
            <association property="task" javaType="com.ssm.chapter5.pojo.Task"
                column="et_task_id">
                <id column="t_id" property="id" />
                <result column="t_title" property="title" />
                <result column="t_context" property="context" />
                <result column="t_note" property="note" />
            </association>
        </collection>
        <discriminator javaType="int" column="sex"> //sex鉴别器级联male/female
            <case value="1" resultMap="maleHealthFormMapper2" />
            <case value="2" resultMap="femaleHealthFormMapper2" />
        </discriminator>
    </resultMap>


    <resultMap type="com.ssm.chapter5.pojo.MaleEmployee" id="maleHealthFormMapper2"
        extends="employee2">
        <association property="maleHealthForm" column="id"
            javaType="com.ssm.chapter5.pojo.MaleHealthForm">
            <id column="h_id" property="id" />
            <result column="h_heart" property="heart" />
            <result column="h_liver" property="liver" />
            <result column="h_spleen" property="spleen" />
            <result column="h_lung" property="lung" />
            <result column="h_kidney" property="kidney" />
            <result column="h_prostate" property="prostate" />
            <result column="h_note" property="note" />
        </association>
    </resultMap>

    <resultMap type="com.ssm.chapter5.pojo.FemaleEmployee" id="femaleHealthFormMapper2"
        extends="employee2">
        <association property="femaleHealthForm" column="id"
            javaType="com.ssm.chapter5.pojo.FemaleHealthForm">
            <id column="h_id" property="id" />
            <result column="h_heart" property="heart" />
            <result column="h_liver" property="liver" />
            <result column="h_spleen" property="spleen" />
            <result column="h_lung" property="lung" />
            <result column="h_kidney" property="kidney" />
            <result column="h_uterus" property="uterus" />
            <result column="h_note" property="note" />
        </association>
    </resultMap>

    <select id="getEmployee2" parameterType="long" resultMap="employee2">
        select
        emp.id, emp.real_name, emp.sex, emp.birthday,
        emp.mobile, emp.email,
        emp.position, emp.note,
        et.id as et_id, et.task_id as et_task_id,
        et.task_name as et_task_name,
        et.note as et_note,
        if (emp.sex = 1,
        mhf.id, fhf.id) as h_id,
        if (emp.sex = 1, mhf.heart, fhf.heart) as
        h_heart,
        if (emp.sex = 1, mhf.liver, fhf.liver) as h_liver,
        if (emp.sex
        = 1, mhf.spleen, fhf.spleen) as h_spleen,
        if (emp.sex = 1, mhf.lung,
        fhf.lung) as h_lung,
        if (emp.sex = 1, mhf.kidney, fhf.kidney) as
        h_kidney,
        if (emp.sex = 1, mhf.note, fhf.note) as h_note,
        mhf.prostate
        as h_prostate, fhf.uterus as h_uterus,
        wc.id wc_id, wc.real_name
        wc_real_name, wc.department wc_department,
        wc.mobile wc_mobile,
        wc.position wc_position, wc.note as wc_note,
        t.id as t_id, t.title as
        t_title, t.context as t_context, t.note as t_note
        from t_employee emp
        left join t_employee_task et on emp.id = et.emp_id
        left join
        t_female_health_form fhf on emp.id = fhf.emp_id
        left join
        t_male_health_form mhf on emp.id = mhf.emp_id
        left join t_work_card wc
        on emp.id = wc.emp_id
        left join t_task t on et.task_id = t.id
        where
        emp.id = #{id}
    </select>
</mapper>

   test:

public static void testGetEmployee() {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            Employee employee = employeeMapper.getEmployee(1L);
            System.out.println(employee.getWorkCard().getPosition());
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
    
    public static void testGetEmployee2() {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            Employee employee = employeeMapper.getEmployee2(1L);
            System.out.println(employee.getWorkCard().getPosition());
        } catch(Exception ex) {
            ex.printStackTrace();
        } finally {
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
    

 

以上是关于Mybatis--级联的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis之级联小结

Mybatis--级联

MyBatis级联操作

Mybatis 级联查询 (一对多 )

Mybatis + mysql 实现两级级联的查询

mybatis级联查询,分步查询和延迟加载