`

解决Ibatis一对多映射n+1问题

阅读更多
存在一对多的逻辑关系,比如视频和视频标签(严格来讲是多对多的关系),目前想取出一些视频和该视频包含的标签,传统的做法往往会存在n+1问题,对性能有些影响

在IBatis中如何做?马上进入实战

配置文件如下:
<sqlMap namespace="search">

        <
resultMap id="video-map" class="xx.index.dataset.VideoVO" groupBy="videoId">
        
<result property="videoId" column="videoId" />
         ............................
        
<result property="tagList" resultMap="search.tag-map" />


    
</resultMap>
    
    
<resultMap id="tag-map" class="java.util.HashMap">
        
<result property="tagName" column="tagName" />
    
</resultMap>
     
    
<statement id="query" resultMap="video-map" parameterClass="xx.index.dataset.DataSetVO" >
        select v.videoId as videoId, 
             .............
               vtg.name as tagname, 
              ............
               
        from video v 
        inner join videotagrel vtgrel on v.videoId=vtgrel.videoId
        inner join videotag vtg on vtgrel.tagId=vtg.tagId 
       ...........

            
            
    
</statement>
        ........
</sqlMap>

我们采用多表关联的方式用一个sql取出所有数据,然后定义我们映射规则(见上面的 resultMap段),从规则中可以看出,我们将查出来的结果根据videoId进行分组,然后相同videoId的标签会归入video的tagList,最后你会得到一个 video列表,其中每个video又包含一个相关的标签列表,整个过程一句sql搞定 避免了n+1问题
分享到:
评论
3 楼 lalaeye 2011-03-15  
至少你的加了空格, 标出了颜色。
2 楼 qsky 2008-10-31  
网上一堆跟lz一样的帖子,
希望lz说明来源或别发这种抄袭帖子
1 楼 andyivy6 2008-07-10  
严格来讲是多对多的关系

相关推荐

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

    "ibatis解决多对一n+1问题"这个主题聚焦于MyBatis框架中如何高效地处理多对一关联查询,避免出现性能瓶颈的“n+1”问题。这个问题通常发生在查询一对多关系时,如果不对查询进行优化,会导致大量的额外数据库访问,...

    ibatis N+1问题

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

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

    在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...

    ibatis多对一代码示例

    - 这种方式的优点在于可以避免JOIN查询可能带来的性能问题,但可能会导致N+1查询的问题。 ##### 2. 使用嵌套结果(Nested Result) ```xml select * from aaa, sexs where a.sex_id = s.sid and ...

    ibatis 开发指南.

    6. **结果映射**:`&lt;resultMap&gt;`元素用于定义如何将查询结果映射到Java对象,包括一对一、一对多、嵌套结果集等复杂映射。 7. **事务管理**:iBATIS可以与Spring等框架集成,实现声明式事务管理,简化事务控制。 8...

    ibatis高级特性

    - **N+1 Select 问题**: 在一对多关联的情况下,如果每个用户的地址都需要单独查询,则会导致 N+1 次数据库查询,这可能会导致性能问题。 - **优化方案**: 可以通过批处理查询或者使用缓存机制来优化。 ##### 2. 一...

    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.NET 学习文档

    这部分内容涉及构造函数、结果元素、自定义类型处理器、继承映射、原始结果以及避免在结果集中多次查询的N+1问题等。 ***支持的类型和数据库类型在相应的章节中有所介绍,同时文档还提供了关于缓存模型的详细信息。...

    ibatis-sqlMap

    - **Avoiding N+1 Selects (1:M and M:N)**:处理一对多或多对多关系时的查询优化。 - **Composite Keys or Multiple Complex Parameters Properties**:处理复合键或多个复杂参数属性的情况。 - **Supported ...

    ibatis net 指导 手册

    - **3.4.9 避免N+1查询(一对多或多对多)** - 使用关联查询或子查询来减少查询次数。 - **3.4.10 组合键或多个复杂参数属性** - 可以通过组合多个属性来映射复合主键或复杂参数。 - **3.5 支持的参数映射和...

    ibatis开发手册(pdf)

    - **避免 N+1 Select(1:M 和 M:N)**:进一步讲解如何优化多对多查询。 - **组合键值或多个复杂参数属性**:当一个参数由多个属性组成时的处理方法。 - **支持 ParameterMap 和 ResultMap 的数据类型**:详细...

    ibatis参考文档

    为了避免常见的N+1查询问题,iBATIS提供了一些策略来优化多对多关系的查询效率。 #### 九、Caching Mapped Statement Results 为了提高性能,iBATIS支持对Mapped Statement的结果进行缓存。 ##### 1. Read-Only ...

    iBATIS-SqlMaps

    - **避免N+1查询问题**:通过合理设计SQL语句减少不必要的查询次数。 - **复合主键或多属性复合对象**:处理复杂的对象映射情况。 #### 五、缓存机制 iBATIS-SqlMaps提供了两种缓存机制:只读缓存和可读写缓存。...

    iBATIS DataMapper1.6 中文翻译

    1. 解决了带有`group by`的`Select`语句中N+1问题,优化了查询性能,避免了多次数据库访问。 2. 引入了`&lt;include/&gt;`节点,支持SQL片段的重用,提高代码的可维护性和复用性。 3. 添加了对字典查询的支持,即`...

    ibatis 指导书 PDF

    - **避免 N+1 Select**:通过联合查询等方式优化查询性能。 - **延迟加载 VS 联合查询**:选择合适的查询策略以提高效率。 - **复杂类型集合的属性**:处理复杂类型集合的映射。 - **组合键值或多个复杂参数属性**:...

    ibatis开发指南(中文版)

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

Global site tag (gtag.js) - Google Analytics