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());

  

转[ http://blog.csdn.net/wzwenhuan/article/details/36031021]

最新文章

  1. bootstrap datetimerange
  2. XMPP客户端开发(1)--连接和登录
  3. 设置text-overflow文本溢出隐藏时的对齐问题
  4. java分享第五天(数组)
  5. mysql的多表查询
  6. nrf51822-主从通信分析2
  7. Android初体验
  8. 不用FTP使用SecureCRT上传下载文件,并解决rz、sz command not found异常
  9. [Angular-Scaled Web] 7. Refactor code into Models
  10. Git配置安装使用教程操作github上传克隆数据
  11. /usr 的由来及/usr目录结
  12. python 中调用shell命令
  13. Mac系统占用空间大、空间不够、查看系统文件大小分布
  14. 芝麻HTTP:
  15. SSH和SSM对比总结
  16. python 3 爬取某小说网站小说,注释详细
  17. MSSQL清理日志\删除数据\收缩数据库
  18. 【转】 C++析构函数的作用和用法
  19. Google - chanceToLose24Game
  20. Intellij IDEA的下载和使用(针对学生的免费使用计划)

热门文章

  1. Git图形化界面客户端
  2. 面向对象+JAVA基础
  3. 快速部署私人git服务--基于docker化Gogs
  4. Maven项目构建过程练习
  5. js源生ajax
  6. Python类的部分
  7. centos7安装 owncloud注意事项
  8. Django_admin组件
  9. Docker系列08:容器监控
  10. Node学习笔记(二)