mybatis的collection建立1对多关系 II
现在是时候做一个复杂点儿的嵌套式(我觉得应该叫串联式)的搜索了.
首先, 1个user, 有多个role, 也就是说, 一个user对象, 有一个roleList, 然后一个role可能对应多个privilege的url, 即一个role对象, 里面有一个privilegeList, 如下:
public class SysUser { ...... private List<SysRole> roleList; ...... } public class SysRole { ...... private List<SysPrivilege> privilegeList; ...... }
然后分别在mapper的xml文件里面, 加上resultMap:
首先是user的mapper:
<resultMap id="userRoleListMapWithPrivilege" extends="userMap" type="marc.mybatis.lesson1.model.SysUser"> <collection property="roleList" columnPrefix="role_" resultMap="marc.mybatis.lesson1.mapper.SysRoleMapper.privilegeMapWithRoleList" /> </resultMap>
这个collection里面指向一个roleList, 类型是RoleMapper里面的一个resultMap:
<resultMap type="marc.mybatis.lesson1.model.SysRole" id="privilegeMapWithRoleList" extends="roleMap"> <collection property="privilegeList" columnPrefix="privilege_" resultMap="marc.mybatis.lesson1.mapper.PrivilegeMapper.privilegeMap" /> </resultMap>
这个collection同样指向model里面的list: privilegeList
最重要的一件事, select语句里面注意所有的prefix:
<select id="selectUserWithRolePrivielgeDetail" resultMap="userRoleListMapWithPrivilege"> select u.id,u.user_name,u.user_password,u.user_email,u.user_info,u.head_img,u.create_time,r.id role_id,r.role_name role_role_name, r.enabled role_enabled,r.create_by role_create_by,r.create_time role_create_time,p.id role_privilege_id,p.privilege_name role_privilege_privilege_name,p.privilege_url role_privilege_privilege_url from sys_user u inner join sys_user_role ur on u.id=ur.user_id inner join sys_role r on ur.role_id=r.id inner join sys_role_privilege rp on rp.role_id=r.id inner join sys_privilege p on p.id=rp.privilege_id where u.id=#{id} </select>
注意highlight出来的一段, column就是通过下划线一点点组合成list的...MyBatis有一套.