MybatisPlus使用注解的多对多级联查询
假设我们需要将用户信息(包括了用户对应的角色信息)查询出来先贴出数据表结构,user和role,还有一张中间表user_roleuser表和role表的关系为多对多,即一个user可以分配多个role,一个role可以属于多个user。插入数据2.role表插入数据3.user_role中间表插入数据具体做法先定义UserVo类,List roles表示user所属role先在userMapper
假设我们需要将用户信息(包括了用户对应的角色信息)查询出来
数据表结构
先贴出数据表结构,user和role,还有一张中间表user_role
user表和role表的关系为多对多,即一个user可以分配多个role,一个role可以属于多个user。
1.user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
`nickname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '昵称',
`birthday` date NOT NULL COMMENT '生日',
`username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`password` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
`status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '状态 ',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
插入数据
INSERT INTO `user` VALUES (1, 'lh', '2022-06-29', '李大', '123456', '0', '2022-06-29 09:02:07', '2022-06-29 09:02:07');
INSERT INTO `user` VALUES (2, 'ww', '2022-06-29', '陈大', '123456', '0', '2022-06-29 13:06:24', '2022-06-29 13:06:24');
INSERT INTO `user` VALUES (3, 'aa', '2022-06-29', '刘达', '123456', '0', '2022-06-29 13:06:48', '2022-06-29 13:06:48');
2.role表
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称',
`remark` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色描述',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
插入数据
INSERT INTO `role` VALUES (1, '系统管理员', '系统管理员');
INSERT INTO `role` VALUES (2, '数据管理员', '数据管理员');
3.user_role中间表
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`user_id` int(0) NOT NULL COMMENT '用户id',
`role_id` int(0) NULL DEFAULT NULL COMMENT '角色id'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
插入数据
INSERT INTO `user_role` VALUES (1, 1);
INSERT INTO `user_role` VALUES (1, 2);
INSERT INTO `user_role` VALUES (2, 1);
INSERT INTO `user_role` VALUES (2, 2);
INSERT INTO `user_role` VALUES (3, 1);
具体做法
先定义UserVo类,List roles表示user所属role
@Data
@ApiModel("用户视图模型")
public class UserVo {
/**
* 用户编号
*/
@ApiModelProperty("用户编号")
private Integer id;
/**
* 昵称
*/
@ApiModelProperty("昵称")
private String nickname;
/**
* 用户名
*/
@ApiModelProperty("用户名")
private String username;
/**
* 生日
*/
@ApiModelProperty("生日")
private LocalDateTime birthday;
private List<Role> roles;
}
先在userMapper中定义getList()方法用户获取用户基本信息(包括了用户对应的角色信息)
@Select("select * from user where ${ew.SqlSegment}")
List<UserVo> getList(@Param("ew") QueryWrapper wrapper);
然后再roleMapper中定义getListByUserId()方法来获取用户所属角色列表
/**
* 根据指定的userId去user和user_role关联表查出该user所属role列表
* @param userId
* @return
*/
@Select("select * from role left join user_role on role.id=user_role.role_id where user_role.user_id=#{userId}")
List<Role> getListByUserId(Integer userId);
添加关联关系,修改userMapper中的getList()方法
@Select("select * from user where ${ew.SqlSegment}")
@Results({@Result(column = "id",property = "id"),
@Result(column = "id",property = "roles",many=@Many(
select = "com.hxh.basic.project.mapper.RoleMapper.getListByUserId"
))
})
List<UserVo> getList(@Param("ew") QueryWrapper wrapper);
在上面这个@Result中column代表子查询关联的主表中的列名,即子查询和主查询之间的关联关系。
property,代表子查询的查询结果关联的实体属性,就是UserVo中的roles。
select="com.hxh.basic.project.mapper.RoleMapper.getListByUserId"代表使用的子查询方法,就是我们的RoleMapper 的 getListByUserId()方法。
意思就是查询主表,并将主表的id这个列和子查询关联起来,将id的值作为查询条件传入子查询中,子查询返回的结果存入到属性roles中
其中 @Result(column=“id”,property=“Id”),这个可以不写,也不会报错,但是会导致我们查询结果列表里每个UVO 实体的Id等属性没有值。
执行效果
测试类UserServiceImplTest
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BasicProjectApplication.class)
public class UserServiceImplTest {
@Resource
private UserMapper userMapper;
@Resource
private RoleMapper roleMapper;
@Test
public void getUserInfo(){
QueryWrapper<User> wrapper=new QueryWrapper();
wrapper.eq("id",1);
List<UserVo> list = userMapper.getList(wrapper);
System.out.println(list);
}
}
将user的id=1传入,得到结果如下:
[UserVo(id=1, nickname=lh, username=李哈, birthday=2022-06-29T00:00, roles=[Role(id=1, name=系统管理员, remark=系统管理员), Role(id=2, name=数据管理员, remark=数据管理员)])]
可以看出表中id为1的user信息和其对应的角色信息信息已经查询出来了。
更多推荐
所有评论(0)