背景: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选择问题 的几种解决方案, 网上收集的。
NULL 博文链接:https://liu400liu.iteye.com/blog/1187995
NULL 博文链接:https://xiaoye4188.iteye.com/blog/871050
maven3+struts2+spring+ibatis,本来是用maven3+struts2+spring+hibernate但考虑到hibernate...2.struts2出现乱码的问题,解决方法:在struts.xml中加入 <constant name="struts.i18n.encoding" value="gb2312" />即可
避免N+1 Select(1:M和M:N) 组合键值或多个复杂参数属性 支持Parameter Map和Result Map的数据类型 缓存Mapped Statement结果集 只读 VS 可读写 Serializable可读写缓存 缓存类型 动态Mapped Statement 二元条件...
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 ...
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 ...
SQL Maps (com.ibatis.sqlmap.*)......................................................................................................5 SQL Map的概念........................................................
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上...
ext学习笔记一 小试iBatis RIA(Rich Internet Application)的现状和未来 Java应用中域名解析不过期的解决方法 Java编程那些事儿45—数组使用示例1 一步步熟悉OFBiz 用Java做客户端调用.NET写...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 67 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到...
1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...