zoukankan      html  css  js  c++  java
  • mybatis实现继承映射

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

    这篇文章就来讨论一下怎样利用mybatis实现继承映射。



    类图

    有一个机动车父类,它有两个子类:CarBus

     

    关系模型(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>标签中的内容,依据鉴别字段的值自己主动映射成相应的子类

     

    client測试代码

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

    非常easy的一个样例,和大家分享一下



  • 相关阅读:
    cf B. Sereja and Suffixes
    cf E. Dima and Magic Guitar
    cf D. Dima and Trap Graph
    cf C. Dima and Salad
    最短路径问题(floyd)
    Drainage Ditches(网络流(EK算法))
    图结构练习—BFSDFS—判断可达性(BFS)
    Sorting It All Out(拓扑排序)
    Power Network(最大流(EK算法))
    Labeling Balls(拓扑)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7253419.html
Copyright © 2011-2022 走看看