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级联的实现 开篇 级联有三种对应关系: 1.一对一(association):如学号与学生 2.一对多(collection):如角色与用户 3.多对多(discri ...
- Mybatis 级联查询 (一对多 )
后台系统中 涉及到添加试卷 问题 答案的一个模块的.我需要通过试卷 查询出所有的试题,以及试题的答案.这个主要要使用到Mybatis的级联查询. 通过试卷 查询出与该试卷相关的试题(一对多),查询出试 ...
- Mybatis级联:关联、集合和鉴别器的使用
Mybatis中级联有关联(association).集合(collection).鉴别器(discriminator)三种.其中,association对应一对一关系.collection对应一对多 ...
- mybatis级联
mybatis中有时候表不能都分成单表进行查询,表之间会有联系,这时候需要将表进行级联 下面讲一下如何将mybatis中 的表进行级联.映射表关系如下 1:创建数据表 DROP TABLE IF EX ...
- Mybatis级联,使用JOIN和Associa,以及一些ID覆盖和自动变换。
先说下坑,比如数据库的字段是 DW_ID ,用generator讲mybatis自动转换的时候,会省略下表_变成dwId,所以我们之后自己手动设计的时候也尽量换成dwId: generate的myb ...
- mybatis 级联
级联是一个数据库实体的概念.一对多的级联,一对多的级联,在MyBatis中还有一种被称为鉴别器的级联,它是一种可以选择具体实现类的级联. 级联不是必须的,级联的好处是获取关联数据十分便捷,但是级联过多 ...
- mybatis级联查询,多对一查询问题
在使用Mybatis进行多表级联查询时遇到了一个问题:查询结果只有一项,但正确结果是两项.经测试,SQL语句本身没有问题. 在SQL映射文件(XML)中: <!-- 级联查询数据 --> ...
- Mybaits(9)MyBatis级联-2
一.鉴别器和一对多级联 1.完善体检表,分为男雇员体检和女雇员体检表 (1)持久层dao编写 package com.xhbjava.dao; import com.xhbjava.domain.Ma ...
- mybatis ---- 级联查询 一对多 (集合映射)
关联有嵌套查询和嵌套结果两种方式,本文是按照嵌套结果这种方式来说明的 上一章介绍了多对一的关系,用到了<association></association>,这是一个复杂类型的 ...
- mybatis级联查询
1.定义四个实体.User Role Privilege Resource,他们之间的对于关系为 2.需求:我通过用户名username查找出该用户对应的角色以及角色对应的权限和资源 3 ...
随机推荐
- 前端性能优化实践-gzip
一名优秀的前端工程师必备技能之一就是要会性能监控,并且能相应的进行性能优化.最近,有需求将项目做一些优化,提升用户的体验.看了一下项目并没有开启gzip,于是着手实现gzip压缩,下面就是具体的实践过 ...
- Java基础之反射生成JDK动态代理
在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口.通过这个类和接口可以生成JDK动态代理类或动态代理对象. JDK动态代理例子: / ...
- 解决远程连接服务器数据库报错:Host ‘XXXXXX’ is blocked because of many connection errors
参考:https://blog.csdn.net/li_li_lin/article/details/72764683和 https://blog.csdn.net/zaishijizhidian/a ...
- Python - list 列表常见方法
list.append(x) 介绍 在列表的末尾添加一个元素 相当于 a[len(a):] = [x] 返回值 None 栗子 # append a = [1, 2, 3] b = [4, 5, 6 ...
- c# checkedListBox设置多列横向显示 经验总结
1. 设置checkedListBox的MultiColumn 属性为true; 2. 调整checkedListBox的宽度,调整ColumnWidth的宽度
- Linux用户提权管理方案
提权管理方案背景: 如果一个公司有10余个运维或网络安全人员,同时管理服务器,切换到管理员用户时(su - root),必须要有root管理员密码,如果其中一人修改过root密码,其他用户则登录不了, ...
- 【搜索】单词方阵 luogu-1101
题目描述 给一n×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间 ...
- Angular封装WangEditor富文本组件
富文本组件是web程序中很常用的一个组件,特别是要开发一个博客,论坛这类的网站后台. 得益于Angular的强大,封装WangEditor组件非常简单 1.使用yarn或者npm安装wangedito ...
- 第十八篇 -- GPIO学习
先学习一下GPIO,网上各种找资料,拼凑,所以就不一一贴网址了. 一.GPIO GPIO的英文全称General-Purpose Input /Output Ports,中文意思是通用I/O端口 一个 ...
- c++ 的父类 new 重载, 子类new 对象的时候会调用父类的operater new
子类在new 对象的 时候 父类的new 进行了重载,那么会调用父类的operater new() 函数 #include <iostream> #include <string& ...