`
mmBlue
  • 浏览: 167266 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis中N+1问题

阅读更多

背景: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去组合即可。

 

 

分享到:
评论

相关推荐

    ibatis N+1问题

    在IT行业中,数据库查询优化是提升系统性能的关键环节之一,而"Ibatis N+1问题"是使用MyBatis框架时常见的性能瓶颈。这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的...

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

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

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

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

    maven3+struts2+spring+ibatis

    maven3+struts2+spring+ibatis,本来是用maven3+struts2+spring+hibernate但考虑到hibernate...2.struts2出现乱码的问题,解决方法:在struts.xml中加入 &lt;constant name="struts.i18n.encoding" value="gb2312" /&gt;即可

    ibatis应对批量update

    为了解决这个问题,ibatis(现已更名为MyBatis)提供了一种支持批量更新的机制,能够显著提高数据处理的速度。 #### 批量Update背景与问题 在实际应用中,经常会遇到需要批量更新数据库中的数据的情况,例如:商品...

    iBATIS2.3及其说明文档

    7. 性能优化:通过合理设计SQL,避免N+1查询问题,使用缓存提高性能。 总之,iBATIS作为一个轻量级的持久层框架,通过提供SQL Maps和Mapped Statements,降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑而...

    01_ibatis教程_准备ibatis环境.zip

    10. **最佳实践**:了解如何优化Ibatis的使用,如合理设计SQL,避免N+1问题,使用动态SQL等。 这个教程将引导初学者一步步完成Ibatis环境的搭建,理解其基本工作原理,并通过实际操作掌握Ibatis的使用。通过这些...

    ibatis分页技术

    在Ibatis中,除了分页技术,还常遇到N+1查询问题和DTO(Data Transfer Object)设计。为了解决N+1问题,即由于懒加载机制导致的多次数据库访问,通常会关闭load-lazy属性,并采用以下策略: - **多结果集映射**:...

    iBATIS DataMapper1.6 中文翻译

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

    ibatis高级特性

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

    ibatis学习锦集

    6. **最佳实践**:学习如何优化SQL,避免N+1查询问题,以及如何利用缓存提高性能。 7. **实战项目**:通过参与实际项目或复刻JpetStore_4,提升对iBatis的运用能力。 总之,iBatis是一个强大且灵活的持久层框架,...

    一个iBatis的demo

    10. **最佳实践**:分享一些使用 iBatis 的最佳实践,如避免N+1查询问题,提高性能的技巧等。 通过学习这个 iBatis 的 demo,开发者可以更好地理解和掌握 iBatis 在实际开发中的运用,提升数据访问层的构建能力。...

    iBATIS资料汇总

    在这份资料中,你可能会学习到如何编写高效的iBATIS SQL语句,避免N+1问题,以及如何优化查询性能等实用技巧。 8. **案例分析** 文件可能还包含了一些实际案例,展示如何在不同场景下使用iBATIS,如单表操作、多...

    ibatis-sqlMap

    - **Avoiding N+1 Selects (1:1)**:避免N+1次查询问题,提高性能。 - **Complex Collection Properties**:处理集合类型的属性。 - **Avoiding N+1 Selects (1:M and M:N)**:处理一对多或多对多关系时的查询...

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

    8. **最佳实践与案例分析**:提供实际开发中的最佳实践,如如何优化SQL,避免N+1问题,以及在大型项目中如何有效地组织和管理映射文件。 9. **与其他框架集成**:探讨如何将iBatis与Spring、Struts等其他框架整合,...

    IBatis.net教程

    - iBATISDataMapper 1.6.0版本中,解决了Select语句中group by导致的N+1问题。 - 增加了对SQL片段的支持,通过节点标识。 - 引入了对字典查询IDictionary,V&gt;的支持,方便处理键值对数据。 - 存储过程无参数映射得到...

Global site tag (gtag.js) - Google Analytics