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(); } } }