一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你還在手寫(xiě)join聯(lián)表查詢(xún)?MyBatis-Plus這樣寫(xiě)太香了!

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-07-07 10:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • 使用方法
    • 安裝
    • 使用
  • 核心類(lèi) MPJLambdaWrapper和MPJQueryWrapper
    • MPJLambdaWrapper用法
    • MPJQueryWrapper

71f3eb8c-1c66-11ee-962d-dac502259ad0.jpg


眾所周知,mybatis plus 封裝的 mapper 不支持 join,如果需要支持就必須自己去實(shí)現(xiàn)。但是對(duì)于大部分的業(yè)務(wù)場(chǎng)景來(lái)說(shuō),都需要多表 join,要不然就沒(méi)必要采用關(guān)系型數(shù)據(jù)庫(kù)了。

那么有沒(méi)有一種不通過(guò)硬 SQL 的形式,通過(guò)框架提供 join 能力呢?答案是,可以有。經(jīng)過(guò)一段時(shí)間的插眼排眼操作,成功的封裝了一個(gè) jar 包。本文講講它的用法。

使用方法

安裝

  • Maven
<dependency>
<groupId>com.github.yulichanggroupId>
<artifactId>mybatis-plus-joinartifactId>
<version>1.2.4version>
dependency>
  • Gradle
implementation'com.github.yulichang1.2.4'

或者 clone 代碼到本地執(zhí)行 mvn install,再引入以上依賴(lài)。

注意:mybatis plus version >= 3.4.0。

使用

  • mapper繼承MPJBaseMapper (必選)
  • service繼承MPJBaseService (可選)
  • serviceImpl繼承MPJBaseServiceImpl (可選)

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

核心類(lèi) MPJLambdaWrapper和MPJQueryWrapper

MPJLambdaWrapper用法

簡(jiǎn)單的三表查詢(xún)

classtest{
@Resource
privateUserMapperuserMapper;

voidtestJoin(){
Listlist=userMapper.selectJoinList(UserDTO.class,
newMPJLambdaWrapper<UserDO>()
.selectAll(UserDO.class)
.select(UserAddressDO::getTel)
.selectAs(UserAddressDO::getAddress,UserDTO::getUserAddress)
.select(AreaDO::getProvince,AreaDO::getCity)
.leftJoin(UserAddressDO.class,UserAddressDO::getUserId,UserDO::getId)
.leftJoin(AreaDO.class,AreaDO::getId,UserAddressDO::getAreaId)
.eq(UserDO::getId,1)
.like(UserAddressDO::getTel,"1")
.gt(UserDO::getId,5));
}
}

對(duì)應(yīng)sql

SELECT
t.id,
t.name,
t.sex,
t.head_img,
t1.tel,
t1.addressASuserAddress,
t2.province,
t2.city
FROM
usert
LEFTJOINuser_addresst1ONt1.user_id=t.id
LEFTJOINareat2ONt2.id=t1.area_id
WHERE(
t.id=?
ANDt1.telLIKE?
ANDt.id>?)

說(shuō)明:

  • UserDTO.class 查詢(xún)結(jié)果返回類(lèi)(resultType)
  • selectAll() 查詢(xún)指定實(shí)體類(lèi)的全部字段
  • select() 查詢(xún)指定的字段,支持可變參數(shù),同一個(gè)select只能查詢(xún)相同表的字段故將UserAddressDO和AreaDO分開(kāi)為兩個(gè)select()
  • selectAs() 字段別名查詢(xún),用于數(shù)據(jù)庫(kù)字段與業(yè)務(wù)實(shí)體類(lèi)屬性名不一致時(shí)使用
  • leftJoin() 參數(shù)說(shuō)明第一個(gè)參數(shù): 參與連表的實(shí)體類(lèi)class第二個(gè)參數(shù): 連表的ON字段,這個(gè)屬性必須是第一個(gè)參數(shù)實(shí)體類(lèi)的屬性第三個(gè)參數(shù): 參與連表的ON的另一個(gè)實(shí)體類(lèi)屬性
  • 默認(rèn)主表別名是t,其他的表別名以先后調(diào)用的順序使用t1,t2,t3....
  • 條件查詢(xún),可以查詢(xún)主表以及參與連接的所有表的字段,全部調(diào)用mp原生的方法,正常使用沒(méi)有sql注入風(fēng)險(xiǎn)

