mybatis_SQL映射(4)鉴别器
摘录自:http://blog.csdn.net/y172158950/article/details/17505739
鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。[抄了一个定义,不是很理解,还是看例子吧]
1. 交通工具表vehicle
- create table test.vehicle (
- id bigint(10) primary key AUTO_INCREMENT,
- vin varchar(10),
- year date,
- color varchar(10),
- vendor varchar(10),
- vehicle_type int, //类型:1表示car, 2表示boat
- door_count int, //车门数量,car独有属性
- quant varchar(10) //船桨,boat独有属性
- );
2. java对应的实体类Vehicle,Car,Boat
- package com.yjq.entity;
- import java.sql.Date;
- public class Vehicle {
- private int id;
- private String vin; //交通登记号码
- private Date year;
- private String color;
- private String vendor;
- private int vehicleType;
- public Vehicle() {
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getVin() {
- return vin;
- }
- public void setVin(String vin) {
- this.vin = vin;
- }
- public Date getYear() {
- return year;
- }
- public void setYear(Date year) {
- this.year = year;
- }
- public String getColor() {
- return color;
- }
- public void setColor(String color) {
- this.color = color;
- }
- public String getVendor() {
- return vendor;
- }
- public void setVendor(String vendor) {
- this.vendor = vendor;
- }
- public int getVehicleType() {
- return vehicleType;
- }
- public void setVehicleType(int vehicleType) {
- this.vehicleType = vehicleType;
- }
- }
- <p>package com.yjq.entity;</p><p>public class Car extends Vehicle {
- private int doorCount;</p><p> public Car() {
- }</p><p> public int getDoorCount() {
- return doorCount;
- }</p><p> public void setDoorCount(int doorCount) {
- this.doorCount = doorCount;
- }
- }
- </p>
- package com.yjq.entity;
- public class Boat extends Vehicle {
- private String quant; //船桨
- public Boat() {
- }
- public String getQuant() {
- return quant;
- }
- public void setQuant(String quant) {
- this.quant = quant;
- }
- }
3. 如何将查询结果映射为不同的对象呢?鉴别器登场
- <?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="com.yjq.entity.Vehicle">
- <resultMap id="vehicleResult" type="Vehicle">
- <id property="id" column="id" />
- <result property="vin" column="vin"/>
- <result property="year" column="year"/>
- <result property="vendor" column="vendor"/>
- <result property="color" column="color"/>
- <result property="vehicleType" column="vehicle_type"/>
- <discriminator javaType="int" column="vehicle_type">
- <case value="1" resultMap="carResult"/>
- <case value="2" resultMap="boatResult"/>
- </discriminator>
- </resultMap>
- <resultMap id="carResult" type="Car">
- <result property="vehicleType" column="vehicle_type"/>
- <result property="doorCount" column="door_count" />
- </resultMap>
- <resultMap id="boatResult" type="Boat">
- <result property="vehicleType" column="vehicle_type"/>
- <result property="quant" column="quant" />
- </resultMap>
- <select id="selectVehicle" parameterType="int" resultMap="vehicleResult">
- select * from vehicle where id =#{id};
- </select>
- </mapper>
4. 表中的数据
5. dao代码,看看查询效果
- package com.yjq.dao;
- import org.apache.ibatis.session.SqlSession;
- import com.yjq.db.DbFactory;
- import com.yjq.entity.Boat;
- import com.yjq.entity.Car;
- import com.yjq.entity.Vehicle;
- public class VehicleDao {
- public Vehicle selectVehicleById(int id) {
- SqlSession session = DbFactory.getInstance().openSession();
- Vehicle vehicle = (Vehicle) session.selectOne("com.yjq.entity.Vehicle.selectVehicle", id);
- session.commit();
- session.close();
- return vehicle;
- }
- public static void print(Vehicle v) {
- if(v instanceof Car) {
- Car c = (Car)v;
- System.out.println("Car: [id=" + c.getId() + ", vehicleType="
- + c.getVehicleType() + ", doorCount=" + c.getDoorCount() + "]");
- } else if (v instanceof Boat) {
- Boat b = (Boat)v;
- System.out.println("Boat: [id=" + b.getId() + ", vehicleType="
- + b.getVehicleType() + ", quant=" + b.getQuant() + "]");
- } else {
- System.out.println("Vehicle: [id=" + v.getId() + ", vehicleType="
- + v.getVehicleType() + "]");
- }
- }
- public static void main(String[] args) {
- VehicleDao dao = new VehicleDao();
- Vehicle v1 = dao.selectVehicleById(1);
- Vehicle v2 = dao.selectVehicleById(2);
- Vehicle v3 = dao.selectVehicleById(3);
- VehicleDao.print(v1);
- VehicleDao.print(v2);
- VehicleDao.print(v3);
- }
- }
- //output
- Car: [id=1, vehicleType=1, doorCount=4]
- Boat: [id=2, vehicleType=2, quant=lxj]
- Vehicle: [id=3, vehicleType=3]
mybatis_SQL映射(4)鉴别器的更多相关文章
- mybatis_SQL映射(1)
文章摘录自:http://blog.csdn.net/y172158950/article/details/17258377 1. select的映射 <select id="sele ...
- mybatis_SQL映射(3)
文章摘录自:http://blog.csdn.net/y172158950/article/details/17304645 1. 表关联 a) 嵌套查询(传说中的1+N问题) <resultM ...
- mybatis_SQL映射(2)
文章摘录自:http://blog.csdn.net/y172158950/article/details/17258377 1. sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段. ...
- [Deep-Learning-with-Python]GAN图片生成
GAN 由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在空间的VAE的替代方案.它们通过强制生成的图像在统计上几乎与真实图像几乎无法区分,从而能够生成相当逼真的合成 ...
- 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码
前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...
- MyBatis从入门到精通(十三):使用discriminator鉴别器映射
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解鉴别器映射discri ...
- Mybatis3.1-[tp_36-37]-_映射文件_select_resultMap关联查询__分步查询传递多列值&fetchType_discriminator鉴别器
_分步查询传递多列值&fetchType_discriminator鉴别器 笔记要点出错分析与总结 Department.java bean public class Department { ...
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- hibernate笔记--继承映射关系的三种实现方式
单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...
随机推荐
- java多线程(一)-概述
最近这段在看java多线程编程方面的东西.所以特写了几篇文章,来总结和回顾一下自己所学习到的相关知识.因为水平有限,文章中总结不全面甚至理解错误的地方,欢迎读者指点批评. 我们平时所接触到的程序,都是 ...
- TurnipBit—MicroPython开发板:妥妥拽拽零基础也能玩编程
可视化编程网站入口:www.turnipbit.com 说到编程.谈到硬件,你也许会想到屌丝逆袭女神的"传奇"故事,也许会浮现出带着眼镜.头发稀少.无精打采的程序猿形象." ...
- JDBC详解系列(三)之建立连接(DriverManager.getConnection)
在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...
- NUnit实战,第一个测试类,测试事件触发是否是并行的
以前测试都是新建一个控制台测试的方式来进行,感觉版本管理啥的非常麻烦.也是非常原始的办法.后来想以前有写过测试单元,不过好久没弄了.Nuget了NUnit后写了正式的第一个测试类. 测试用例: 测试事 ...
- easy ui Tree请求跨域数据
扯淡篇: jQuery EasyUI为提供了大多数UI控件的使用,如:accordion,combobox,menu,dialog,tabs,validatebox,datagrid,window,t ...
- 解决api、WebService跨域问题
webapi接口在ajax调用的很多情况下都会出现跨域问题,同样的WebService如果想用ajax调用,也需要接口跨域问题,解决方案如下: 1.IIS配置 打开IIS选择发布后的webapi或者是 ...
- Java的参数传递是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个对象实例作为一个参数被传递到方法中 ...
- js网页返回顶部和楼层跳跃的实现原理
这是简单的效果图. (实现楼层间的跳跃,主要依靠的是 window.scrollTo(x,y)方法 ,将浏览器的可见区域移动到指定的x,y坐标上.) 说楼层跳跃前,先温习下,一般网页在高度较大时, ...
- DOM拓展
DOM拓展 1.选择符API 所谓选择符API即是根据css选择符选择与某个模式相匹配的DOM元素,jQuery的核心就是通过css选择符查询DOM文档取得元素的引用,从而抛弃了原有繁琐的getELe ...
- Angular整合zTree
1 前提准备 1.1 新建一个angular4项目 参考博文:点击前往 1.2 去zTree官网下载zTree zTree官网:点击前往 三少使用的版本:点击前往 2 编程步骤 从打印出zTree对象 ...