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

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

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

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

系統(tǒng)中的用戶user都有唯一對(duì)應(yīng)的地址信息address,每個(gè)用戶可以有多量車car,類似如下結(jié)構(gòu)

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

二、對(duì)應(yīng)的實(shí)體類如下

@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;
    /**
     * 地址信息,和用戶是一對(duì)一的關(guān)系
     */
    private AddressPO address;
    /**
     * 地址id
     */
    private Long addressId;
    /**
     * 用戶擁有的車,和用戶是一對(duì)多的關(guān)系
     */
    private List<CarPO> cars;
}

三、對(duì)應(yīng)的建表語(yǔ)句和模擬數(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)建時(shí)間',
    `modify_time` datetime    NOT NUll DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時(shí)間',
    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一對(duì)一映射

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

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

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

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

這個(gè)時(shí)候我們查詢出來(lái)的user對(duì)象中的address屬性是空的,和address并沒(méi)有任何關(guān)聯(lián)。
那么我們要把user中的addressId傳遞給AddressRepository的查詢地址的方法,
然后把查詢出的地址對(duì)象address賦值給user的address屬性,那么我們?cè)趺醋瞿兀?/p>

@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注解對(duì)返回的結(jié)果進(jìn)行配置,

property = “address”

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

column = “address_id”

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

one 表示這是一個(gè)一對(duì)一的查詢

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

表示我們調(diào)用的方法

五、@Many一對(duì)多查詢

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

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

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

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

}

這個(gè)時(shí)候我們查詢出來(lái)的user對(duì)象中的List屬性是空的,和car的查詢方法并沒(méi)有任何關(guān)聯(lián)。
那么我們要把user中的用戶id傳遞給CarRepository的查詢車的方法,
然后把查詢出的集合對(duì)象List賦值給user的cars屬性,那么我們?cè)趺醋瞿兀?和獲取地址是有些類似的)

package com.kimzing.data.repository.impl;
import com.kimzing.data.domain.po.UserPO;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
 * 數(shù)據(jù)存儲(chǔ).
 *
 * @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"))
    }),
    // 對(duì)userId進(jìn)行賦值
    @Result(property = "id", column = "id")
    UserPO find(Long id);
}

我們要使用@Resutl注解對(duì)返回的結(jié)果進(jìn)行配置,

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

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

many 表示這是一個(gè)一對(duì)多的查詢

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

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

六、@One @Many的總結(jié)

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

共同點(diǎn):

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

不同點(diǎn):

一對(duì)一,那么附屬方法返回的是一個(gè)單獨(dú)的對(duì)象

一對(duì)多,那么附屬方法返回的是一個(gè)對(duì)象集合

以上就是SpringBoot中Mybatis注解一對(duì)多和多對(duì)多查詢實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Mybatis注解一對(duì)多多對(duì)多查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java之Spring簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象

    Java之Spring簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象

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

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

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

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

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

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

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

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

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

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

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

    springboot動(dòng)態(tài)加載jar包動(dòng)態(tài)配置實(shí)例詳解

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

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

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

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

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

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

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

最新評(píng)論

舒城县| 稷山县| 富裕县| 东乡族自治县| 保定市| 任丘市| 马边| 呼伦贝尔市| 岱山县| 游戏| 当雄县| 安陆市| 苏州市| 汉寿县| 当涂县| 大理市| 焦作市| 汝阳县| 通道| 虞城县| 洛南县| 肇源县| 淮安市| 抚顺县| 巨鹿县| 阜宁县| 荃湾区| 沭阳县| 西平县| 葫芦岛市| 扎兰屯市| 湖北省| 高密市| 古田县| 无锡市| 静海县| 崇州市| 平陆县| 鲁甸县| 海安县| 若羌县|