标签详细说明带实例代码5

复杂类型集合的属性Result Map还可以装入代表复杂类型对象集合(List)的属性,用以表示在数据库中相互关系为多对多或一对多的数据。拥有集合属性的类作为“一”的一方,而在集合中的对象作为“多”的一方。用来装入对象集合的mapped statement和上面例子一样。唯一的不同是,让SQL Map架构装入复杂类型集合(List)的业务对象的属性必须是java.util.List或java.util.Collection类型。例如,如果Category拥有Product对象的List,mapped-statement就像下面的例子(假设Category类有一个叫productList的属性,类型是java.util.List):
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
<result property=”id” column=”CAT_ID”/>
<result property=”description” column=”CAT_DESCRIPTION”/>
<result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
</resultMap>
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
<result property=”id” column=”PRD_ID”/>
<result property=”description” column=”PRD_DESCRIPTION”/>
</resultMap>
<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
select * from CATEGORY where CAT_ID = #value#
</statement>
<statement id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
避免N+1 Select(1:M和M:N)
类似于上面1:1的情况,但因为可能涉及到更大量的数据,因此问题甚至会更严重。上面例子存在的问题是,加载一个Category将执行两个SQL语句(分别加载一个Category和一个相关Product的List)。只加载一个Category的情况下,这个问题似乎微不足道。但在执行一个获得10个Category的查询时,每得到一个Category都要分别执行一个加载Product List的SQL语句。一次用于得到一个Category List,每得到一个Category对象都要执行另外一次查询,以获得相应的Product对象List(N+1,这个例子是10+1=11)。
1:M和M:N的解决方案:目前这个问题还没有解决方案。它将在近期的版本提供。
组合键值或多个复杂参数属性您可能注意到在上面的例子中,resultMap的column属性只指定了一个键值。这意味着只有一个字段和相关的mapped statement关联。但是,还有一种语法能把多个字段传给相关的mapped statement。当对象之间的关系存在组合键值关系,或只是简单地使用一个其他名称而不是#value#的属性时,它就能派上用场了。这种关于column属性的语法很简单,写成{param1=column1,param2=column2,…,paramN=columnN}。考虑下面的例子,其中PAYMENT表的主键是CustomerID和OrderID:
<resultMap id=”get-order-result” class=”com.ibatis.example.Order”>
<result property=”id” column=”ORD_ID”/>
<result property=”customerId” column=”ORD_CST_ID”/>

<result property=”payments” column=”{itemId=ORD_ID, custId=ORD_CST_ID}”
select=” getOrderPayments”/>
</resultMap>
<statement id=”getOrderPayments” resultMap=”get-payment-result”>
select * from PAYMENT
where PAY_ORD_ID = #itemId#
and PAY_CST_ID = #custId#
</statement>
只要字段的次序和statement参数的次序相同,您也可以只指定字段名称。例如:
{ORD_ID, ORD_CST_ID}
但通常这样做会对性能有轻微的影响,并影响到可读性和可维护性。
重要提示!目前SQL Map架构无法自动解决resultMap之间的双向关系。这在处理“父/子” 双向关系的resultMap时尤其要注意。一个简单的办法是,为其中一种情况再定义一个不装入父对象的resultMap(反之亦然)。
注意!某些JDBC Driver(如嵌入式PointBase)不支持同时打开多个ResultSet。这些Driver支持复杂类型映射,因为SQL Map引擎要求同时打开多个ResultSet。
注意!Result Map的名称是局部的,只在定义它的SQL Map XML文件中有效。如果要在别的QL Map XML文件引用它,需要在Result Map名称前加上SQL Map的名称(在<sqlMap>根元素中定义的名称)作为前缀。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值