一、需求分析
用户和角色多对多关系模型:用户可以有多个角色,每个角色也可以对应多个用户
需求:实现查询所有对象,并且加载它所分配的用户信息
分析:查询角色需要用到 role 表,但角色分配的用户信息并不能直接找到用户信息,而是要通过中间表(user_role 表)才能关联到用户信息。
这里需要获取所有对象及这些对象对应的用户信息,所以采用内部连接
INNER JOIN关键字:选择两个表中具有匹配值的记录。
LEFT JOIN关键字:返回左侧表(表1)中的所有记录,以及右侧表(表2)中的匹配记录。如果没有匹配项,则结果从右侧为NULL。
二、角色实体类
@Data
public class Role implements Serializable {
private Integer roleId;
private String roleName;
private String roleDesc;
/**
* 多对多的关系映射:一个角色可以赋予多个用户
*/
private List<User> users;
}
在角色实体类中添加了用户的信息,是一种多对多的关系
三、RoleDao 接口
public interface RoleDao {
/**
* 查询所有角色
* @return
*/
List<Role> findAll();
}
四、RoleDao.xml 配置文件
<mapper namespace="mybatis.dao.RoleDao">
<!--定义 role 表的resultMap-->
<resultMap id="roleMap" type="role">
<id property="roleId" column="rid"></id>
<result property="roleName" column="role_name"></result>
<result property="roleDesc" column="role_desc"></result>
<!-- 配置role对象中users集合的映射 -->
<!--这是一种多对多的映射,选用 collection-->
<collection property="users" ofType="user">
<id column="id" property="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
</collection>
</resultMap>
<!--查询所有对象-->
<select id="findAll" resultMap="roleMap">
SELECT r.id rid,r.role_name,r.role_desc,u.* FROM role r
INNER JOIN user_role ur ON (r.id=ur.rid)
INNER JOIN user u ON (ur.uid=u.id)
</select>
</mapper>
注意这里的Role 表中存在 id 属性,user 表中也存在 id 属性,所以 SQL语句中为 role 中的id 取了别名 rid
五、同理实现User到Role的一对多查询
这里主要在 User 中添加 Role 属性
@Data
public class User implements Serializable{
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
/**
* 多对多的关系映射:一个用户可以拥有多个角色
*/
private List<Role> roles;
}
然后在 UserDao 中添加 查询所有用户信息(包含角色信息)
/**
* 查询所有用户包含角色信息
* @return
*/
List<User> findUserRole();
在配置文件 UserDao.xml 中添加相关配置信息:
<resultMap id="userRoleMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!-- 配置user对象中roles集合的映射 -->
<collection property="roles" ofType="role">
<id column="rid" property="roleId"></id>
<result column="role_name" property="roleName"></result>
<result column="role_desc" property="roleDesc"></result>
</collection>
</resultMap>
<!--根据id查询-->
<select id="findUserRole" resultMap="userRoleMap">
SELECT u.*,r.id rid,r.role_name,r.role_desc FROM USER u
LEFT OUTER JOIN user_role ur ON (ur.uid=u.id)
LEFT OUTER JOIN role r ON (r.id=ur.rid)
</select>
主要注意这里是查询所有用户信息,包括角色信息,所以用了左连接查询操作