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中可以使用单表的继承映 ...
随机推荐
- 微信小程序开发教程目录
本系列教程是自己在工作中使用到而记录的,没有顺序之分 如有错误之处,请给与指正,也不希望误导了别人 微信小程序开发教程目录 微信小程序之注册和入门 微信小程序之HTTPS请求 微信小程序开发之选项卡 ...
- 关于 jar 包数据更新的问题
参考: 人乐草心的博文 如果要更新一个 jar 包内文件的一些信息,又不想重新编译,发包,可以如下操作. Extract JAR file unzip 拆包方式 unzip xxx.jar [ -d ...
- rpc之thrift
rpc之thrift 一.介绍 thrift是一个rpc(remove procedure call)框架,可以实现不同的语言(java.c++.js.python.ruby.c#等)之间的相互调用. ...
- StringMVC @RequestMapping method属性
@RequestMapping(value="/testMethod",method=RequestMethod.POST) public String testMethod(){ ...
- Sql 关于 查俩个表 第二个表用到第一个表的某一个数据
今天在写程序的时候遇到一个问题 有一个这个需求 select top 1 Name,[Address] from UserInfo;select * from shoppingAddress whe ...
- Nginx中并发性能相关配置参数说明
worker_processes:开启worker进程的数目,通常可设置为CPU核心的倍数.在不清楚的情况下,可设置成一倍于CPU核心数或auto(Nginx将自动发现CPU核心数). worker_ ...
- css半透明边框
html <div class="parent"> <div class="translucent">I am Bob</div& ...
- 深入研究ES6 Generators
ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发 如果你还不知道 ...
- TensorBoard的使用(结合线性模型)
TensorBoard是TensorFlow 的可视化工具.主要为了更方便用户理解 TensorFlow 程序.调试与优化,用户可以用 TensorBoard 来展现 TensorFlow 图像,绘制 ...
- python 3.x 与2.x的区别
前言 保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby.现在不单单是要学python,还在考虑用它做点什么,这些等后续再说吧,因为看的是python2 ...