Mybatis学习第23节 -- 鉴别器 discriminator

discriminator或者叫做分类器

Vehicle类

 
package io.github.coinsjack.pojo;

import java.util.Date;

public class Vehicle {

    protected Integer id;    protected String vin;    protected Date year;    protected String make;    protected  String model;    protected String color;

    public Vehicle() {    }

    public Integer getId() {        return id;    }

    public void setId(Integer id) {        this.id = id;    }
}

Car继承自Vehicle

package io.github.coinsjack.pojo;

public class Car extends Vehicle {

    private Integer doorCount;

    public Car() {    }

    public Integer getDoorCount() {        return doorCount;    }

    public void setDoorCount(Integer doorCount) {        this.doorCount = doorCount;    }

    @Override    public String toString() {        return "Car{" +                "doorCount=" + doorCount +                ", id=" + id +                ", vin=‘" + vin + ‘\‘‘ +                ", year=" + year +                ", make=‘" + make + ‘\‘‘ +                ", model=‘" + model + ‘\‘‘ +                ", color=‘" + color + ‘\‘‘ +                ‘}‘;    }}

Suv继承自Vehicle

package io.github.coinsjack.pojo;

public class Suv extends Vehicle{

    private Boolean allWheelDriveFlag;

    public Suv() {    }    public Boolean getAllWheelDriveFlag() {        return allWheelDriveFlag;    }    public void setAllWheelDriveFlag(Boolean allWheelDriveFlag) {        this.allWheelDriveFlag = allWheelDriveFlag;    }    @Override    public String toString() {        return "Suv{" +                "allWheelDriveFlag=" + allWheelDriveFlag +                ", id=" + id +                ", vin=‘" + vin + ‘\‘‘ +                ", year=" + year +                ", make=‘" + make + ‘\‘‘ +                ", model=‘" + model + ‘\‘‘ +                ", color=‘" + color + ‘\‘‘ +                ‘}‘;    }}

数据库表字段

id int(11) NO PRI auto_increment
vin varchar(50) YES   
year year(4) YES   
make varchar(50) YES   
model varchar(20) YES   
color varchar(20) YES   
vehicle_type int(11) YES   
door_count int(11) YES   
all_wheel_drive tinyint(1) YES   

通过vehicle_type判断是Car还是Suv, 就需要用到discriminator

VehicleMapper映射文件

<?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="io.github.coinsjack.dao.VehicleMapper">

    <resultMap id="vehicleResultMap" type="Vehicle">        <id column="id" property="id"/>        <id column="vin" property="vin"/>        <id column="year" property="year"/>        <id column="make" property="make"/>        <id column="model" property="model"/>        <id column="color" property="color"/>        <discriminator javaType="int" column="vehicle_type">            <case value="1" resultType="Car">                <result column="door_count" property="doorCount"/>            </case>            <case value="2" resultType="Suv">                <result column="all_wheel_drive" property="allWheelDriveFlag"/>            </case>        </discriminator>    </resultMap>

    <select id="getVehicleById" resultMap="vehicleResultMap">        select * from tb_vehicle        WHERE `id` = #{id};    </select></mapper>

测试

@Testpublic void testGetVehicleById() {        SqlSession sqlSession = MyBatisUtil.getSqlSession();        VehicleMapper vehicleMapper= sqlSession.getMapper(VehicleMapper.class);

        System.out.printf("查询结果: %s%n", vehicleMapper.getVehicleById(5));;        System.out.printf("查询结果: %s%n", vehicleMapper.getVehicleById(6));;}

测试结果

2018-12-29 17:38:29,567 [main] DEBUG [io.github.coinsjack.dao.VehicleMapper.getVehicleById] - ==> Preparing: select * from tb_vehicle WHERE `id` = ?; 
2018-12-29 17:38:29,677 [main] DEBUG [io.github.coinsjack.dao.VehicleMapper.getVehicleById] - ==> Parameters: 5(Integer)
2018-12-29 17:38:29,750 [main] DEBUG [io.github.coinsjack.dao.VehicleMapper.getVehicleById] - <== Total: 1
查询结果: Car{doorCount=4, id=5, vin=‘2627159999‘, year=Mon Jan 01 08:00:00 CST 2018, make=‘IDEA‘, model=‘DA-20‘, color=‘Black‘}
2018-12-29 17:38:29,762 [main] DEBUG [io.github.coinsjack.dao.VehicleMapper.getVehicleById] - ==> Preparing: select * from tb_vehicle WHERE `id` = ?; 
2018-12-29 17:38:29,763 [main] DEBUG [io.github.coinsjack.dao.VehicleMapper.getVehicleById] - ==> Parameters: 6(Integer)
2018-12-29 17:38:29,804 [main] DEBUG [io.github.coinsjack.dao.VehicleMapper.getVehicleById] - <== Total: 1
查询结果: Suv{allWheelDriveFlag=false, id=6, vin=‘2627159998‘, year=Mon Jan 01 08:00:00 CST 2018, make=‘IDEA‘, model=‘AA-19‘, color=‘Pink‘}

