ibatis数据关联

本文详细探讨了IBatis在一对多和一对一关联中的应用,通过配置示例展示了如何实现数据关联,并提出了避免性能瓶颈的方法。重点强调了在处理大量数据时,优化SQL查询的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有时间好好的看了一下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">
<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>

<select id="getOrderAndFee" resultMap="get-order-fee">
<![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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值