MPJLambdaWrapper 還有很多其他的功能

  • 簡(jiǎn)單的SQL函數(shù)使用:https://gitee.com/best_handsome/mybatis-plus-join/wikis/selectFunc()?sort_id=4082479
  • ON語(yǔ)句多條件支持:https://gitee.com/best_handsome/mybatis-plus-join/wikis/leftJoin?sort_id=3496671

分頁(yè)查詢(xún)

classtest{
@Resource
privateUserMapperuserMapper;

voidtestJoin(){
IPageiPage=userMapper.selectJoinPage(newPage<>(2,10),UserDTO.class,
newMPJLambdaWrapper<UserDO>()
.selectAll(UserDO.class)
.select(UserAddressDO::getTel)
.selectAs(UserAddressDO::getAddress,UserDTO::getUserAddress)
.select(AreaDO::getProvince,AreaDO::getCity)
.leftJoin(UserAddressDO.class,UserAddressDO::getUserId,UserDO::getId)
.leftJoin(AreaDO.class,AreaDO::getId,UserAddressDO::getAreaId));
}
}

對(duì)應(yīng)sql

SELECT
t.id,
t.name,
t.sex,
t.head_img,
t1.tel,
t1.addressASuserAddress,
t2.province,
t2.city
FROM
usert
LEFTJOINuser_addresst1ONt1.user_id=t.id
LEFTJOINareat2ONt2.id=t1.area_id
LIMIT?,?

MPJQueryWrapper

簡(jiǎn)單的3表查詢(xún)

classtest{
@Resource
privateUserMapperuserMapper;

voidtestJoin(){
Listlist=userMapper.selectJoinList(UserDTO.class,
newMPJQueryWrapper<UserDO>()
.selectAll(UserDO.class)
.select("addr.tel","addr.address","a.province")
.leftJoin("user_addressaddront.id=addr.user_id")
.rightJoin("areaaonaddr.area_id=a.id")
.like("addr.tel","1")
.le("a.province","1"));
}
}

對(duì)應(yīng) sql

SELECT
t.id,
t.name,
t.sex,
t.head_img,
addr.tel,
addr.address,
a.province
FROM
usert
LEFTJOINuser_addressaddront.id=addr.user_id
RIGHTJOINareaaonaddr.area_id=a.id
WHERE(
addr.telLIKE?
ANDa.province<=??)

說(shuō)明:

  • UserDTO.class 查詢(xún)結(jié)果類(lèi)(resultType)
  • selectAll(UserDO.class) 查詢(xún)主表全部字段(主表實(shí)體類(lèi))默認(rèn)主表別名 "t"
  • select() mp的select策略是覆蓋,以最后一次為準(zhǔn),這里的策略是追加,可以一直select主表字段可以用lambda,會(huì)自動(dòng)添加表別名,主表別名默認(rèn)是 t ,非主表字段必須帶別名查詢(xún)
  • leftJoin() rightJoin() innerJoin() 傳sql片段 格式 (表 + 別名 + 關(guān)聯(lián)條件)
  • 條件查詢(xún),可以查詢(xún)主表以及參與連接的所有表的字段,全部調(diào)用mp原生的方法,正常使用沒(méi)有sql注入風(fēng)險(xiǎn)

分頁(yè)查詢(xún)

classtest{
@Resource
privateUserMapperuserMapper;

voidtestJoin(){
IPagepage=userMapper.selectJoinPage(newPage<>(1,10),UserDTO.class,
newMPJQueryWrapper<UserDO>()
.selectAll(UserDO.class)
.select("addr.tel","addr.address")
.select("a.province")
.leftJoin("user_addressaddront.id=addr.user_id")
.rightJoin("areaaonaddr.area_id=a.id"));
}
}

對(duì)應(yīng)sql

SELECT
t.id,
t.name,
t.sex,
t.head_img,
addr.tel,
addr.address,
a.province
FROM
usert
LEFTJOINuser_addressaddront.id=addr.user_id
RIGHTJOINareaaonaddr.area_id=a.id
LIMIT?,?

還可以這么操作,但不建議

