1. 程式人生 > >Mybatis的mapper.xml中<collection></collection>的用法

Mybatis的mapper.xml中<collection></collection>的用法

在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