您的位置:首页 > 其它

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

2013-08-22 15:57 274 查看

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: