要求:查询用户的所有信息,包括用户的角色和角色的权限
数据库
五张表,分别是:
(1)用户表
(2)角色表
(3)用户与角色的关系表
(4)权限表
(5)角色与权限的关系表
乍一看好像是多对多,一个用户有多个角色,一个角色有多个权限,但是关系表里面一个权限也对应多个角色,以前没接触过这种关系表,而且以前都用的表联查,突然有点懵==
多对多是没法写级联的,分析一下应该是这样的关系:一个user可以有多个role,一个role可以有多个permission,如图:
理清楚这个关系就可以重构实体类了:
在user类里加入List<Role>
public class User {
private int id;
private String username;
private String password;
private String salt;
private List<Role> roleList;
}
在role类里加入List<Permission>
public class Role {
private int id;
private String name;
private String description;
private List<Permission> permissionList;
}
映射:
(1)IUserDao
@Select("select * from pe_user where id=#{id}") //查出的结果集是user对象
//结果集映射
@Results({
//id映射自己的id,还是级联的key。roleList来自于关系表中的
@Result(column = "id",property = "id"),
@Result(column = "id",property = "roleList",many=@Many(select = "xxx.IRoleDao.findById"))
})
public User findUserById(int id);
(2)IRoleDao
//返回的结果集是role对象
@Select("select * from pe_role where id in (select role_id from pe_user_role where user_id=#{id})")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "id",property = "permissionList",many = @Many(select = "xxx.IPermissionDao.findById"))
})
public List<Role> findById(int id);
(3)IPermissionDao
@Select("select * from pe_permission where id in( " +
"select permission_id from pe_role_permission where role_id=#{id})")
public List<Permission> findById(int id);
测一下,查出来了
@Test
void contextLoads() {
User user = mapper.findUserById(1);
System.out.println(user);
}