使用鉴别器,根据表中某个字段区别数据,将查询出的数据自动封装成不同类型的对象。
步骤
实现此案例需要按照如下步骤进行。
步骤一:建表
创建汽车表,并插入预置数据,脚本如下:
- CREATE TABLE t_car (
- id NUMBER(11) NOT NULL,
- type VARCHAR2(1) default NULL,
- doorSize NUMBER(11) default NULL,
- boxSize NUMBER(11) default NULL,
- color VARCHAR2(20) default NULL,
- PRIMARY KEY (id)
- );
- insert into t_car values (1,'C',2,null,'红色');
- insert into t_car values (2,'C',4,null,'黑色');
- insert into t_car values (3,'T',null,1,'蓝色');
- insert into t_car values (4,'T',null,2,'蓝色');
- commit;
步骤二:创建实体类
创建交通工具实体类Vehicle,封装汽车表中的公用字段,代码如下:
- package cn.edu.tju.entity;
- /**
- * 交通工具实体类,封装汽车表中公用的字段
- */
- public class Vehicle {
- private int id;
- private String type;
- private String color;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- public String getColor() {
- return color;
- }
- public void setColor(String color) {
- this.color = color;
- }
- }
创建小汽车实体类,继承于Vehicle,并封装小汽车相关的字段,代码如下:
- package cn.edu.tju.entity;
- /**
- * 小汽车实体类,封装小汽车相关字段
- */
- public class Car extends Vehicle {
- private int doorSize;
- public int getDoorSize() {
- return doorSize;
- }
- public void setDoorSize(int doorSize) {
- this.doorSize = doorSize;
- }
- }
创建卡车实体类,继承于Vehicle,并封装卡车相关的字段,代码如下:
- package cn.edu.tju.entity;
- /**
- * 卡车实体类,封装卡车相关的字段
- */
- public class Truck extends Vehicle {
- private int boxSize;
- public int getBoxSize() {
- return boxSize;
- }
- public void setBoxSize(int boxSize) {
- this.boxSize = boxSize;
- }
- }
步骤三:创建DAO接口
创建DAO接口VehicleDao,并增加查询全部汽车数据的方法,代码如下:
- package cn.edu.tju.dao;
- import java.util.List;
- import cn.edu.tju.annotation.MyBatisRepository;
- import cn.edu.tju.entity.Vehicle;
- @MyBatisRepository
- public interface VehicleDao {
- List<Vehicle> findAll();
- }
步骤四:创建映射文件
创建映射文件VehicleMapper.xml,并增加SQL实现查询全部汽车,代码如下:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
- "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
- <mapper namespace="com.tarena.dao.VehicleDao">
- <resultMap id="vehicleMap" type="c cn.edu.tju.entity.Vehicle">
- <id property="id" column="ID" />
- <result property="color" column="COLOR" />
- <discriminator javaType="java.lang.String" column="TYPE">
- <case value="T" resultType=" cn.edu.tju.entity.Truck">
- <result property="boxSize" column="BOXSIZE" />
- </case>
- <case value="C" resultType="cn.edu.tju.entity.Car">
- <result property="doorSize" column="DOORSIZE" />
- </case>
- </discriminator>
- </resultMap>
- <select id="findAll" resultMap="vehicleMap">
- select * from T_CAR
- </select>
- </mapper>
步骤五:增加测试方法
在TestMapping中增加方法,测试查询全部汽车的方法,代码如下:
- package cn.edu.tju..test;
- import java.sql.Date;
- import java.util.List;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import cn.edu.tju.daoDeptDao;
- import cn.edu.tju.dao.EmpDao;
- import cn.edu.tju.VehicleDao;
- import cn.edu.tju.entity.Dept;
- import cn.edu.tju.entity.Emp;
- import cn.edu.tju.entity.Vehicle;
- /**
- * 测试MyBatis关联映射
- */
- public class TestMapping {
-
- //其他方法略
- /**
- * 鉴别器:
- * 查询汽车表,根据类型封装成不同的对象。
- */
- @Test
- public void test6() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext(
- "applicationContext.xml");
- VehicleDao dao = ctx.getBean(VehicleDao.class);
- List<Vehicle> list = dao.findAll();
- for (Vehicle v : list) {
- System.out.println(v);
- }
- }
-
- }