`
mmBlue
  • 浏览: 165114 次
  • 性别: 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选择问题 的几种解决方案

    ibatis n+1选择问题 的几种解决方案, 网上收集的。

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

    NULL 博文链接:https://liu400liu.iteye.com/blog/1187995

    ibatis N+1问题

    NULL 博文链接:https://xiaoye4188.iteye.com/blog/871050

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

    避免N+1 Select(1:M和M:N) 组合键值或多个复杂参数属性 支持Parameter Map和Result Map的数据类型 缓存Mapped Statement结果集 只读 VS 可读写 Serializable可读写缓存 缓存类型 动态Mapped Statement 二元条件...

    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-设置缓存模式-Java源码(下载)

    System.out.println("\n----------------------------------"); while (rs.next()) { for (int i = 0; i (); i++) { Object value = rs.getObject(i + 1); if (value == null) { System.out.print("\t ...

    iBATIS 帮助文档

    SQL Maps (com.ibatis.sqlmap.*)......................................................................................................5 SQL Map的概念........................................................

    Java面试宝典2010版

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上...

    java文集

    ext学习笔记一 小试iBatis RIA(Rich Internet Application)的现状和未来 Java应用中域名解析不过期的解决方法 Java编程那些事儿45—数组使用示例1 一步步熟悉OFBiz 用Java做客户端调用.NET写...

    最新Java面试宝典pdf版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试笔试资料大全

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    JAVA面试宝典2010

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试宝典-经典

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    java面试宝典2012

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 67 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    java面试题大全(2012版)

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试宝典2012版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到...

    Java面试宝典2012新版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

Global site tag (gtag.js) - Google Analytics