classtest{
@Resource
privateUserMapperuserMapper;

voidtestJoin(){
Listlist=userMapper.selectJoinList(UserDTO.class,
newMPJQueryWrapper<UserDO>()
.selectAll(UserDO.class)
.select("addr.tel","addr.address")
//行列轉(zhuǎn)換
.select("CASEt.sexWHEN'男'THEN'1'ELSE'0'ENDASsex")
//求和函數(shù)
.select("sum(a.province)ASprovince")
//自定義數(shù)據(jù)集
.leftJoin("(select*fromuser_address)addront.id=addr.user_id")
.rightJoin("areaaonaddr.area_id=a.id")
.like("addr.tel","1")
.le("a.province","1")
.orderByDesc("addr.id"));
}
}

對(duì)應(yīng)sql

SELECT
t.id,
t.name,
t.sex,
t.head_img,
addr.tel,
addr.address,
CASEt.sexWHEN'男'THEN'1'ELSE'0'ENDASsex,
sum(a.province)ASprovince
FROM
usert
LEFTJOIN(select*fromuser_address)addront.id=addr.user_id
RIGHTJOINareaaonaddr.area_id=a.id
WHERE(
addr.telLIKE?
ANDa.province<=??)
ORDERBY
addr.idDESC

針對(duì)以上 jar 感興趣的,可以下載對(duì)應(yīng)的源碼,進(jìn)一步的學(xué)習(xí)!



聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3926

    瀏覽量

    66194
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    671

    瀏覽量

    30321
  • Join
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    3431

