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 {
//主键id
private 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实现继承映射的更多相关文章

  1. mybatis 根据参数映射对应模型

    ORM 框架的优势在于能让我们利用面向对象的思维去操作数据库, hibernate 作为重量级的 ORM 框架对面向对象的支持很强大.作为半自动化的 mybatis ,对面向对象的支持也是很完备的.这 ...

  2. EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...

  3. 【Hibernate框架】三种继承映射

    一.综述 大家都知道,hibernate作为ORM框架的一个具体实现,最大的一个优点就是是我们的开发更加的能体现出"面向对象"的思想.在面向对象开发中,类与类之间是可以相互继承的( ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11  TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (36) ------ 第六章 继承与建模高级应用之TPC继承映射

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-12  TPC继承映射建模 问题 你有两张或多张架构和数据类似的表,你想使用TP ...

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

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

  7. 5.Mybatis的输出映射(就是对查询的结果集的映射)

    Mybatis的输出映射,也就是对查询结果集的一个映射,主要有两种: 1.resultType(不需要配置,可以直接用) 一般是实体类 基本类型也可以 2.resultMap(需要配置resultMa ...

  8. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  9. Hibernte继承映射

    继承映射分为三种: 继承结构共用一张表结构 每个类一张表结构 每个具体类一张表结构 下面使用Animal.Dog.Fish举例 Animal类如下: package com.hml.domain.a; ...

随机推荐

  1. Django知识点总结

    一.什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. web应 ...

  2. Django中类视图使用装饰器的方式

    类视图使用装饰器 为类视图添加装饰器,可以使用两种方法. 为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图. def ...

  3. GNU C 、ANSI C、标准C、标准c++区别和联系

    转载自点击打开链接 GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统.它在编写linux的时候自己制作了一个标准成为 ...

  4. Android SDK无法更新解决办法

    一.设置SDK代理 启动Android SDK Manager,选择菜单 Tools ->Options -> 代理地址: mirrors.opencas.cn 代理端口: 80 如下图: ...

  5. python使用progressbar显示进度条

    progressbar安装: pip install progressbar 用法一 # -*- coding=utf-8 -*- import time from progressbar impor ...

  6. vue运行原理

    Vue工作原理小结 本文能帮你做什么? 1.了解vue的双向数据绑定原理以及核心代码模块 2.缓解好奇心的同时了解如何实现双向绑定 为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简 ...

  7. 值类型struct在foreach中的陷阱

    最近踩了一个坑,为了优化代码,把class改为了struct,结果发现原来的初始化语句没有预期的运行,伪代码如下: public struct A { bool _isActive; public v ...

  8. threeJs中旋转位移等操作坐标系

    1.场景中的立方体.圆柱等三维模型的位置属性.平移方法参照Scene对象的世界坐标系 2.场景中立方体.圆柱等的三维模型的角度属性.旋转方法参照模型自身的模型坐标系

  9. JSP学习(一)JSP基础语法

    JSP基础语法 1.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素. JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. <%@ page language=&quo ...

  10. Luogu3576 POI2014 MRO-Ant colony 【树形DP】*

    Luogu3576 POI2014 MRO-Ant colony The ants are scavenging an abandoned ant hill in search of food. Th ...