MyBatis之级联——鉴别器
鉴别器(discriminator)是MyBatis为我们提供的第三个级联也是最后一个。基于之前两篇级联中的场景,现增加学生们去体检,但男女体检项目不一样,我们把男女体检表做成两张表,当然我想也可以设计为一张表,只有女生的项目男生不填就行了,为了讲解鉴别器就把男女体检表分开。鉴别器的作用在这里就是根据性别的不同去不同的表里进行查询体检情况,例如是男生就在男生体检表里查询,是女生就在女生体检表里查询。
POJO类我们也分为了男生、女生,他们分别继承之前的Student类。
MaleStudent类:
package day_8_mybatis.pojo; import java.util.List; /**
* @author turbo
*
* 2016年11月6日
*/
public class MaleStudent extends Student {
List<MaleStudentHealth> studentHealthList;
//省略getter/setter方法
}
一个学生和他体检表的对应关系应该是一对一的关系,为什么在这里是一对多的关系呢?呃……这是因为在体检表的设计中有一个日期的字段,也就是说一个学生在不同时间的体检情况都有记录,所以学生和体检表的对应关系就是一对多的关系,在这里也就是一个List的引用。
FemaleStudent类:
package day_8_mybatis.pojo; import java.util.List; /**
* @author turbo
*
* 2016年11月6日
*/
public class FemaleStudent extends Student{
List<FemaleStudentHealth> studentHealthList;
//省略getter/setter方法
}
这里的List的引用道理同上。
现在看看体检表的POJO类。
MaleStudentHealth类:
package day_8_mybatis.pojo; /**
* @author turbo
*
* 2016年11月6日
*/
public class MaleStudentHealth {
private int id;
private int studentId;
private String date;
private String prostate; //前列腺
//省略setter/getter方法
}
FemaleStudentHealth类:
package day_8_mybatis.pojo; /**
* @author turbo
*
* 2016年11月6日
*/
public class FemaleStudentHealth {
private int id;
private int studentId;
private String date;
private String womb;
//省略setter/getter方法
}
基本的数据结构设计就是上面所贴出来的代码了。下面我们看看mapper映射器,对于体检情况的查询不管男生女生都是通过student_id来查询的。
查询根据男生的student_id查询该生的体检表:
package day_8_mybatis.mapper; import day_8_mybatis.pojo.MaleStudentHealth; /**
* @author turbo
*
* 2016年11月6日
*/
public interface MaleStudentHealthMapper {
MaleStudentHealth findMaleStudentHealthByStudentId(int id);
}
其对应的MaleStudentHealthMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="day_8_mybatis.mapper.MaleStudentHealthMapper">
<select id="findMaleStudentHealthByStudentId" parameterType="int" resultType="day_8_mybatis.pojo.MaleStudentHealth">
select id, student_id as studentId, date, prostate from t_male_student_health where student_id = #{id}
</select>
</mapper>
查询根据女生的student_id查询该生的体检表:
package day_8_mybatis.mapper; import day_8_mybatis.pojo.FemaleStudentHealth; /**
* @author turbo
*
* 2016年11月6日
*/
public interface FemaleStudentHealthMapper {
FemaleStudentHealth findFemaleStudentHealthByStudentById(int id);
}
其对应的FemaleStudentHealthMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="day_8_mybatis.mapper.FemaleStudentHealthMapper">
<select id="findFemaleStudentHealthByStudentById" parameterType="int" resultType="day_8_mybatis.pojo.FemaleStudentHealth">
select id, student_id as studentId, date, womb from t_female_student_health where student_id = #{id}
</select>
</mapper>
基本工作已经做完了,剩下就是在StudentMapper.xml利用鉴别器来查询不同的体检表。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="day_8_mybatis.mapper.StudentMapper">
<resultMap type="day_8_mybatis.pojo.Student" id="studentMap">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<association property="selfCard" column="id" select="day_8_mybatis.mapper.SelfCardMapper.findSelfCardByStudentId"/>
<collection property="courseScoreList" column="id" select="day_8_mybatis.mapper.CourseScoreMapper.findCourseScoreByStudentId" />
<discriminator javaType="string" column="sex">
<case value="男" resultMap="maleStudentMap"/>
<case value="女" resultMap="femaleStudentMap"/>
</discriminator>
</resultMap> <select id="getStudent" parameterType="int" resultMap="studentMap">
select id, name, sex from t_student where id = #{id}
</select> <resultMap id="maleStudentMap" type="day_8_mybatis.pojo.MaleStudent" extends="studentMap">
<collection property="studentHealthList" select="day_8_mybatis.mapper.MaleStudentHealthMapper.findMaleStudentHealthByStudentId" column="id" />
</resultMap> <resultMap id="femaleStudentMap" type="day_8_mybatis.pojo.FemaleStudent" extends="studentMap">
<collection property="studentHealthList" select="day_8_mybatis.mapper.FemaleStudentHealthMapper.findFemaleStudentHealthByStudentById" column="id" />
</resultMap>
</mapper>
第12-15行就是本节的要讲的discriminator鉴别器,它通过查询出来的学生性别选择不同的体检表来查询出体检情况。
最后稍微修改的测试类,即可测试结果。
package day_8_mybatis; import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession; import day_8_mybatis.mapper.StudentMapper;
import day_8_mybatis.pojo.MaleStudent;
import day_8_mybatis.util.SessionFactory2; /**
* 客户端
* @author turbo
*
* 2016年11月6日
*/
public class Main { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws Exception {
String resource = "day_8_mybatis/mybatis-config.xml"; //获取mybatis配置文件路径
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSession sqlSession = SessionFactory2.getInstance(inputStream).openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
MaleStudent student =(MaleStudent)studentMapper.getStudent(1);
System.out.println("学生:" + student.getName() + " 课程:" + student.getCourseScoreList().get(0).getCourse().getCourseName() + " 分数:" + student.getCourseScoreList().get(0).getScore()+ " 性别:" + student.getSex() + " 前列腺:" + student.getStudentHealthList().get(0).getProstate()); } }
别忘了把新增加的mapper映射注册到mybatis-config.xml配置文件中。
MyBatis之级联——鉴别器的更多相关文章
- MyBatis之级联小结
在这之前我们知道了MyBatis为我们提供了三种级联:一对一关系(assocation).一对多关系(collection).鉴别器(discriminator).在最后一个鉴别器例子中,看到了当层级 ...
- Springboot整合Mybatis实现级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- Spring Boot整合Mybatis完成级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- MyBatis之级联——一对一关系
在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系 ...
- MyBatis之级联——一对多关系
上次我们讲到了MyBatis的一对一关系的表示,简单回顾一下一对一关系就是一个学生只有一个学生证.那么什么是一对多关系呢?一个学生有多个课程这就是一对多的关系.我们结合上一章中的学生和学生证,在此基础 ...
- Mybatis 之级联查询 一对多配置
Mybatis级联 查询相对于hibenate是有点麻烦,但是相应好处也是有的,Mybatis轻量.根据自己要的字段配置方便 一对多配置用 <collection property=&quo ...
- mybatis之级联关系(一对一、一对多)
0. 表结构 1. 准备工作 1.1 配置文件等信息,请参考 myBatis之入门示例 1.2 entity 1.2.1 TPersonInfo.java package com.blueStarW ...
- mybatis 多级级联(多级嵌套)
注:笔者这里的嵌套可以用词有点欠缺,忘见谅 需求:用一个查询接口查出其结果集,这里就用伪代码标识要返回前端的类与类之间的关系. class 顶层{ String otherValue; LinkedL ...
- mybatis ----数据级联查询(多对一)
工程的目录结构: 有两个表,一个文章表article ,一个用户表user. create table article (id int(11) not null auto_increment, use ...
随机推荐
- 【转】FLEX中SharedObject介绍及应用
ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...
- Windows下检测文件名大小写是否匹配
跨平台开发有一个众所周知,但因为只是偶尔受到困扰,一般人不会在意的问题,就是windows对文件名大小写不敏感,而其他平台对文件名大小写敏感.因此可能出现在windows平台开发时一切正常,但部署/打 ...
- [转载]转载一篇好文章作为Java与面向对象之随感(3)
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很 ...
- struts2自定义日期类型转换器
在java web表单中提交的数据难免会有日期类型,struts2支持的日期类型是yyyy-MM-dd,如果是其他格式,就需要自己进行转换.比如yy-MM-dd 要完成自己定义的转换需要完成. 主要的 ...
- android中全局异常捕捉
android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...
- PLSQL创建定时任务
在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢?下面我简单介绍使用工具创建定时器的方法: 1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据 cr ...
- 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...
- .net 读取实体属性和描述注释
.net 读取实体属性和描述注释 class Program { static void Main(string[] args) { TEST test = new TEST(); test.MyNa ...
- Cocos2d-x性能分析-Android版本之Gprof
在 iOS 平台下我们可以用 Xcode 自带的 Profile 工具来测试我们程序的性能,Android 平台使用的 gprof 这里整理了一下具体的cocos2dx 使用gprof进行性能分析的具 ...
- STM32之呼吸灯实验
首先,我想引用一下在一片博文里 看到 的一段话,写的很详细, 首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6.TIM7这两个普通的定时器无法输出PWM外,其余的定时器都 ...