摘录自: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. 用 HAproxy 搭建 RabbitMQ 集群

    构建参考: [ Rabbitmq cluster setup with HAproxy ] [ python demo ] RabbitMQ Cluster 遇到的问题 python pika 作为c ...

  2. Pycharm选择pyenv安装的Python版本

    在macOS上使用pyenv实现Python多版本共存后,pyenv安装的Python版本存在于macOS下的 ~/.pyenv/versions/下. 在Pycharm时,选择此目录下对应的版本即可 ...

  3. A session had already been started – ignoring session_start() 怎么办?

    php警告提示A session had already been started – ignoring session_start() 解决方案 访问log日志发现有个这样的警告 主要是在TP框架中 ...

  4. c# socket 粘包 其实。。。

    文章内容有错,请直接关闭~~~不要看了.丢人. private static Dictionary<string, Packet> cache = new Dictionary<st ...

  5. while100以内的偶数

    #显示100以内的偶数 #声明i i = 1 #开始循环条件为i不等于100,执行while代码块 while i != 100: #给i加1 i +=1 #如果循环到此时i的取余运算为0则打印i i ...

  6. master_pos_wait函数与MySQL主从切换

    背景 主从切换是高可用MySQL架构的必要步骤(即使用不发生,也要有备无患).一般设置为双M(M1.M2),假设当前状态为写M1,而M2只读,切换的大致流程如下: 1.  停止应用写M1,将M1设置为 ...

  7. 开启 TLS 1.3 加密协议,极速 HTTPS 体验

    随着互联网的发展,用户对网络速度的要求也越来越高,尤其是目前在大力发展 HTTPS 的情况下,TLS 加密协议变得至关重要.又拍云在 HTTPS 的普及和性能优化上,始终做着自己的努力和贡献.2018 ...

  8. Java集合系列[3]----HashMap源码分析

    前面我们已经分析了ArrayList和LinkedList这两个集合,我们知道ArrayList是基于数组实现的,LinkedList是基于链表实现的.它们各自有自己的优劣势,例如ArrayList在 ...

  9. spring官方学习地址

    1.http://projects.spring.io/spring-framework/ 2.https://github.com/spring-projects/spring-mvc-showca ...

  10. 关于JS中变量提升的规则和原理的一点理解(二)

    上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...