Mybatis的mapper.xml中<collection></collection>的用法
阿新 • • 發佈:2018-11-10
在mapper.xml檔案中,我們在使用collection時有兩種用法。這裡做一下簡單記錄:
1、直接將collection集合元素的屬性寫為collection的字標籤
如下:
<resultMap type="com.space.shiro.bean.User" id="userMap"> <id property="id" column="uid"/> <result property="username" column="username"/> <result property="password" column="password"/> <collection property="roles" ofType="com.space.shiro.bean.Role"> <id property="id" column="rid"/> <result property="name" column="rname"/> <collection property="permissions" ofType="com.space.shiro.bean.Permissions"> <id property="id" column="pid"/> <result property="name" column="pname"/> </collection> </collection> </resultMap>
它們的關係是這樣的:
User裡有一個Set<Role> roles
Role裡有一個Set<Permissions> permissions
通過這樣的配置,我們在執行查詢User時,通過多表聯查,就可以將這些級聯屬性全部關聯查出。
下面是查詢語句:
<select id="queryUserName" parameterType="string" resultMap="userMap"> SELECT u.*,r.*,p.* FROM user u inner join user_role ur on ur.uid=u.uid inner join role r on r.rid=ur.rid inner join permissions_role pr on pr.rid=r.rid inner join permissions p on pr.pid=p.pid WHERE username=#{username}; </select>
2、通過在collection標籤中引用別的mapper的查詢方法
<resultMap id="BaseResultMap" type="com.space.sbsecurity.bo.sys.SysUser" > <id column="user_id" property="id" jdbcType="BIGINT" /> <result column="username" property="username" jdbcType="VARCHAR" /> <result column="password" property="password" jdbcType="VARCHAR" /> <collection property="sysRoles" column="user_id" select="com.space.sbsecurity.mapper.sys.SysRoleMapper.selectRoleListByUserId"> </collection> </resultMap>
在SysUser中有Set<SysRole> sysRoles
我們不需要再在collection中配置SysRole的屬性,只需要將SysRole中的selectRoleListByUserId方法引入就可以了。
以下是查詢語句:我們只需要查詢SysUser就行了
<select id="findByUsername" resultMap="BaseResultMap">
SELECT
us.id as user_id,
us.username,
us.password
FROM t_sys_user us WHERE us.username = #{username}
</select>
當然,在SysRole的mapper中,我們是需要有selectRoleListByUserId方法的:
<resultMap id="roleResult" type="com.space.sbsecurity.bo.sys.SysRole">
<id property="id" column="role_id" jdbcType="BIGINT"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="desc" column="desc" jdbcType="VARCHAR"/>
<collection property="permissions" column="role_id"
select="com.space.sbsecurity.mapper.sys.SysPermissionMapper.selectPermissionByRoleId">
</collection>
</resultMap>
<select id="selectRoleListByUserId" resultMap="roleResult">
SELECT
ro.id as role_id,
ro.name,
ro.desc
FROM t_sys_user_role ur
LEFT JOIN t_sys_role ro
ON ur.`role_id` = ro.`id` WHERE ur.user_id = #{userId}
</select>
同理,SysRole中的permissions也是一樣的。
兩種方式的實現都可以,但是博主跟喜歡第二種方式。因為我們不需要寫過於複雜的sql,同時,每個mapper中的方法都是獨立可以使用的,其適用性更強。
轉載請務必保留此出處(原作者):https://blog.csdn.net/zhuzhezhuzhe1
版權宣告:本文為原創文章,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本宣告。
https://blog.csdn.net/zhuzhezhuzhe1