MyBatis-Plus實(shí)現(xiàn)多表聯(lián)查方式(一對(duì)一,一對(duì)多使用)
1、前言
在使用mybatis-plus開(kāi)發(fā)需求的時(shí)候會(huì)發(fā)現(xiàn)對(duì)于大部分的業(yè)務(wù)場(chǎng)景來(lái)說(shuō)都會(huì)使用到j(luò)oin來(lái)進(jìn)行聯(lián)表查詢,但是mybatis-plus封裝的 mapper 不支持 join,如果需要支持就需要自己手動(dòng)去實(shí)現(xiàn),給大家推薦一個(gè)好用的插件(MyBatis-Plus-Join)。
2、介紹
Mybatis-Plus-Join(簡(jiǎn)稱 MPJ)是一個(gè) Mybatis-Plus的增強(qiáng)工具,在 MyBatis-Plus 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生。
3、特性
- 無(wú)侵入:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑
- 無(wú)感引入, 支持MP風(fēng)格的查詢, 您會(huì)MP就會(huì)MPJ, 無(wú)需額外的學(xué)習(xí)成本
- 兼容MP的別名、邏輯刪除、枚舉列、TypeHandle列等特性
- 支持注解形式一對(duì)一、一對(duì)多和連表查詢形式的一對(duì)一和一對(duì)多
4、使用
引依賴
需要 Mybatis-plus version >= 3.4.0
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-boot-starter</artifactId>
<version>1.4.7.2</version>
</dependency>繼承
- (必須)mapper繼承MPJBaseMapper
public interface CarIllegalMapper extends MPJBaseMapper<CarIllegal>
{
}
- (可選)service繼承MPJBaseService
public interface ICarIllegalService extends MPJBaseService<CarIllegal>{}
- (可選)serviceImpl繼承MPJBaseServiceImpl
@Service
public class CarIllegalServiceImpl extends MPJBaseServiceImpl<CarIllegalMapper, CarIllegal> implements ICarIllegalService
{}開(kāi)始使用
現(xiàn)有一張car_illegal(車(chē)輛違章)表和一張attachments_file(附件)表,其關(guān)聯(lián)關(guān)系是每輛違章車(chē)數(shù)據(jù)可能對(duì)應(yīng)著一條或多條的違章圖片(附件),以這兩張表為例來(lái)進(jìn)行一對(duì)一和一對(duì)多測(cè)試。
一對(duì)一
說(shuō)明
- CarIllegalDto.class 查詢結(jié)果返回類(resultType)
- selectAll() 查詢指定實(shí)體類的全部字段
- select() 查詢指定的字段,支持可變參數(shù),同一個(gè)select只能查詢相同表的字段
- selectAs() 字段別名查詢,用于數(shù)據(jù)庫(kù)字段與業(yè)務(wù)實(shí)體類屬性名不一致時(shí)使用
leftJoin() 參數(shù)說(shuō)明
- 第一個(gè)參數(shù): 參與連表的實(shí)體類class
- 第二個(gè)參數(shù): 連表的ON字段,這個(gè)屬性必須是第一個(gè)參數(shù)實(shí)體類的屬性
- 第三個(gè)參數(shù): 參與連表的ON的另一個(gè)實(shí)體類屬性
默認(rèn)主表別名是t,其他的表別名以先后調(diào)用的順序使用t1,t2,t3…
- selectAssociation()一對(duì)一查詢
- selectCollection()一對(duì)多查詢
@SpringBootTest(classes = DeXinApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
@Slf4j
class DeXinApplicationTests {
@Autowired
private CarIllegalMapper carIllegalMapper;
@Test
public void testSelect() {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
.selectAll(CarIllegalDto.class)
.selectAssociation(AttachmentsFile.class,CarIllegalDto::getAttachmentsFile)
.leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId,CarIllegal::getId);
List<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinList(CarIllegalDto.class,wrapper);
}
}返回的實(shí)體類
@Data
public class CarIllegalDto extends CarIllegal
{
AttachmentsFile attachmentsFile;
List<AttachmentsFile> attachmentsFileList;
}
查詢結(jié)果

一對(duì)多
@Test
public void testSelect() {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
.selectAll(CarIllegalDto.class)
.selectCollection(AttachmentsFile.class,CarIllegalDto::getAttachmentsFileList)
.leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId,CarIllegal::getId);
List<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinList(CarIllegalDto.class,wrapper);
System.out.println(1);
}結(jié)果

分頁(yè)查詢
連表分頁(yè)查詢返回所有命中記錄(請(qǐng)啟用mybatis-plus分頁(yè)插件)
import com.baomidou.mybatisplus.core.metadata.IPage;
@Test
public void testSelect() throws IOException {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper<CarIllegalDto>()
.selectAll(CarIllegalDto.class)
.selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo)
.selectCollection(AttachmentsFile.class,CarIllegalDto::getAttachmentsFileList)
.leftJoin(AttachmentsFile.class,AttachmentsFile::getTargetId, CarIllegal::getId);
IPage<CarIllegalDto> carIllegalDtoList = carIllegalMapper.selectJoinPage(new Page<>(1, 10),CarIllegalDto.class,wrapper);
System.out.println(carIllegalDtoList);
}結(jié)果

5、MPJLambdaWrapper所有方法說(shuō)明
select
- 查詢指定字段
select(AttachmentsFile::getName)
- 支持可變參數(shù)
select(AttachmentsFile::getName,AttachmentsFile::getEnterpriseId)
- 自定義字符串查詢,需要對(duì)查詢的表命名別名
select("file.id");
select("file.id as 'pid'");
select("file.id", "file.name");
//需要對(duì)表進(jìn)行別名
.leftJoin(AttachmentsFile.class,"file",AttachmentsFile::getTargetId,CarIllegal::getId);selectAll
- 查詢指定類的全部字段
.selectAll(CarIllegalDto.class)
注意事項(xiàng):
- 一般一次查詢只建議調(diào)用一次selectAll(), 因?yàn)椴煌碇g可能會(huì)存在相同的字段, 比如id,create_time等通用字段, 多次調(diào)用會(huì)導(dǎo)致字段名重復(fù), 除非能保證字段不重復(fù)
- 所以一次查詢推薦只使用一次, 并且通常是對(duì)主表使用, 其他表字段通過(guò)其他方式查詢, 比如select, selectAs, selectAsClass等
selectAs
- 別名查詢
.selectAs(AttachmentsFile::getId,CarIllegalDto::getCarNo) //對(duì)應(yīng)sql t.id AS carNo
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud Config統(tǒng)一配置中心問(wèn)題分析解決與客戶端動(dòng)態(tài)刷新實(shí)現(xiàn)
springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-10-10
Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Java實(shí)現(xiàn)冒泡排序簡(jiǎn)單示例
冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法,它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái),下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)冒泡排序的相關(guān)資料,需要的朋友可以參考下2023-06-06
eclipse輸出Hello World的實(shí)現(xiàn)方法
這篇文章主要介紹了eclipse輸出Hello World的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
java GUI實(shí)現(xiàn)學(xué)生圖書(shū)管理簡(jiǎn)單實(shí)例
這篇文章主要為大家詳細(xì)介紹了java GUI實(shí)現(xiàn)學(xué)生圖書(shū)管理簡(jiǎn)單示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

