最近有时间好好的看了一下ibatis,对它的数据关联做了个测试,对比与hibernate,觉得ibatis使用起来更加的方便,只是我个人的喜好,下面我就把用到的一些配置以及使用方法简单的罗列一下。
(一)一对多关联
存在两个表,order表和orderFee表,通过order_id关联,一个order对应多个orderFee。
设置两个bean类:
Order.java
private long ORDER_ID;
private String PROVINCE_CODE;
private String CITY_CODE;
private List<OrderFee> fee;......set和get方法
OrderFee.java
private long ORDER_ID;
private String ORDER_DATE;
private String ORDER_FEE;......set和get方法
之后对应的ibatis配置文件中,配置如下:
<typeAlias alias="Order" type="com.ibatis.Order"/>
<typeAlias alias="OrderFee" type="com.ibatis.OrderFee"/>
<resultMap class="Order" id="get-order-fee">
<select id="getOrderAndFee" resultMap="get-order-fee">
<result property="ORDER_ID" column="ORDER_ID"/>
<result property="PROVINCE_CODE" column="PROVINCE_CODE"/>
<result property="CITY_CODE" column="CITY_CODE"/>
<result property="fee" column="ORDER_ID" select="selectOrderFee"/>
</resultMap>
<![CDATA[
select ORDER_ID,PROVINCE_CODE,CITY_CODE from order
]]>
</select>
<select id="selectOrderFee" parameterClass="java.lang.Long" resultClass="OrderFee">
<![CDATA[
select ORDER_DATE,ORDER_FEE from orderFee where ORDER_ID=#ORDER_ID#
]]>
</select>需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题。当有大量数据时,不建议使用此方法。
(二)一对一关联
一对一关联是一对多关联的一种特例。这种情况下,如果采用上面的示例将导致1+1条SQL的执行。
对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假设上面示例中,每个Order只有一个对应的OrderFee记录):
这时,在Order.java中要有ORDER_FEE以及ORDER_DATE两个类型属性,以及对应的get和set方法。
<resultMap class="OrderOne" id="get-order-fee-one">
<result property="ORDER_ID" column="ORDER_ID"/>
<result property="PROVINCE_CODE" column="PROVINCE_CODE"/>
<result property="CITY_CODE" column="CITY_CODE"/>
<result property="ORDER_FEE" column="ORDER_FEE"/>
<result property="ORDER_DATE" column="ORDER_DATE"/>
</resultMap>
<select id="getOrderOne" resultMap="get-order-fee-one">
<![CDATA[
select t1.ORDER_IDPROVINCE_CODE,CITY_CODE,ORDER_FEE,ORDER_DATE
from order t1,orderFee t2
where t1.ORDER_ID = t2.ORDER_ID
]]>
</select>