背景: 一个存在多对一的映射的表结构,比如视频和视频上传者,目前想取出最受欢迎的视频并要求显示视频的上传者的名字,传统的做法往往会存在n+1问题,对性能有些影响
在IBatis中如何做?马上进入实战
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="specialtopic">

.................................
<resultMap id="top-Video-column1" class="moxtv.central.po.Video">
<result property="videoId" column="videoId" />
<result property="title" column="title" />
<result property="timeSpan" column="timeSpan" />
<result property="user.loginName" column="loginName" />
<result property="videoReport.viewedCount" column="viewedCount" />
</resultMap>
<statement id="getTopVideoListByColumn1" resultMap="top-Video-column1" cacheModel="getTopVideoListByColumn1-cache">
select v.videoId,v.title,v.timeSpan,tu.loginName,vr.viewedCount
from top_baby_video tbv
inner join video v on tbv.videoId=v.videoId
inner join video_report vr on v.videoId=vr.videoId
inner join tvUser tu on v.tvUserId=tu.tvUserId
</statement>
............................
</sqlMap>
我们采用多表关联的方式用一个sql取出所有数据,然后定义我们映射规则(见上面的 resultMap段),从规则中可以看出,我们将从查出来的loginName列映射到video中复杂属性user的loginName属性.这样的话,一句sql 就把所需要的 video对象完整加载了, 避免了n+1问题.
resultMap是一个非常好的咚咚,比起hibernate它或许多余,但却给了你更大的自由,来配置关系和对象之间的映射规则.而且也无需担心在使用hibernate2中多对一自动加载
分享到:
相关推荐
"ibatis解决多对一n+1问题"这个主题聚焦于MyBatis框架中如何高效地处理多对一关联查询,避免出现性能瓶颈的“n+1”问题。这个问题通常发生在查询一对多关系时,如果不对查询进行优化,会导致大量的额外数据库访问,...
在IT行业中,数据库查询优化是提升系统性能的关键环节之一,而"Ibatis N+1问题"是使用MyBatis框架时常见的性能瓶颈。这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的...
在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...
- 这种方式的优点在于可以避免JOIN查询可能带来的性能问题,但可能会导致N+1查询的问题。 ##### 2. 使用嵌套结果(Nested Result) ```xml select * from aaa, sexs where a.sex_id = s.sid and ...
7. 性能优化:通过合理设计SQL,避免N+1查询问题,使用缓存提高性能。 总之,iBATIS作为一个轻量级的持久层框架,通过提供SQL Maps和Mapped Statements,降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑而...
- **Avoiding N+1 Selects (1:M and M:N)**:优化一对多或多对多关系的查询。 - **Composite Keys or Multiple Complex Parameters Properties**:复合主键或多复杂属性的处理。 - **Supported Types for ...
10. **最佳实践**:分享一些使用 iBatis 的最佳实践,如避免N+1查询问题,提高性能的技巧等。 通过学习这个 iBatis 的 demo,开发者可以更好地理解和掌握 iBatis 在实际开发中的运用,提升数据访问层的构建能力。...
在这份资料中,你可能会学习到如何编写高效的iBATIS SQL语句,避免N+1问题,以及如何优化查询性能等实用技巧。 8. **案例分析** 文件可能还包含了一些实际案例,展示如何在不同场景下使用iBATIS,如单表操作、多...
10. **最佳实践**:如何有效地设计Mapper接口和XML文件,避免N+1查询,以及如何利用iBATIS进行性能优化。 学习iBATIS不仅需要理解上述知识点,还需要通过实际项目实践来巩固和深化理解。通过分析提供的源码,我们...
避免N+1 Select(1:M和M:N) 组合键值或多个复杂参数属性 支持Parameter Map和Result Map的数据类型 缓存Mapped Statement结果集 只读 VS 可读写 Serializable可读写缓存 缓存类型 动态Mapped Statement 二元条件...
4. **避免N+1 Select**:通过联合查询等方式减少不必要的数据库查询次数。 5. **组合键值或多个复杂参数属性**:支持复杂的参数传递和映射逻辑。 #### 五、缓存机制 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 ...
这部分内容涉及构造函数、结果元素、自定义类型处理器、继承映射、原始结果以及避免在结果集中多次查询的N+1问题等。 ***支持的类型和数据库类型在相应的章节中有所介绍,同时文档还提供了关于缓存模型的详细信息。...
6. **最佳实践**:学习如何优化SQL,避免N+1查询问题,以及如何利用缓存提高性能。 7. **实战项目**:通过参与实际项目或复刻JpetStore_4,提升对iBatis的运用能力。 总之,iBatis是一个强大且灵活的持久层框架,...
10. **最佳实践**:了解如何优化Ibatis的使用,如合理设计SQL,避免N+1问题,使用动态SQL等。 这个教程将引导初学者一步步完成Ibatis环境的搭建,理解其基本工作原理,并通过实际操作掌握Ibatis的使用。通过这些...
- **N+1 Select 问题**: 在一对多关联的情况下,如果每个用户的地址都需要单独查询,则会导致 N+1 次数据库查询,这可能会导致性能问题。 - **优化方案**: 可以通过批处理查询或者使用缓存机制来优化。 ##### 2. 一...
为了解决N+1问题,即由于懒加载机制导致的多次数据库访问,通常会关闭load-lazy属性,并采用以下策略: - **多结果集映射**:通过定义多个`resultMap`,可以区分不同的数据加载需求。例如,`result`用于快速获取...
8. **最佳实践与案例分析**:提供实际开发中的最佳实践,如如何优化SQL,避免N+1问题,以及在大型项目中如何有效地组织和管理映射文件。 9. **与其他框架集成**:探讨如何将iBatis与Spring、Struts等其他框架整合,...
1. 解决了带有`group by`的`Select`语句中N+1问题,优化了查询性能,避免了多次数据库访问。 2. 引入了`<include/>`节点,支持SQL片段的重用,提高代码的可维护性和复用性。 3. 添加了对字典查询的支持,即`...
- iBATISDataMapper 1.6.0版本中,解决了Select语句中group by导致的N+1问题。 - 增加了对SQL片段的支持,通过节点标识。 - 引入了对字典查询IDictionary,V>的支持,方便处理键值对数据。 - 存储过程无参数映射得到...