欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MybatisPlus使用注解的多對多級聯(lián)查詢方式

 更新時間:2023年07月31日 10:44:11   作者:墨末..  
這篇文章主要介紹了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)文章

  • 深入理解Java的接口與抽象類

    深入理解Java的接口與抽象類

    本文主要介紹java 的接口和抽象類,對接口和抽象類進(jìn)行介紹對比,深入理解,有需要的小伙伴可以參考下
    2016-07-07
  • 史上最全的java隨機(jī)數(shù)生成算法分享

    史上最全的java隨機(jī)數(shù)生成算法分享

    這篇文章主要介紹了史上最全的java隨機(jī)數(shù)生成算法,我分享一個最全的隨機(jī)數(shù)的生成算法,最代碼的找回密碼的隨機(jī)數(shù)就是用的這個方法
    2014-01-01
  • Spring Boot中Redis數(shù)據(jù)庫的使用實例

    Spring Boot中Redis數(shù)據(jù)庫的使用實例

    Spring Boot中除了對常用的關(guān)系型數(shù)據(jù)庫提供了優(yōu)秀的自動化支持之外,對于很多NoSQL數(shù)據(jù)庫一樣提供了自動化配置的支持。本篇文章主要介紹了Spring Boot中Redis的使用實例代碼,有興趣的開業(yè)了解一下。
    2017-04-04
  • Java中獲取類路徑classpath的簡單方法(推薦)

    Java中獲取類路徑classpath的簡單方法(推薦)

    下面小編就為大家?guī)硪黄狫ava中獲取類路徑classpath的簡單方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java后端限制頻繁請求和重復(fù)提交的實現(xiàn)

    Java后端限制頻繁請求和重復(fù)提交的實現(xiàn)

    很多用戶會請求過于頻繁或者是多次重復(fù)提交數(shù)據(jù),本文主要介紹了Java后端限制頻繁請求和重復(fù)提交的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Springboot源碼 AbstractAdvisorAutoProxyCreator解析

    Springboot源碼 AbstractAdvisorAutoProxyCreator解析

    這篇文章主要介紹了Springboot源碼 AbstractAdvisorAutoProxyCreator解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot3整合EasyExcel動態(tài)實現(xiàn)表頭重命名

    SpringBoot3整合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ū)動的過程

    這篇文章主要介紹了使用springboot通過spi機(jī)制加載mysql驅(qū)動的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java設(shè)計模式之工廠方法模式詳解

    Java設(shè)計模式之工廠方法模式詳解

    工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨(dú)立類,通過依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個角色,分別是抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品
    2022-08-08
  • SpringBoot頂層接口實現(xiàn)類注入項目的方法示例

    SpringBoot頂層接口實現(xiàn)類注入項目的方法示例

    本文主要介紹了SpringBoot頂層接口實現(xiàn)類注入項目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06

最新評論