MybatisPlus使用注解的多對多級聯(lián)查詢方式
假設(shè)我們需要將用戶信息(包括了用戶對應(yīng)的角色信息)查詢出來
數(shù)據(jù)表結(jié)構(gòu)
先貼出數(shù)據(jù)表結(jié)構(gòu),user和role,還有一張中間表user_role
user表和role表的關(guān)系為多對多,即一個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', '劉達(dá)', '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()方法用戶獲取用戶基本信息(包括了用戶對應(yīng)的角色信息)
@Select("select * from user where ${ew.SqlSegment}") List<UserVo> getList(@Param("ew") QueryWrapper wrapper);
然后再roleMapper中定義getListByUserId()方法來獲取用戶所屬角色列表
/** * 根據(jù)指定的userId去user和user_role關(guān)聯(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);
添加關(guān)聯(lián)關(guā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代表子查詢關(guān)聯(lián)的主表中的列名,即子查詢和主查詢之間的關(guān)聯(lián)關(guān)系。property,代表子查詢的查詢結(jié)果關(guān)聯(lián)的實體屬性,就是UserVo中的roles。
select="com.hxh.basic.project.mapper.RoleMapper.getListByUserId"代表使用的子查詢方法,就是我們的RoleMapper 的 getListByUserId()方法。
意思就是查詢主表,并將主表的id這個列和子查詢關(guān)聯(lián)起來,將id的值作為查詢條件傳入子查詢中,子查詢返回的結(jié)果存入到屬性roles中其中 @Result(column=“id”,property=“Id”),這個可以不寫,也不會報錯,但是會導(dǎo)致我們查詢結(jié)果列表里每個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傳入,得到結(jié)果如下:
[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信息和其對應(yīng)的角色信息信息已經(jīng)查詢出來了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot中Redis數(shù)據(jù)庫的使用實例
Spring Boot中除了對常用的關(guān)系型數(shù)據(jù)庫提供了優(yōu)秀的自動化支持之外,對于很多NoSQL數(shù)據(jù)庫一樣提供了自動化配置的支持。本篇文章主要介紹了Spring Boot中Redis的使用實例代碼,有興趣的開業(yè)了解一下。2017-04-04Java后端限制頻繁請求和重復(fù)提交的實現(xiàn)
很多用戶會請求過于頻繁或者是多次重復(fù)提交數(shù)據(jù),本文主要介紹了Java后端限制頻繁請求和重復(fù)提交的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Springboot源碼 AbstractAdvisorAutoProxyCreator解析
這篇文章主要介紹了Springboot源碼 AbstractAdvisorAutoProxyCreator解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08SpringBoot3整合EasyExcel動態(tài)實現(xiàn)表頭重命名
這篇文章主要為大家詳細(xì)介紹了SpringBoot3整合EasyExcel如何通過WriteHandler動態(tài)實現(xiàn)表頭重命名,文中的示例代碼講解詳細(xì),有需要的可以了解下2025-03-03使用springboot通過spi機(jī)制加載mysql驅(qū)動的過程
這篇文章主要介紹了使用springboot通過spi機(jī)制加載mysql驅(qū)動的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot頂層接口實現(xiàn)類注入項目的方法示例
本文主要介紹了SpringBoot頂層接口實現(xiàn)類注入項目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06