MyBatis 映射对象关系举例(5)

Extend继承关系

前面文档已经提到过映射继承的方式,在这里看一个简单的例子。这里使用Product(货品)和BookProduct(图书)的例子来演示继承关系。对象设计如下:

//货品对象
public class Product {
    private Long id;
    private String name;
    //getter & setter
}
        
//图书货品对象
public class BookProduct extends Product {
    private String isbn;
    //getter & setter
}        
学了hibernate就知道,继承关系可以有三种方式来完成数据库表的映射。
第一:One Table,即基类及其所有的子类的所有属性都放到一张表里面。使用一个额外的列来标记当前行保存的对象实例的类型。
第二:Join Table,即基类放到一张表里面,所有的子类都放到各自单独的表里面,使用子表的主键作为外键关联到基类表的主键。
第三:Per Table,即所有的子类,及子类继承的父类的所有的属性都放到各自的表中。在这种情况下需要注意的一点就是ID的生成策略不能使用数据库自动增强的列。
在这里,就使用第一种方式来完成继承的示例。注意,如果使用的是第二种或第三种方式,在完成多态查询的时候,必须要使用Join或者Union完成表的联合查询。
另外,继承关系我们采用hibernate的映射方式,把整个集成体系的所有类的映射都放到一个映射文件中。

映射文件:
<mapper namespace="cd.itcast.mybatis.extend.ProductMapper">
<!-- 保存货品对象(基类类型),注意,在这里面我觉得最好各自类型创建对应的SQL -->
 <insert id="saveProduct" keyProperty="id" parameterType="Product"
                useGeneratedKeys="true">
 INSERT INTO product(name,types) VALUES (#{name},1)
</insert>
<!-- 保存图书货品对象,注意类型列的值是固定的 -->
 <insert id="saveBookProduct" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="BookProduct">
 INSERT INTO product(name,isbn,types) VALUES (#{name},#{isbn},2)
 </insert>

<!-- 映射类型,采用内联的继承映射方式 -->
<resultMap type="Product" id="productmap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<!-- 定义鉴别器,根据不同的type映射不同的对象类型实例 -->
<discriminator javaType="int" column="types">
<case value="1" resultType="Product"/>
<case value="2" resultType="BookProduct">
<result column="isbn" property="isbn"/>
</case> 
</discriminator>
</resultMap>

<select id="get" parameterType="long" resultMap="productmap">
SELECT * FROM product WHERE id = #{id}
</select>

<select id="list" resultMap="productmap">
SELECT * FROM product
</select>
        

<!-- 删除直接删除类型即可 -->
<delete id="delete" parameterType="long">
 DELETE FROM product WHERE id = #{id}
</delete>
</mapper>

映射文件还是非常简单明了的,最后,为该映射文件创建对应的Mapper接口,即可:
public interface ProductMapper {
void saveProduct(Product p);
void saveBookProduct(BookProduct bp);
Product get(Long id);
List list(RowBounds rb);
void delete(Long id);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值