`

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 开发指南.

    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 ...

    Java面试宝典2010版

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

    最新Java面试宝典pdf版

    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面试宝典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中委托...

    Java 面试宝典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...... 7 2、Java 有没有 goto? .......................................................................................................

Global site tag (gtag.js) - Google Analytics