对于iBATIS一对多/多对多的问题,传统的办法是在一对多/多对多关联的属性上
再做一次子查询,这个解决办法很简单易懂,但是有个缺点,会导致N+1 selects
,导致查询的性能瓶颈,更好的解决办法是sql做一个表连接,然后主表的
resultMap配置上加“groupBy='...'”属性,这样一次查询就搞定,避免了N+1问
题,下面请看代码:
<resultMap id="billCardResult" class="BillCard" groupBy="cardId">
<result property="cardId" column="card_id" />
<result property="cardCode" column="card_code" />
<result property="cardName" column="CARD_NAME" />
<result property="cardCodeLength" column="CODE_LENGTH" />
<result property="cardType" column="CARD_TYPE" />
<result property="cardTypeName" column="CARD_NAME" />
<result property="cardDescription" column="CARD_DESC" />
<result property="personalDrawLimit" column="LIMIT_DRAW" />
<result property="isVoucher" column="IS_VOUCHER" />
<result property="isImport" column="IS_IMPORT" />
<result property="returnLimit" column="LIMIT_RETURN" />
<result property="hasCheckCode" column="HAS_CHECK_CODE" />
<result property="codeRelation" column="CODE_RELA" />
<result property="otherCode" column="OTHRE_CODE" nullValue=""/>
<result property="status" column="STATUS" />
<result property="createDate" column="CREATE_DATE" />
<result property="createUserId" column="CREATED_BY" />
<result property="updateDate" column="UPDATE_DATE" />
<result property="updateUserId" column="UPDATED_BY" />
<result property="premiumSum" column="PREMIUM_SUM" />
<result property="billCardProductList"
resultMap="BillCardDefinition.billCardProductResult" nullValue="null"/>
</resultMap>
<resultMap id="billCardProductResult" class="BillCardProduct">
<result property="cardId" column="billCardProduct_card_id" />
<result property="productId" column="PRODUCT_ID" />
<result property="policyAmount" column="POLICY_AMOUNT" />
<result property="premium" column="PREMIUM" />
<result property="unit" column="UNIT" />
<result property="productLevel" column="PRODUCT_LEVEL" />
<result property="coverageTermId" column="COVERAGETERMID" />
<result property="coveragePeriod" column="COVERAGEPERIOD" />
<result property="paymentTermId" column="PAYMENTTERMID" />
<result property="paymentPeriod" column="PAYMENTPERIOD" />
<result property="paymentType" column="PAYMENTTYPE" />
<!-- <result property="productId" column="PRODUCT_ID" /> -->
</resultMap>
<select id="getBillCardById" parameterClass="Long"
resultMap="billCardResult">
select billCard.*,billCardProduct.*,billCardProduct.card_id as
billCardProduct_card_id
from t_billcard billCard
join T_BILLCARD_TYPE billCardType on
billCard.Card_Type=billCardType.Card_Type
left join t_billcard_product billCardProduct on
billCard.Card_Id=billCardProduct.Card_Id
where billCard.status='Y'
and billCard.Card_Id=#value#
order by billCard.card_code asc
</select>
分享到:
相关推荐
在处理多对一或者一对多关系时,如果没有合理利用批处理或者连接查询,很容易产生“n+1”问题。当查询一个主记录及其相关的子记录时,如果没有一次性获取所有数据,而是在主记录循环中每次单独查询子记录,就会有n次...
下面将详细介绍几种解决iBATIS中的N+1选择问题的方法。 1. **批处理(Batch)查询**: 批处理查询允许我们一次性发送多个SQL语句到数据库,减少数据库连接次数。在iBATIS中,可以通过设置动态SQL来实现。例如,...
这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的响应速度。 首先,让我们理解什么是N+1问题。假设我们有一个主表(例如,用户表)和一个从表(例如,订单表),每个...
#### ibatis批量Update解决方案 ibatis提供了一套完善的批量更新机制,可以有效地解决上述问题。下面详细介绍如何利用ibatis实现高效的批量更新: 1. **准备工作**: - 首先确保你的ibatis版本支持批量更新功能。...
10. **最佳实践**:如何有效地设计Mapper接口和XML文件,避免N+1查询,以及如何利用iBATIS进行性能优化。 学习iBATIS不仅需要理解上述知识点,还需要通过实际项目实践来巩固和深化理解。通过分析提供的源码,我们...
6.2.3 避免N+1查询问题 105 6.3 继承 107 6.4 其他用途 109 6.4.1 使用语句类型和DDL 109 6.4.2 处理超大型数据集 109 6.5 小结 115 第7章 事务 116 7.1 事务是什么 116 7.1.1 一个简单的银行转账示例 116 7.1.2 ...
- `resultMap`用于定义复杂的查询结果映射规则,包括一对多、多对多等复杂关系。 11. **cacheModel** - 定义了缓存模型,可以提高应用程序的性能。 12. **xmlResultName** - `xmlResultName`用于指定结果映射...
- **避免N+1 Select(1:1)**:优化一对多关系的数据加载,减少查询次数。 - **延迟加载VS联合查询(1:1)**:选择合适的加载策略,提高性能。 - **复杂类型集合的属性**:支持多对多关系的数据加载。 - **避免N+1 ...
在实际开发中,遵循最佳实践可以提高性能和可维护性,如合理使用缓存、避免N+1查询、优化关联加载等。同时,理解SessionFactory和Session的作用以及何时使用Transaction也是关键。 综上,这个培训材料涵盖了...
在使用Hibernate时,应遵循一些最佳实践,如合理设计实体关系,避免N+1查询问题,使用缓存提高性能,以及适当地处理事务。 总之,Hibernate培训的目标是让学员能够熟练掌握O/R Mapping的概念,灵活运用Hibernate...
- **避免N+1查询列表**: 优化多对多关系的查询性能。 - **复合键或多个复杂参数属性**: 支持多个复合键或复杂属性的映射。 ##### 3.6 支持的参数映射和结果映射类型 - **基本数据类型**: 如Int32、String等。 - **...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中...
12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托...
12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...
面试中可能会询问如何通过MyBatis进行SQL优化,包括使用合适的索引、避免N+1查询问题、合理使用缓存以及利用MyBatis提供的内置方法如foreach进行批量处理。 6. MyBatis与其他框架整合:MyBatis是一个轻量级的框架,...