http://www.tuicool.com/articles/I7rQBnB

ORM 框架的优势在于能让我们利用面向对象的思维去操作数据库,hibernate作为重量级的 ORM 框架对面向对象的支持很强大。作为半自动化的 mybatis,对面向对象的支持也是很完备的。这篇文章就来讨论一下如何利用mybatis

实现继承映射。

类图

有一个机动车父类,它有两个子类: Car 和 Bus

关系模型 (t_vehicle)

ORM 映射有一个原则:对象模型细粒度,关系模型粗粒度。所以我们将所有的车都存储一张表里(t_vehicle),通过鉴别字段 vType 来区分车的类型( "c" 代表 Car , "b" 代表 Bus )

三个实体类的代码

Vehicle

package com.tgb.mybatis.model;public class Vehicle {//主键idprivate String id;//车的名字private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Car

package com.tgb.mybatis.model;public class Car extends Vehicle {//车门的数量private int carDoor;//车的牌子private String band;public int getCarDoor() {return carDoor;}public void setCarDoor(int carDoor) {this.carDoor = carDoor;}public String getBand() {return band;}public void setBand(String band) {this.band = band;}}

Bus

package com.tgb.mybatis.model;public class Bus extends Vehicle {//公共汽车的容量private int capacity;public int getCapacity() {return capacity;}public void setCapacity(int capacity) {this.capacity = capacity;}}

看看对“车”进行操作的 Mapper 接口【只关注查询】

package com.tgb.mybatis.data;import com.tgb.mybatis.model.Bus;
import com.tgb.mybatis.model.Car;
import com.tgb.mybatis.model.Vehicle;public interface VehicleMapper {//根据id查询机动车Vehicle getVechicleById(String id);//根据名字查询小汽车Car getCarByName(String name);
}

xml 方式 ORM 映射

<?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.tgb.mybatis.data.VehicleMapper"><select id="getVechicleById" resultMap="vehicleMap">SELECT * FROM TB_VEHICLE WHERE VID = #{id}</select><select id="getCarByName" resultMap="vehicleMap">SELECT * FROM TB_VEHICLE WHERE VTYPE='c' AND VName = #{id}</select><resultMap type="vehicle" id="vehicleMap"><id property="id" column="vId"/><result property="name" column="vName"/><discriminator javaType="string" column="vType"><case value="c" resultType="car"><result property="carDoor" column="cardoor"/><result property="band" column="band"/></case><case value="b" resultType="bus"><result property="capacity" column="capacity"/></case></discriminator></resultMap>
</mapper>

分析

其中最为关键的就是<discriminator > 标签中的内容,根据鉴别字段的值自动映射成对应的子类

客户端测试代码

VehicleMapper mapper = session.getMapper(VehicleMapper.class);
Vehicle vehicle = mapper.getVechicleById("1");
System.out.println(vehicle.getName());
Car car = mapper.getCarByName("路虎007");
System.out.println(car.getBand());

很简单的一个例子,和大家分享一下

mybatis discriminator 鉴定器相关推荐

  1. Mybatis resultMap discriminator(鉴定器) 实操

    文章目录 实体对象 Mapper 文件配置 测试用例 接口调用响应 数据库数据 数据库表结构 实体对象 @Data public class SysUser {private Long id;priv ...

  2. Mybatis Interceptor 拦截器原理 源码分析

    Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插件前最 ...

  3. mybatis使用拦截器显示sql,使用druid配置连接信息

    mybatis使用拦截器显示sql,使用druid配置连接信息 mybatis sql Druid 1.显示出sql内容: 新建2个类: MybatisInterceptor :拦截sql,并获得输出 ...

  4. ExifTool文件鉴定器

    ExifTool文件鉴定器 ExifTool常被拿来做照片信息读取,也可对任意文件进行读取 官方源码下载地址:https://metacpan.org/release/Image-ExifTool 普 ...

  5. Mybatis 通过拦截器动态修改SQL

    01 使用场景 当我们在多租户的项目中,编写SQL语句都要带上tenant字段,用于区分不同的租户只能操作自己的数据. 比如,像下面的SQL select * from member where id ...

  6. mybatis 自定义拦截器

    拦截器注解 mybatis自定义拦截器实现步骤: 实现org.apache.ibatis.plugin.Interceptor接口. 添加拦截器注解org.apache.ibatis.plugin.I ...

  7. 一步步教你mybatis分页,mybatis分页拦截器 使用,mybatis拦截器分页

              mybatis 分页详解.mybatis分页查询,mybatis分页拦截器使用.struts2下mybatis分页 mybatis默认是支持分页的,内部通过创建可滚动的Result ...

  8. 分享一个U盘容量鉴定软件 360u盘鉴定器

    分享一个U盘容量鉴定软件   360u盘鉴定器 ,官方提取出来的.很小的软件,携带方便,只有1.9M. 也可以鉴定其它U盘,点下图箭头处. 下载地址为:http://www.400gb.com/fil ...

  9. mybatis学习(54):鉴定器

    数据库表 数据库叫blog_gp1701 author表 数据 blog表 数据 comment表 数据 post表 数据 vechcle 目录结构 jar包导入 先给对应的jar包导入 建立一个ju ...

  10. 【MyBatis】 ---- 映射器(接口+XML文件)

    目录 一. 配置元素 1. select元素 2. insert元素 3. sql元素 4. resultMap元素 5. resultMap元素中的级联 (代码github) 一.映射器的配置元素 ...

最新文章

  1. 在HTML5 localStorage中存储对象
  2. Session,Cookie,jsessionid,Url重写
  3. 【渝粤题库】陕西师范大学200671 电子技术基础
  4. node.js 将文件目录读取 通过匿名函数自执行 将异步改为同步
  5. Python中的openpyxl如何对excel修改文件
  6. 【java】我工作三年了,该懂并发了!
  7. 10.N个整数中查找是否相加为K[深度搜索]
  8. Flutter进阶—创建有状态控件
  9. GBDT原理及利用GBDT构造新的特征-Python实现
  10. 如何使用jQuery将事件附加到动态HTML元素? [重复]
  11. labelme批量转换json
  12. android cpu降温代码,Android手机CM设置中CPU模式解释
  13. .Net framework 3.5缺失解决
  14. IPv4 至 IPv6改造过渡方案
  15. [灯哥开源—四足机器人]程序算法讲解与STM32移植——运行框架(两个主线程)
  16. Python —— 数据科学的手段 (第2版)配套代码
  17. 金蝶迷你版所有数据引出excel没有反应,如何处理
  18. android 微信分享多张图片大小,Android 关于微信分享图片过大失败的解决方案
  19. win10 蓝牙无法删除 完美解决方案
  20. Android:视频播放器dkplayer

热门文章

  1. 开发一个 app 有多难?
  2. ce修改植物大战僵尸之植物无冷却
  3. 《Python助力交通》公众号说明
  4. 计算机应用工程师如何评定,个人如何申请工程师职称评定
  5. 如何快速选购腾讯云DNS解析服务?
  6. 网站域名备案密码的获取方法
  7. 苹果开发者中心添加UDID设备教程(及获取苹果手机的UDUD)
  8. 利用Matlab进行根轨迹分析法
  9. Mplay 常用命令及功能简介
  10. BUUCTF Misc 神秘龙卷风