摘录自:http://blog.csdn.net/y172158950/article/details/17505739

鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。[抄了一个定义,不是很理解,还是看例子吧]

1. 交通工具表vehicle

  1. create table test.vehicle (
  2. id bigint(10) primary key AUTO_INCREMENT,
  3. vin varchar(10),
  4. year date,
  5. color varchar(10),
  6. vendor varchar(10),
  7. vehicle_type int,    //类型:1表示car, 2表示boat
  8. door_count int,      //车门数量,car独有属性
  9. quant varchar(10)    //船桨,boat独有属性
  10. );

2. java对应的实体类Vehicle,Car,Boat

  1. package com.yjq.entity;
  2. import java.sql.Date;
  3. public class Vehicle {
  4. private int id;
  5. private String vin;  //交通登记号码
  6. private Date year;
  7. private String color;
  8. private String vendor;
  9. private int vehicleType;
  10. public Vehicle() {
  11. }
  12. public int getId() {
  13. return id;
  14. }
  15. public void setId(int id) {
  16. this.id = id;
  17. }
  18. public String getVin() {
  19. return vin;
  20. }
  21. public void setVin(String vin) {
  22. this.vin = vin;
  23. }
  24. public Date getYear() {
  25. return year;
  26. }
  27. public void setYear(Date year) {
  28. this.year = year;
  29. }
  30. public String getColor() {
  31. return color;
  32. }
  33. public void setColor(String color) {
  34. this.color = color;
  35. }
  36. public String getVendor() {
  37. return vendor;
  38. }
  39. public void setVendor(String vendor) {
  40. this.vendor = vendor;
  41. }
  42. public int getVehicleType() {
  43. return vehicleType;
  44. }
  45. public void setVehicleType(int vehicleType) {
  46. this.vehicleType = vehicleType;
  47. }
  48. }
  1. <p>package com.yjq.entity;</p><p>public class Car extends Vehicle {
  2. private int doorCount;</p><p>   public Car() {
  3. }</p><p>    public int getDoorCount() {
  4. return doorCount;
  5. }</p><p>    public void setDoorCount(int doorCount) {
  6. this.doorCount = doorCount;
  7. }
  8. }
  9. </p>
  1. package com.yjq.entity;
  2. public class Boat extends Vehicle {
  3. private String quant;  //船桨
  4. public Boat() {
  5. }
  6. public String getQuant() {
  7. return quant;
  8. }
  9. public void setQuant(String quant) {
  10. this.quant = quant;
  11. }
  12. }

3. 如何将查询结果映射为不同的对象呢?鉴别器登场

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.yjq.entity.Vehicle">
  4. <resultMap id="vehicleResult" type="Vehicle">
  5. <id property="id" column="id" />
  6. <result property="vin" column="vin"/>
  7. <result property="year" column="year"/>
  8. <result property="vendor" column="vendor"/>
  9. <result property="color" column="color"/>
  10. <result property="vehicleType" column="vehicle_type"/>
  11. <discriminator javaType="int" column="vehicle_type">
  12. <case value="1" resultMap="carResult"/>
  13. <case value="2" resultMap="boatResult"/>
  14. </discriminator>
  15. </resultMap>
  16. <resultMap id="carResult" type="Car">
  17. <result property="vehicleType" column="vehicle_type"/>
  18. <result property="doorCount" column="door_count" />
  19. </resultMap>
  20. <resultMap id="boatResult" type="Boat">
  21. <result property="vehicleType" column="vehicle_type"/>
  22. <result property="quant" column="quant" />
  23. </resultMap>
  24. <select id="selectVehicle" parameterType="int" resultMap="vehicleResult">
  25. select * from vehicle where id =#{id};
  26. </select>
  27. </mapper>

4. 表中的数据

