`

iBATIS一对多/多对多N+1问题解决方案

阅读更多
对于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>
分享到:
评论

相关推荐

    ibatis解决多对一n+1问题(更新上传例子(mybatis)代码)

    在处理多对一或者一对多关系时,如果没有合理利用批处理或者连接查询,很容易产生“n+1”问题。当查询一个主记录及其相关的子记录时,如果没有一次性获取所有数据,而是在主记录循环中每次单独查询子记录,就会有n次...

    ibatis n+1选择问题 的几种解决方案

    下面将详细介绍几种解决iBATIS中的N+1选择问题的方法。 1. **批处理(Batch)查询**: 批处理查询允许我们一次性发送多个SQL语句到数据库,减少数据库连接次数。在iBATIS中,可以通过设置动态SQL来实现。例如,...

    ibatis N+1问题

    这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的响应速度。 首先,让我们理解什么是N+1问题。假设我们有一个主表(例如,用户表)和一个从表(例如,订单表),每个...

    ibatis应对批量update

    #### ibatis批量Update解决方案 ibatis提供了一套完善的批量更新机制,可以有效地解决上述问题。下面详细介绍如何利用ibatis实现高效的批量更新: 1. **准备工作**: - 首先确保你的ibatis版本支持批量更新功能。...

    ibatis 开发指南.

    10. **最佳实践**:如何有效地设计Mapper接口和XML文件,避免N+1查询,以及如何利用iBATIS进行性能优化。 学习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 ...

    自己总结的IBATIS资料

    - `resultMap`用于定义复杂的查询结果映射规则,包括一对多、多对多等复杂关系。 11. **cacheModel** - 定义了缓存模型,可以提高应用程序的性能。 12. **xmlResultName** - `xmlResultName`用于指定结果映射...

    ibatis开发指南(中文版)

    - **避免N+1 Select(1:1)**:优化一对多关系的数据加载,减少查询次数。 - **延迟加载VS联合查询(1:1)**:选择合适的加载策略,提高性能。 - **复杂类型集合的属性**:支持多对多关系的数据加载。 - **避免N+1 ...

    hibernat培训.ppt

    在实际开发中,遵循最佳实践可以提高性能和可维护性,如合理使用缓存、避免N+1查询、优化关联加载等。同时,理解SessionFactory和Session的作用以及何时使用Transaction也是关键。 综上,这个培训材料涵盖了...

    hibernat培训

    在使用Hibernate时,应遵循一些最佳实践,如合理设计实体关系,避免N+1查询问题,使用缓存提高性能,以及适当地处理事务。 总之,Hibernate培训的目标是让学员能够熟练掌握O/R Mapping的概念,灵活运用Hibernate...

    Data Mapper Guide

    - **避免N+1查询列表**: 优化多对多关系的查询性能。 - **复合键或多个复杂参数属性**: 支持多个复合键或复杂属性的映射。 ##### 3.6 支持的参数映射和结果映射类型 - **基本数据类型**: 如Int32、String等。 - **...

    最新Java面试宝典pdf版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    JAVA面试宝典2010

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典-经典

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    java面试题大全(2012版)

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典2012版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中...

    java面试宝典2012

    12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托...

    Java面试宝典2012新版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    day66-mybatis面试题

    面试中可能会询问如何通过MyBatis进行SQL优化,包括使用合适的索引、避免N+1查询问题、合理使用缓存以及利用MyBatis提供的内置方法如foreach进行批量处理。 6. MyBatis与其他框架整合:MyBatis是一个轻量级的框架,...

Global site tag (gtag.js) - Google Analytics