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 ...
随机推荐
- js正则表达test、exec和match的区别
test的用法和exec一致,只不过返回值是 true false. 以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用. 最近开发遇到一些 ...
- php获取checkbox数组的表单数据
提交表单的时候,对于checkbox多选框,name="field[]",此时php获取的数组为:从0开始的索引数组:如果name="field[n]" 有数字 ...
- 原型链、prototype、_proto_那些事
一.概念 1.Prototype:每一个构造函数都有一个原型对象,这个对象就是Prototype.这个构造函数如何找到他的原型对象呢?每个构造函数都会有一个prototype属性,指向它的原型对象. ...
- android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测
我们在设计软件的时候,需要记录软件设置的基本信息,那么怎么来保存他们呢?我们可以使用SharedPreferences. SharedPreferences是一个xml文件,用来存储软件的常规设置 ...
- 常用SQL_官方文档使用
SQL语句基础理论 SQL是操作和检索关系型数据库的标准语言,标准SQL语句可用于操作关系型数据库. 5大主要类型: ①DQL(Data Query Language,数据查询语言)语句,主要由于se ...
- VS窗体选择BackGroupImage属性报错:已添加具有相同键的项
高墙我今天第一次遇见这个问题.既然说是"已添加具有相同键的项."那我自然地认为会不会是文件夹哪里命名了两个相同的文件名.然后在这个Exception上越走越远. 好了不说废话.出现 ...
- 《Python自然语言处理》第二章-习题解答-练习6
问题描述:在比较词表的讨论中,创建一个对象叫做translate,通过它你可以使用德语和意大利语词汇查找对应的英语词汇.这种方法可能会出现什么问题,你能提出一个办法来避免这个问题吗? 虽然这是一道初级 ...
- 苹果新手MacBook 目录认识
最近,开发平台从windows转型到mac. 刚开始还真不适应 不过使用了几天之后 还是很不错的. 那么我们来认识一下目录,用过linux的应该很好适应unix的mac MAC是Unix系统 和Win ...
- ES6 对let声明的一点思考
说到ES6的let变量声明,我估计很多人会想起下面几个主要的特点: 没有变量声明提升 拥有块级作用域 暂时死区 不能重复声明 很多教程和总结基本都说到了这几点(说实话大部分文章都大同小异,摘录的居多) ...
- 如何用unity3d实现发送带附件的邮件
以Gmail为例.点击屏幕的Capture按钮得到当前屏幕截图,点击Send按钮将之前的截图作为附件发送邮件. using UnityEngine; using System.Collections; ...