MybatisPlus使用注解的多對多級聯(lián)查詢方式
假設我們需要將用戶信息(包括了用戶對應的角色信息)查詢出來
數(shù)據(jù)表結構
先貼出數(shù)據(jù)表結構,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 '狀態(tài) ', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '創(chuàng)建時間', `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;
插入數(shù)據(jù)
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;
插入數(shù)據(jù)
INSERT INTO `role` VALUES (1, '系統(tǒng)管理員', '系統(tǒng)管理員'); INSERT INTO `role` VALUES (2, '數(shù)據(jù)管理員', '數(shù)據(jù)管理員');
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;
插入數(shù)據(jù)
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()方法來獲取用戶所屬角色列表
/**
* 根據(jù)指定的userId去user和user_role關聯(lián)表查出該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);添加關聯(lián)關系,修改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代表子查詢關聯(lián)的主表中的列名,即子查詢和主查詢之間的關聯(lián)關系。property,代表子查詢的查詢結果關聯(lián)的實體屬性,就是UserVo中的roles。
select="com.hxh.basic.project.mapper.RoleMapper.getListByUserId"代表使用的子查詢方法,就是我們的RoleMapper 的 getListByUserId()方法。
意思就是查詢主表,并將主表的id這個列和子查詢關聯(lián)起來,將id的值作為查詢條件傳入子查詢中,子查詢返回的結果存入到屬性roles中其中 @Result(column=“id”,property=“Id”),這個可以不寫,也不會報錯,但是會導致我們查詢結果列表里每個UVO 實體的Id等屬性沒有值。
執(zhí)行效果
測試類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=系統(tǒng)管理員, remark=系統(tǒng)管理員), Role(id=2, name=數(shù)據(jù)管理員, remark=數(shù)據(jù)管理員)])]
可以看出表中id為1的user信息和其對應的角色信息信息已經(jīng)查詢出來了。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring Boot中Redis數(shù)據(jù)庫的使用實例
Spring Boot中除了對常用的關系型數(shù)據(jù)庫提供了優(yōu)秀的自動化支持之外,對于很多NoSQL數(shù)據(jù)庫一樣提供了自動化配置的支持。本篇文章主要介紹了Spring Boot中Redis的使用實例代碼,有興趣的開業(yè)了解一下。2017-04-04
Springboot源碼 AbstractAdvisorAutoProxyCreator解析
這篇文章主要介紹了Springboot源碼 AbstractAdvisorAutoProxyCreator解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
SpringBoot3整合EasyExcel動態(tài)實現(xiàn)表頭重命名
這篇文章主要為大家詳細介紹了SpringBoot3整合EasyExcel如何通過WriteHandler動態(tài)實現(xiàn)表頭重命名,文中的示例代碼講解詳細,有需要的可以了解下2025-03-03
使用springboot通過spi機制加載mysql驅(qū)動的過程
這篇文章主要介紹了使用springboot通過spi機制加載mysql驅(qū)動的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot頂層接口實現(xiàn)類注入項目的方法示例
本文主要介紹了SpringBoot頂層接口實現(xiàn)類注入項目的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06

