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

SpringBoot中Mybatis注解一對多和多對多查詢實現(xiàn)示例

 更新時間:2022年03月23日 14:59:40   作者:KimZing  
這篇文章主要介紹了SpringBoot中Mybatis注解一對多和多對多查詢的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、模擬的業(yè)務查詢

系統(tǒng)中的用戶user都有唯一對應的地址信息address,每個用戶可以有多量車car,類似如下結構

|-- user
    |-- address
    |-- carList
        |-- car1
        |-- car2

二、對應的實體類如下

@Data
public class AddressPO {
    private Long id;
    /**
     * 省份
     */
    private String province;
    /**
     * 城市
     */
    private String city;
    /**
     * 街道
     */
    private String street;
}
@Data
public class CarPO {
    private Long id;
    /**
     * 顏色
     */
    private String color;
    /**
     * 品牌
     */
    private String name;
    private Long userId;
}
@Data
public class UserPO extends AbstractPO {
    private Long id;
    private String username;
    private String password;
    private Integer age;
    private GenderEnum gender;
    /**
     * 地址信息,和用戶是一對一的關系
     */
    private AddressPO address;
    /**
     * 地址id
     */
    private Long addressId;
    /**
     * 用戶擁有的車,和用戶是一對多的關系
     */
    private List<CarPO> cars;
}

三、對應的建表語句和模擬數(shù)據(jù)如下

