最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年07月31日 10:44:11   作者:墨末..  
這篇文章主要介紹了MybatisPlus使用注解的多對多級聯(lián)查詢方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

假設(shè)我們需要將用戶信息(包括了用戶對應的角色信息)查詢出來

數(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', '劉達', '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關(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”),這個可以不寫,也不會報錯,但是會導致我們查詢結(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信息和其對應的角色信息信息已經(jīng)查詢出來了。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?Web開發(fā)環(huán)境配置詳解

    Java?Web開發(fā)環(huán)境配置詳解

    這篇文章主要介紹了Java?Web開發(fā)環(huán)境配置詳解,對初學者是個必備的過程,有需要的可以了解一下
    2016-11-11
  • Mybatis配置useGeneratedKeys參數(shù)的方式

    Mybatis配置useGeneratedKeys參數(shù)的方式

    Mybatis的useGeneratedKeys參數(shù)用于控制是否允許JDBC支持自動生成主鍵,并在插入數(shù)據(jù)時通過keyProperty將生成的主鍵值返回,當數(shù)據(jù)庫不支持自增主鍵時,可以使用selectKey來手動實現(xiàn)類似的效果
    2026-01-01
  • java 實現(xiàn)音樂播放器的簡單實例

    java 實現(xiàn)音樂播放器的簡單實例

    這篇文章主要介紹了java 實現(xiàn)音樂播放器的簡單實例的相關(guān)資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • Java連接MySQL數(shù)據(jù)庫命令行程序過程

    Java連接MySQL數(shù)據(jù)庫命令行程序過程

    SQL編程包括兩種形式,一種是過程化編程,主要通過數(shù)據(jù)庫交互式工具,通過存儲過程、觸發(fā)器、函數(shù)等形式的編程;另一種是嵌入式SQL編程,將SQL語句嵌入到高級開發(fā)語言,完成數(shù)據(jù)的各種操作
    2021-10-10
  • Java實現(xiàn)一行一行讀取文本的多種方法詳解

    Java實現(xiàn)一行一行讀取文本的多種方法詳解

    這篇文章主要為大家詳細介紹了Java實現(xiàn)一行一行讀取文本的多種方法,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以了解下
    2025-10-10
  • Springboot中如何自定義監(jiān)聽器

    Springboot中如何自定義監(jiān)聽器

    這篇文章主要介紹了Springboot中自定義監(jiān)聽器,自定義事件需要繼承ApplicationEvent類,并添加一個構(gòu)造函數(shù),用于接收事件源對象,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-07-07
  • Java使用RedisTemplate如何根據(jù)前綴獲取key列表

    Java使用RedisTemplate如何根據(jù)前綴獲取key列表

    這篇文章主要介紹了Java使用RedisTemplate如何根據(jù)前綴獲取key列表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java雙冒號(::)運算符使用詳解

    Java雙冒號(::)運算符使用詳解

    之前沒用過::這個東西,今天看flink的時候發(fā)現(xiàn)官網(wǎng)有個例子用到了這個符號,本文就詳細的來介紹一下Java雙冒號(::)運算符使用詳解,感興趣的可以了解一下
    2021-09-09
  • spring的applicationContext.xml文件與NamespaceHandler解析

    spring的applicationContext.xml文件與NamespaceHandler解析

    這篇文章主要介紹了spring的applicationContext.xml文件與NamespaceHandler解析,Spring容器啟動,在創(chuàng)建BeanFactory時,需要加載和解析當前ApplicationContext對應的配置文件applicationContext.xml,從而獲取bean相關(guān)的配置信息,需要的朋友可以參考下
    2023-12-12
  • Java連接服務器的兩種方式SFTP和FTP

    Java連接服務器的兩種方式SFTP和FTP

    在項目開發(fā)中,一般文件存儲很少再使用SFTP服務,但是也不排除合作伙伴使用SFTP來存儲項目中的文件或者通過SFTP來實現(xiàn)文件數(shù)據(jù)的交互,這篇文章主要介紹了Java集成FTP與SFTP連接池
    2023-02-02

最新評論

土默特右旗| 昔阳县| 江陵县| 彩票| 通山县| 奉化市| 武功县| 商丘市| 庆安县| 邹城市| 大田县| 锡林郭勒盟| 镇江市| 苍南县| 阜新市| 大渡口区| 广昌县| 阿拉善右旗| 保德县| 梁平县| 大城县| 津市市| 桃源县| 苗栗市| 中超| 汝城县| 南木林县| 钟祥市| 高台县| 高阳县| 山东省| 白城市| 雷州市| 阿拉善右旗| 天等县| 大田县| 航空| 咸阳市| 丹凤县| 杂多县| 文山县|