SpringBoot中Mybatis注解一對多和多對多查詢實(shí)現(xiàn)示例
一、模擬的業(yè)務(wù)查詢
系統(tǒng)中的用戶user都有唯一對應(yīng)的地址信息address,每個(gè)用戶可以有多量車car,類似如下結(jié)構(gòu)
|-- user
|-- address
|-- carList
|-- car1
|-- car2
二、對應(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;
/**
* 地址信息,和用戶是一對一的關(guān)系
*/
private AddressPO address;
/**
* 地址id
*/
private Long addressId;
/**
* 用戶擁有的車,和用戶是一對多的關(guān)系
*/
private List<CarPO> cars;
}
三、對應(yīng)的建表語句和模擬數(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一對一映射
以獲取用戶的唯一地址為例,首先我們定義一個(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í)候我們查詢出來的user對象中的address屬性是空的,和address并沒有任何關(guān)聯(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注解對返回的結(jié)果進(jìn)行配置,
property = “address”
表示要將返回的查詢結(jié)果賦值給user的address屬性
column = “address_id”
是指將user表中的address_id作為com.kimzing.data.repository.AddressRepository.findAddressById的查詢參數(shù)
one 表示這是一個(gè)一對一的查詢
@One(select = "方法全路徑)
表示我們調(diào)用的方法
五、@Many一對多查詢
以獲取用戶擁有的所有車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í)候我們查詢出來的user對象中的List屬性是空的,和car的查詢方法并沒有任何關(guān)聯(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進(jìn)行賦值
@Result(property = "id", column = "id")
UserPO find(Long id);
}
我們要使用@Resutl注解對返回的結(jié)果進(jìn)行配置,
property = “cars”, 表示要將返回的查詢結(jié)果賦值給user的cars屬性
column = “id” 是指將user表中的用戶主鍵id作為com.kimzing.data.repository.CarRepository.findCarsByUserId的查詢參數(shù)
many 表示這是一個(gè)一對多的查詢
@Many(select = "方法全路徑)
表示我們調(diào)用的方法, 方法參數(shù)userId就是上面column指定的列值
六、@One @Many的總結(jié)
首先我們統(tǒng)一下概念:查詢Address或Car的方法,接下來統(tǒng)稱為User的附屬查詢。
共同點(diǎn):
- 無論是一對一還是一對多,都是通過附屬查詢來實(shí)現(xiàn)的,我們需要定義這個(gè)附屬查詢方法。
- 在主查詢方法中通過@One、@Many指定附屬查詢方法的全路徑。
- 都通過column來傳遞參數(shù)給附屬方法。
不同點(diǎn):
一對一,那么附屬方法返回的是一個(gè)單獨(dú)的對象
一對多,那么附屬方法返回的是一個(gè)對象集合
以上就是SpringBoot中Mybatis注解一對多和多對多查詢實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Mybatis注解一對多多對多查詢的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java發(fā)送郵件javax.mail的實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,代碼都有詳細(xì)的注釋,感興趣的小伙伴們可以參考一下2016-01-01
springboot項(xiàng)目打包發(fā)布部署的過程及jar和war的區(qū)別
Spring Boot使用了內(nèi)嵌容器,因此它的部署方式也變得非常簡單靈活,可以將Spring Boot項(xiàng)目打包成JAR包來獨(dú)立運(yùn)行,Spring Boot項(xiàng)目既可以生成WAR包發(fā)布,也可以生成JAR包發(fā)布,那么它們有什么區(qū)別呢2022-11-11
Java Spring的數(shù)據(jù)庫開發(fā)詳解
這篇文章主要介紹了Spring的數(shù)據(jù)庫開發(fā),主要圍繞SpringJDBC和Spring Jdbc Template兩個(gè)技術(shù)來講解,文中有詳細(xì)的代碼示例,需要的小伙伴可以參考一下2023-04-04
ajax實(shí)時(shí)監(jiān)測與springboot的實(shí)例分析
本文將介紹如何使用 AJAX 技術(shù)結(jié)合 Spring Boot 構(gòu)建一個(gè)實(shí)時(shí)反饋用戶輸入的應(yīng)用,我們將創(chuàng)建一個(gè)簡單的輸入框,當(dāng)用戶在輸入框中鍵入文本時(shí),應(yīng)用將異步地向后端發(fā)送請求,感興趣的朋友跟隨小編一起看看吧2024-07-07
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ā)的過程中,有時(shí)候需要?jiǎng)討B(tài)靈活的加載某個(gè)jar包并執(zhí)行其里面的方法的時(shí)候,需要的朋友可以參考下2023-11-11
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)登錄功能
為了提高項(xiàng)目的用戶體驗(yàn),我們可以在項(xiàng)目中添加自動(dòng)登錄功能,當(dāng)然也要給用戶提供退出登錄的功能。接下來學(xué)習(xí)下Spring Security基于散列加密方案實(shí)現(xiàn)自動(dòng)登錄功能,一起看看吧2021-09-09