CREATE TABLE IF NOT EXISTS `user`
(
    `id`          int(11)     NOT NULL AUTO_INCREMENT COMMENT '主鍵',
    `username`    varchar(20) NOT NULL UNIQUE COMMENT '用戶名',
    `password`    varchar(50) NOT NULL COMMENT '密碼',
    `age`         int(2)      NOT NULL COMMENT '年齡',
    `gender`      varchar(10) NOT NULL COMMENT '性別',
    `address_id`  int(11)              DEFAULT NULL COMMENT '地址',
    `creater`     varchar(20)          DEFAULT NULL COMMENT '創(chuàng)建人',
    `modifier`    varchar(20)          DEFAULT NULL COMMENT '更新人',
    `create_time` datetime    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
    `modify_time` datetime    NOT NUll DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
    PRIMARY KEY (`id`),
    KEY `index_gender` (`gender`) USING BTREE COMMENT '性別'
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;
CREATE TABLE IF NOT EXISTS `address`
(
    `id`       int(11) NOT NULL AUTO_INCREMENT,
    `province` varchar(50) DEFAULT NULL,
    `city`     varchar(50) DEFAULT NULL,
    `street`   varchar(50) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;
CREATE TABLE IF NOT EXISTS `car`
(
    `id`      int(11) NOT NULL AUTO_INCREMENT,
    `color`   varchar(50) DEFAULT NULL,
    `name`    varchar(50) DEFAULT NULL,
    `user_id` int(11)     DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;
INSERT INTO `user`(username, password, age, gender, address_id)
VALUES ('KimZing', '123456', '25', 'MAN', 1), ('kim', '123456', '25', 'MAN', 2);
INSERT INTO `address`
VALUES ('1', '北京', '北京', '王府井'),
       ('2', '天津', '天津', '周良'),
       ('3', '安徽', '宿州', '涌橋'),
       ('4', '廣東', '廣州', '順德');
INSERT INTO
    `car`
VALUES
('1', 'green', '路虎', '1'),
('2', 'white', '奔馳', '2'),
('3', 'blue', '瑪莎拉蒂', '1'),
('4', 'yellow', '蘭博基尼', '2');

四、@One一對一映射

以獲取用戶的唯一地址為例,首先我們定義一個根據(jù)地址id查詢地址的查詢方法

@Mapper
public interface AddressRepository {
    /**
     * 根據(jù)地址id查詢地址
     */
    @Select("SELECT * FROM `address` WHERE id = #{id}")
    AddressPO findAddressById(Long id);
}

然后我們定義一個根據(jù)用戶id查詢用戶的方法

@Mapper
public interface MySqlUserRepository {
    @Select("SELECT * FROM `user` WHERE id = #{id}")
    UserPO find(Long id);
}

這個時候我們查詢出來的user對象中的address屬性是空的,和address并沒有任何關聯(lián)。
那么我們要把user中的addressId傳遞給AddressRepository的查詢地址的方法,
然后把查詢出的地址對象address賦值給user的address屬性,那么我們怎么做呢?

@Mapper
public interface MySqlUserRepository {
    @Select("SELECT * FROM `user` WHERE id = #{id}")
    @Results({
    @Result(property = "address", column = "address_id",
                    one = @One(select = "com.kimzing.data.repository.AddressRepository.findAddressById"))
    })
    UserPO find(Long id);
}

我們要使用@Resutl注解對返回的結果進行配置,

property = “address”

表示要將返回的查詢結果賦值給user的address屬性

column = “address_id”

是指將user表中的address_id作為com.kimzing.data.repository.AddressRepository.findAddressById的查詢參數(shù)

one 表示這是一個一對一的查詢

@One(select = "方法全路徑)

表示我們調用的方法

五、@Many一對多查詢

以獲取用戶擁有的所有車car為例,首先我們定義一個根據(jù)用戶id查詢車的查詢方法

@Mapper
public interface CarRepository {
    /**
     * 根據(jù)用戶id查詢所有的車
     */
    @Select("SELECT * FROM `car` WHERE user_id = #{userId}")
    List<Car> findCarsByUserId(Long userId);
}

然后我們定義一個根據(jù)用戶id查詢用戶的方法

@Mapper
public interface MySqlUserRepository {
    @Select("SELECT * FROM `user` WHERE id = #{id}")
    UserPO find(Long id);

}

這個時候我們查詢出來的user對象中的List屬性是空的,和car的查詢方法并沒有任何關聯(lián)。
那么我們要把user中的用戶id傳遞給CarRepository的查詢車的方法,
然后把查詢出的集合對象List賦值給user的cars屬性,那么我們怎么做呢?(和獲取地址是有些類似的)

package com.kimzing.data.repository.impl;
import com.kimzing.data.domain.po.UserPO;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
 * 數(shù)據(jù)存儲.
 *
 * @author KimZing - kimzing@163.com
 * @since 2020/1/31 13:12
 */
@Mapper
public interface MySqlUserRepository {
    @Select("SELECT * FROM `user` WHERE id = #{id}")
    @Results({
            @Result(property = "address", column = "address_id",
                    one = @One(select = "com.kimzing.data.repository.AddressRepository.findAddressById")),
            @Result(property = "cars", column = "id",
                    many = @Many(select = "com.kimzing.data.repository.CarRepository.findCarsByUserId"))
    }),
    // 對userId進行賦值
    @Result(property = "id", column = "id")
    UserPO find(Long id);
}

我們要使用@Resutl注解對返回的結果進行配置,

property = “cars”, 表示要將返回的查詢結果賦值給user的cars屬性

column = “id” 是指將user表中的用戶主鍵id作為com.kimzing.data.repository.CarRepository.findCarsByUserId的查詢參數(shù)

many 表示這是一個一對多的查詢

@Many(select = "方法全路徑)

表示我們調用的方法, 方法參數(shù)userId就是上面column指定的列值

六、@One @Many的總結

首先我們統(tǒng)一下概念:查詢Address或Car的方法,接下來統(tǒng)稱為User的附屬查詢。

共同點:

  • 無論是一對一還是一對多,都是通過附屬查詢來實現(xiàn)的,我們需要定義這個附屬查詢方法。
  • 在主查詢方法中通過@One、@Many指定附屬查詢方法的全路徑。
  • 都通過column來傳遞參數(shù)給附屬方法。

不同點:

一對一,那么附屬方法返回的是一個單獨的對象

一對多,那么附屬方法返回的是一個對象集合

以上就是SpringBoot中Mybatis注解一對多和多對多查詢實現(xiàn)示例的詳細內容,更多關于SpringBoot Mybatis注解一對多多對多查詢的資料請關注腳本之家其它相關文章!

相關文章

  • Java之Spring簡單的讀取和存儲對象

    Java之Spring簡單的讀取和存儲對象

    這篇文章主要介紹了Spring的讀取和存儲對象,獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,有時候也叫對象注?,想進一步了解的同學可以參考本文
    2023-04-04
  • Java發(fā)送郵件javax.mail的實現(xiàn)方法

    Java發(fā)送郵件javax.mail的實現(xiàn)方法

    這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實現(xiàn)方法,具有一定的參考價值,代碼都有詳細的注釋,感興趣的小伙伴們可以參考一下
    2016-01-01
  • springboot項目打包發(fā)布部署的過程及jar和war的區(qū)別

    springboot項目打包發(fā)布部署的過程及jar和war的區(qū)別

    Spring Boot使用了內嵌容器,因此它的部署方式也變得非常簡單靈活,可以將Spring Boot項目打包成JAR包來獨立運行,Spring Boot項目既可以生成WAR包發(fā)布,也可以生成JAR包發(fā)布,那么它們有什么區(qū)別呢
    2022-11-11
  • 自定義log4j.properties的加載位置方式

    自定義log4j.properties的加載位置方式

    這篇文章主要介紹了自定義log4j.properties的加載位置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java Spring的數(shù)據(jù)庫開發(fā)詳解

    Java Spring的數(shù)據(jù)庫開發(fā)詳解

    這篇文章主要介紹了Spring的數(shù)據(jù)庫開發(fā),主要圍繞SpringJDBC和Spring Jdbc Template兩個技術來講解,文中有詳細的代碼示例,需要的小伙伴可以參考一下
    2023-04-04
  • ajax實時監(jiān)測與springboot的實例分析

    ajax實時監(jiān)測與springboot的實例分析

    本文將介紹如何使用 AJAX 技術結合 Spring Boot 構建一個實時反饋用戶輸入的應用,我們將創(chuàng)建一個簡單的輸入框,當用戶在輸入框中鍵入文本時,應用將異步地向后端發(fā)送請求,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • springboot動態(tài)加載jar包動態(tài)配置實例詳解

    springboot動態(tài)加載jar包動態(tài)配置實例詳解

    這篇文章主要給大家介紹了關于springboot動態(tài)加載jar包動態(tài)配置的相關資料,在項目開發(fā)的過程中,有時候需要動態(tài)靈活的加載某個jar包并執(zhí)行其里面的方法的時候,需要的朋友可以參考下
    2023-11-11
  • Maven發(fā)布Jar包中文亂碼解決方法

    Maven發(fā)布Jar包中文亂碼解決方法

    這篇文章主要介紹了Maven發(fā)布Jar包中文亂碼解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Windows系統(tǒng)下JDK1.8與JDK11版本切換超詳細教程

    Windows系統(tǒng)下JDK1.8與JDK11版本切換超詳細教程

    這篇文章主要給大家介紹了關于Windows系統(tǒng)下JDK1.8與JDK11版本切換的超詳細教程,我們可以有多個工程項目,用的JDK版本不一樣,這個時候就需要進行自由切換JDK版本了,需要的朋友可以參考下
    2023-07-07
  • Spring Security基于散列加密方案實現(xiàn)自動登錄功能

    Spring Security基于散列加密方案實現(xiàn)自動登錄功能

    為了提高項目的用戶體驗,我們可以在項目中添加自動登錄功能,當然也要給用戶提供退出登錄的功能。接下來學習下Spring Security基于散列加密方案實現(xiàn)自動登錄功能,一起看看吧
    2021-09-09

最新評論

河池市| 大城县| 读书| 从化市| 堆龙德庆县| 西和县| 新源县| 白朗县| 乾安县| 偏关县| 保康县| 清苑县| 安义县| 雷州市| 九龙坡区| 长泰县| 乐业县| 钟山县| 通江县| 开远市| 岚皋县| 台中市| 贵阳市| 冕宁县| 盐津县| 衡阳市| 克山县| 浪卡子县| 江孜县| 徐汇区| 蓝田县| 任丘市| 嘉兴市| 剑川县| 和静县| 大宁县| 古田县| 泰宁县| 石嘴山市| 左贡县| 南昌市|