5. dao代码,看看查询效果

  1. package com.yjq.dao;
  2. import org.apache.ibatis.session.SqlSession;
  3. import com.yjq.db.DbFactory;
  4. import com.yjq.entity.Boat;
  5. import com.yjq.entity.Car;
  6. import com.yjq.entity.Vehicle;
  7. public class VehicleDao {
  8. public Vehicle selectVehicleById(int id) {
  9. SqlSession session = DbFactory.getInstance().openSession();
  10. Vehicle vehicle = (Vehicle) session.selectOne("com.yjq.entity.Vehicle.selectVehicle", id);
  11. session.commit();
  12. session.close();
  13. return vehicle;
  14. }
  15. public static void print(Vehicle v) {
  16. if(v instanceof Car) {
  17. Car c = (Car)v;
  18. System.out.println("Car: [id=" + c.getId() + ", vehicleType="
  19. + c.getVehicleType() + ", doorCount=" + c.getDoorCount() + "]");
  20. } else if (v instanceof Boat) {
  21. Boat b = (Boat)v;
  22. System.out.println("Boat: [id=" + b.getId() + ", vehicleType="
  23. + b.getVehicleType() + ", quant=" + b.getQuant() + "]");
  24. } else {
  25. System.out.println("Vehicle: [id=" + v.getId() + ", vehicleType="
  26. + v.getVehicleType() + "]");
  27. }
  28. }
  29. public static void main(String[] args) {
  30. VehicleDao dao = new VehicleDao();
  31. Vehicle v1 = dao.selectVehicleById(1);
  32. Vehicle v2 = dao.selectVehicleById(2);
  33. Vehicle v3 = dao.selectVehicleById(3);
  34. VehicleDao.print(v1);
  35. VehicleDao.print(v2);
  36. VehicleDao.print(v3);
  37. }
  38. }
  1. //output
  2. Car: [id=1, vehicleType=1, doorCount=4]
  3. Boat: [id=2, vehicleType=2, quant=lxj]
  4. Vehicle: [id=3, vehicleType=3]

mybatis_SQL映射(4)鉴别器的更多相关文章

  1. mybatis_SQL映射(1)

    文章摘录自:http://blog.csdn.net/y172158950/article/details/17258377 1. select的映射 <select id="sele ...

  2. mybatis_SQL映射(3)

    文章摘录自:http://blog.csdn.net/y172158950/article/details/17304645 1. 表关联 a) 嵌套查询(传说中的1+N问题) <resultM ...

  3. mybatis_SQL映射(2)

    文章摘录自:http://blog.csdn.net/y172158950/article/details/17258377 1. sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段. ...

  4. [Deep-Learning-with-Python]GAN图片生成

    GAN 由Goodfellow等人于2014年引入的生成对抗网络(GAN)是用于学习图像潜在空间的VAE的替代方案.它们通过强制生成的图像在统计上几乎与真实图像几乎无法区分,从而能够生成相当逼真的合成 ...

  5. 阿里P7终于讲完了JDK+Spring+mybatis+Dubbo+SpringMvc+Netty源码

    前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌 ...

  6. MyBatis从入门到精通(十三):使用discriminator鉴别器映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解鉴别器映射discri ...

  7. Mybatis3.1-[tp_36-37]-_映射文件_select_resultMap关联查询__分步查询传递多列值&fetchType_discriminator鉴别器

    _分步查询传递多列值&fetchType_discriminator鉴别器 笔记要点出错分析与总结 Department.java bean public class Department { ...

  8. NHibernate之映射文件配置说明

    NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...

  9. hibernate笔记--继承映射关系的三种实现方式

    单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...

随机推荐

  1. leetcode — reorder-list

    /** * Source : https://oj.leetcode.com/problems/reorder-list/ * * Given a singly linked list L: L0→L ...

  2. MySQL安装的三种方式

    .markdown-preview:not([data-use-github-style]) { padding: 2em; font-size: 1.2em; color: rgb(171, 178 ...

  3. ABP架构学习系列一 整体项目结构及目录

    本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...

  4. Visual Studio Code+phpstudy(WampServer、LNMP...)为小白打造PHP开发环境

    VS Code是微软近年推出的一款文本编辑器, 相关下载:https://code.visualstudio.com/Download phpstudy是将Apache/Nginx.PHP.MySQ等 ...

  5. BIOS 品牌快捷键

    主板品牌 启动按键 笔记本品牌 启动按键 台式机品牌 启动按键 华硕主板 F8 联想笔记本 F12 联想台式机 F12 技嘉主板 F12 宏基笔记本 F12 惠普台式机 F12 微星主板 F11 华硕 ...

  6. SAP成都研究院35岁以上的开发人员都去哪儿了?

    2006年成立的SAP成都研究院,位于天府软件园B区.如今,因为研究院发展的不断壮大, 已经搬迁到天府软件园E区了,因此,发生在图片building各种充满悲欢离合的故事,已经成为一部分小伙伴脑海中难 ...

  7. Redis进阶实践之二如何在Linux系统上安装安装Redis

    一.引言      上一篇文章写了"如何安装VMware Pro虚拟机"和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我们才可以在该系统上安装Redis. ...

  8. 从Unity中的Attribute到AOP(四)

    本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...

  9. OC 异步顺序加载的方法

    方法一:发射信号量 OC -异步顺序加载 先调用A接口,再调用B接口,再调用C接口 dispatch_semaphore_t semaphore = dispatch_semaphore_create ...

  10. 一个标准的WebView示例

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...