原文標(biāo)題:你還在手寫(xiě) join 聯(lián)表查詢(xún)?MyBatis-Plus 這樣寫(xiě)太香了!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    一文了解MyBatis查詢(xún)原理

    可以詳細(xì)了解MyBatis的一次查詢(xún)過(guò)程。在平時(shí)的代碼編寫(xiě)中,發(fā)現(xiàn)MyBatis一個(gè)低版本的bug(3.4.5之前的版本),由于現(xiàn)在很多工程中的版本都是低于3.4.5的,因此在這里用
    的頭像 發(fā)表于 10-10 11:42 ?1710次閱讀

    如何一鍵生成mybatisplus

    的代碼??赡軇e人花兩天時(shí)間完成的代碼,一個(gè)小時(shí)就搞定。 1、官方教程 參考文檔如下:https://mybatis.plus/guide/generator.html 其實(shí)官方教程寫(xiě)
    的頭像 發(fā)表于 09-25 14:23 ?1036次閱讀
    如何一鍵生成mybatisplus

    mybatis plus的常規(guī)用法

    上篇文章我們介紹過(guò)通過(guò) Mybatis Plus 進(jìn)行增刪改查,如下這段代碼: /** * 根據(jù)id修改 * UPDATE user SET user_name=?, user_age
    的頭像 發(fā)表于 09-25 15:06 ?1209次閱讀
    <b class='flag-5'>mybatis</b> <b class='flag-5'>plus</b>的常規(guī)用法

    一篇讓熟練掌握 MyBatis-Plus!

    MyBatis-plus 是一款 Mybatis 增強(qiáng)工具,用于簡(jiǎn)化開(kāi)發(fā),提高效率。下文使用縮寫(xiě) mp來(lái)簡(jiǎn)化表示 MyBatis-plus,本文主要介紹 mp 搭配 Spring Boot
    的頭像 發(fā)表于 06-01 09:30 ?2882次閱讀
    一篇讓<b class='flag-5'>你</b>熟練掌握 <b class='flag-5'>MyBatis-Plus</b>!

    Mybatis-Plus Mybatis增強(qiáng)工具包

    ./oschina_soft/gitee-mybatis-plus.zip
    發(fā)表于 06-13 11:34 ?1次下載
    <b class='flag-5'>Mybatis-Plus</b> <b class='flag-5'>Mybatis</b>增強(qiáng)工具包

    MyBatis-Plus的使用與測(cè)試

    本文主要介紹mybatis-plus這款插件,針對(duì)springboot用戶(hù)。包括引入,配置,使用,以及擴(kuò)展等常用的方面做一個(gè)匯總整理,盡量包含大家常用的場(chǎng)景內(nèi)容。
    的頭像 發(fā)表于 08-22 11:56 ?1693次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對(duì)比

    使用fluent mybatis可以不用寫(xiě)具體的xml文件,通過(guò)java api可以構(gòu)造出比較復(fù)雜的業(yè)務(wù)sql語(yǔ)句,做到代碼邏輯和sql邏輯的合一。不再需要在Dao中組裝查詢(xún)或更新操作,在xml或
    的頭像 發(fā)表于 09-15 15:41 ?1675次閱讀

    源碼學(xué)習(xí)之MyBatis的底層查詢(xún)原理

    可以詳細(xì)了解MyBatis的一次查詢(xún)過(guò)程。在平時(shí)的代碼編寫(xiě)中,發(fā)現(xiàn)MyBatis一個(gè)低版本的bug(3.4.5之前的版本),由于現(xiàn)在很多工程中的版本都是低于3.4.5的,因此在這里用
    的頭像 發(fā)表于 10-10 11:42 ?1068次閱讀

    Mybatis Plus或者其他框架及FluentMybatis提供哪些便利呢?

    使用fluent mybatis可以不用寫(xiě)具體的xml文件,通過(guò)java api可以構(gòu)造出比較復(fù)雜的業(yè)務(wù)sql語(yǔ)句,做到代碼邏輯和sql邏輯的合一。
    的頭像 發(fā)表于 02-03 15:16 ?1037次閱讀

    SpringBoot中MybatisX插件的簡(jiǎn)單使用教程

    MybatisX 是一款基于 IDEA 的快速開(kāi)發(fā)插件,方便在使用mybatis以及mybatis-plus開(kāi)始時(shí)簡(jiǎn)化繁瑣的重復(fù)操作,提高開(kāi)發(fā)速率。
    的頭像 發(fā)表于 02-21 09:49 ?1681次閱讀

    MyBatis-Plus為什么不支持聯(lián)

    `的所有功能`MyBatis Plus Join`同樣擁有;框架的使用方式和`MyBatis Plus`一樣簡(jiǎn)單,幾行代碼就能實(shí)現(xiàn)
    的頭像 發(fā)表于 02-28 15:19 ?3094次閱讀
    <b class='flag-5'>MyBatis-Plus</b>為什么不支持<b class='flag-5'>聯(lián)</b><b class='flag-5'>表</b>

    介紹一款基于Mybatis-Plus的代碼自助生成器

    在基于Mybatis的開(kāi)發(fā)模式中,很多開(kāi)發(fā)者還會(huì)選擇Mybatis-Plus來(lái)輔助功能開(kāi)發(fā),以此提高開(kāi)發(fā)的效率。
    的頭像 發(fā)表于 05-23 14:16 ?1418次閱讀
    介紹一款基于<b class='flag-5'>Mybatis-Plus</b>的代碼自助生成器

    如何調(diào)優(yōu)MyBatis 25倍性能

    最近在壓測(cè)一批接口,發(fā)現(xiàn)接口處理速度慢的有點(diǎn)超出預(yù)期,感覺(jué)很奇怪,后面定位發(fā)現(xiàn)是數(shù)據(jù)庫(kù)批量保存這塊很慢。 這個(gè)項(xiàng)目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我點(diǎn)進(jìn)去看了下源碼,感覺(jué)有點(diǎn)不太對(duì)勁
    的頭像 發(fā)表于 05-30 09:56 ?857次閱讀
    如何調(diào)優(yōu)<b class='flag-5'>MyBatis</b> 25倍性能

    SpringBoot+Mybatis如何實(shí)現(xiàn)流式查詢(xún)?

    使用mybatis作為持久層的框架時(shí),通過(guò)mybatis執(zhí)行查詢(xún)數(shù)據(jù)的請(qǐng)求執(zhí)行成功后,mybatis返回的結(jié)果集不是一個(gè)集合或?qū)ο?,而是一個(gè)迭代器,可以通過(guò)遍歷迭代器來(lái)取出結(jié)果集
    的頭像 發(fā)表于 06-12 09:57 ?1516次閱讀

    MySQL聯(lián)查詢(xún)優(yōu)化

    使用顯示連接left join(right join,inner join),盡量避免隱式連接(where逗號(hào)連接 .... and .... and ...)這類(lèi)寫(xiě)法,假設(shè)三張
    的頭像 發(fā)表于 04-24 12:33 ?903次閱讀
    MySQL<b class='flag-5'>聯(lián)</b><b class='flag-5'>表</b><b class='flag-5'>查詢(xún)</b>優(yōu)化