背景:User Role UserRole 3个表的关系
我现在的需求:查找出所有用户,并且把他的角色也显示出来
一个用户可以有多个角色,那么User: id,name, Role
1.User ResultMap
<!-- 注意groupBy属性 -->
<resultMap id="user-result-map" class="com.mmblue.entity.system.User" groupBy="id">
<result property="id" column="USERID" nullValue="0"/>
<result property="name" column="USERNAME" javaType="string" jdbcType="VARCHAR2" nullValue=""/>
<result property="realName" column="REALNAME" javaType="string" jdbcType="VARCHAR2" nullValue=""/>
<result property="password" column="PASSWORD" javaType="string" jdbcType="VARCHAR2" nullValue=""/>
<result property="createTime" column="CREATETIME" javaType="string" jdbcType="VARCHAR2" nullValue=""/>
<result property="enable" column="ISENABLE" javaType="int" jdbcType="INTEGER" nullValue="0"/>
<!-- 解决N+1问题 -->
<result property="roles" resultMap="role.roleMap"/>
<!-- 重现N+1问题
<result property="roles" column="roleid" select="role.queryRoleForObject_id" />
-->
</resultMap>
2.Role ResultMap
<resultMap id="roleMap" class="com.mmblue.entity.system.Role">
<result property="id" column="ROLEID" nullValue="0"/>
<result property="name" column="ROLENAME" nullValue=""/>
<result property="desp" column="ROLEDESP" javaType="string" jdbcType="VARCHAR2" nullValue=""/>
<result property="logTime" column="logtime" javaType="java.util.Date" jdbcType="date"/>
<result property="statu" column="statu" nullValue="0"/>
</resultMap>
<select id="queryRoleForObject_id" resultMap="role.roleMap" parameterClass="long" >
select ROLEID,ROLENAME,ROLEDESP,logtime,statu from myivr_trole where roleId = #id#
</select>
3.User SELECT
<sql id="sql_user_where">
select
u.userid,
u.username,
u.realname,
u.password,
u.createtime,
u.isenable,
r.roleid,
r.rolename,
r.roledesp,
r.logtime,
r.statu
from
myivr_tuser u inner join myivr_tuser_role ur
on u.userid = ur.user_id
inner join myivr_trole r on ur.role_id = r.roleid
<dynamic prepend="where">
<isNotEmpty property="id" prepend="and">
u.USERID = #id#
</isNotEmpty>
<isNotEmpty property="enable" prepend="and">
u.ISENABLE = #enable#
</isNotEmpty>
</dynamic>
</sql>
讲解问题重现:
<result property="roles" column="roleid" select="role.queryRoleForObject_id" />
这里用了select 属性,可以理解为一个抓取策略,会根据roleid去发一条SQL抓取,但是我现在需求是查询所有的用户
那么对应的roleid会有多个,那么就会发多条SQL
解决问题:
其实我用内连接已经查询出了用户、角色的全部信息,我在
<!-- 解决N+1问题 -->
<result property="roles" resultMap="role.roleMap"/>
这个result中,再次关联一个resulMap然后用groupId去组合即可。
分享到:
相关推荐
在IT行业中,数据库查询优化是提升系统性能的关键环节之一,而"Ibatis N+1问题"是使用MyBatis框架时常见的性能瓶颈。这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的...
"ibatis解决多对一n+1问题"这个主题聚焦于MyBatis框架中如何高效地处理多对一关联查询,避免出现性能瓶颈的“n+1”问题。这个问题通常发生在查询一对多关系时,如果不对查询进行优化,会导致大量的额外数据库访问,...
在数据库查询优化中,"N+1 选择问题"是一个常见的性能瓶颈,特别是在使用ORM(对象关系映射)框架如iBATIS时。N+1问题发生在当我们执行一系列单独的SQL查询来获取关联数据,而不是一次性加载所有所需数据。这可能...
maven3+struts2+spring+ibatis,本来是用maven3+struts2+spring+hibernate但考虑到hibernate...2.struts2出现乱码的问题,解决方法:在struts.xml中加入 <constant name="struts.i18n.encoding" value="gb2312" />即可
为了解决这个问题,ibatis(现已更名为MyBatis)提供了一种支持批量更新的机制,能够显著提高数据处理的速度。 #### 批量Update背景与问题 在实际应用中,经常会遇到需要批量更新数据库中的数据的情况,例如:商品...
7. 性能优化:通过合理设计SQL,避免N+1查询问题,使用缓存提高性能。 总之,iBATIS作为一个轻量级的持久层框架,通过提供SQL Maps和Mapped Statements,降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑而...
10. **最佳实践**:了解如何优化Ibatis的使用,如合理设计SQL,避免N+1问题,使用动态SQL等。 这个教程将引导初学者一步步完成Ibatis环境的搭建,理解其基本工作原理,并通过实际操作掌握Ibatis的使用。通过这些...
在Ibatis中,除了分页技术,还常遇到N+1查询问题和DTO(Data Transfer Object)设计。为了解决N+1问题,即由于懒加载机制导致的多次数据库访问,通常会关闭load-lazy属性,并采用以下策略: - **多结果集映射**:...
1. 解决了带有`group by`的`Select`语句中N+1问题,优化了查询性能,避免了多次数据库访问。 2. 引入了`<include/>`节点,支持SQL片段的重用,提高代码的可维护性和复用性。 3. 添加了对字典查询的支持,即`...
- **N+1 Select 问题**: 在一对多关联的情况下,如果每个用户的地址都需要单独查询,则会导致 N+1 次数据库查询,这可能会导致性能问题。 - **优化方案**: 可以通过批处理查询或者使用缓存机制来优化。 ##### 2. 一...
6. **最佳实践**:学习如何优化SQL,避免N+1查询问题,以及如何利用缓存提高性能。 7. **实战项目**:通过参与实际项目或复刻JpetStore_4,提升对iBatis的运用能力。 总之,iBatis是一个强大且灵活的持久层框架,...
10. **最佳实践**:分享一些使用 iBatis 的最佳实践,如避免N+1查询问题,提高性能的技巧等。 通过学习这个 iBatis 的 demo,开发者可以更好地理解和掌握 iBatis 在实际开发中的运用,提升数据访问层的构建能力。...
在这份资料中,你可能会学习到如何编写高效的iBATIS SQL语句,避免N+1问题,以及如何优化查询性能等实用技巧。 8. **案例分析** 文件可能还包含了一些实际案例,展示如何在不同场景下使用iBATIS,如单表操作、多...
- **Avoiding N+1 Selects (1:1)**:避免N+1次查询问题,提高性能。 - **Complex Collection Properties**:处理集合类型的属性。 - **Avoiding N+1 Selects (1:M and M:N)**:处理一对多或多对多关系时的查询...
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 ...
8. **最佳实践与案例分析**:提供实际开发中的最佳实践,如如何优化SQL,避免N+1问题,以及在大型项目中如何有效地组织和管理映射文件。 9. **与其他框架集成**:探讨如何将iBatis与Spring、Struts等其他框架整合,...
- iBATISDataMapper 1.6.0版本中,解决了Select语句中group by导致的N+1问题。 - 增加了对SQL片段的支持,通过节点标识。 - 引入了对字典查询IDictionary,V>的支持,方便处理键值对数据。 - 存储过程无参数映射得到...