原文地址:https://www.cnblogs.com/litran/p/10546259.html

时间: 2024-08-30 17:44:35

Mybatis学习第23节 -- 鉴别器 discriminator的相关文章

Mybatis学习第19节 -- 嵌套查询一对多的配置

一对多和多对多是一样的. 而多对多是指 A对于B来说是一对多的关系, 同时B对于A来说也是一对多的关系, 互为一对多,即为多对多. 比如说一个标签下面有多篇文章,一篇文章也可能有多个标签 Shop实体类设计 List<Product> productList; Product实体类设计 public class Product implements Serializable{ Integer id; String name; String desc; String imgAddr; Strin

Mybatis学习第25节 -- 懒加载 积极与不积极

积极懒加载是指如果你访问一个对象的属性,Mybatis就会帮你把需要进步一查询的该属性或者其他属性在数据库中查询出来. 不积极懒加载是指,有这种必要的时候,采取进行必要的数据库检索 我看的教程中的Mybatis版本默认是积极的lazy加载, 而我实际用的Mybatis3.4.6实际上默认不积极的lazy加载. mybatis-config.xml文件 <settings> <!-- 打印查询语句 --> <setting name="logImpl" va

Mybatis学习第5节 -- 插入并获取ID

插入过程 接口 int insertShop(Shop shop); 映射 <insert id="insertShop" parameterType="Shop" useGeneratedKeys="true" keyProperty="id"> INSERT INTO `oto`.`tb_shop` ( `owner_id`, `area_id`, `shop_category_id`, `shop_name`

Mybatis学习第2节 -- 模糊查询之#和$的区别

先说结论, #是占位符,而$的行为是字符串拼接, 在参数是java的基本类型且只有一个参数的情况下,使用$时,只能用value作为参数传递 需求决定设计, 先在interface里面添加相应方法 public interface ShopMapper { Shop getShopById(Integer id); Shop getShopByIdAlias(Integer id); Shop getShopByTitleContainDollar(String value); Shop getS

Mybatis学习第4节 -- 多参数传递

第一种方法使用索引 一般不使用,不记录 第二种方法使用注解 接口 List<Shop> getShopListByPageAno(@Param(value = "offset") int offset, @Param(value = "pagesize") int pagesize); mapper <select id="getShopListByPageAno" resultMap="simpleResultMap

Mybatis学习第6节 -- 修改功能和修改部分字段

方案一, 先查询再修改 接口 int updateShop(Shop shop); 映射 <update id="updateShop" parameterType="Shop"> UPDATE `tb_shop` SET `owner_id` = 'owner_id', `area_id` = 'area_id', `shop_category_id` = 'shop_category_id', `shop_name` = 'shop_name', `

Mybatis学习第8节 -- 动态sql-if

需求 查询id小于10,并且shopname包含"关键词"的记录 如果用户没有输入任何关键词, 那么列出所有结果 接口 List<Shop> get10ShopByTitle(String value); 映射 <select id="get10ShopByTitle" resultMap="simpleResultMap"> select * from tb_shop <where> <if test=

Mybatis学习第22节 -- 高级结果映射 构造方法映射

知识储备:  对于大部分编程语言的函数来说, 函数的signature是函数名和函数参数,而对于函数参数的名称, 编译器不关心. 为ShopCustom创建一个构造函数 public ShopCustom(Integer id, String shopName, String shopDesc) { this.id = id; this.shopName = shopName; this.shopDesc = shopDesc;} 为ShopMapperCustom添加一个新方法 public

Mybatis学习小记

Mybatis学习小结 最近在学习Java的一些框架,Spring,Mybatis这些,总有点浮于表面的感觉,这里先记录一下使用的小知识. 1.初级尝试 这部分记录一下我第一次用Mybatis以及Spring做的小代码,比较简单,主要涉及环境的配置以及简单的使用,后续部分会有其他更深入的使用总结. 1.1 准备工作 这里准备一些基本的jar包,我是用maven管理的.用到的jar包如下.这里要特别注意mybatis-spring的版本和mybatis的版本需要匹配,否则会出现很多其他问题了.这里