色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-07-07 10:19 ? 次閱讀

  • 使用方法
    • 安裝
    • 使用
  • 核心類 MPJLambdaWrapper和MPJQueryWrapper
    • MPJLambdaWrapper用法
    • MPJQueryWrapper

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


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

那么有沒有一種不通過硬 SQL 的形式,通過框架提供 join 能力呢?答案是,可以有。經(jīng)過一段時間的插眼排眼操作,成功的封裝了一個 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,再引入以上依賴。

注意:mybatis plus version >= 3.4.0。

使用

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

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

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

核心類 MPJLambdaWrapper和MPJQueryWrapper

MPJLambdaWrapper用法

簡單的三表查詢

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));
}
}

對應(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>?)

說明:

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

MPJLambdaWrapper 還有很多其他的功能

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

分頁查詢

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));
}
}

對應(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

簡單的3表查詢

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"));
}
}

對應(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<=??)

說明:

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

分頁查詢

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"));
}
}

對應(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"));
}
}

對應(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

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



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

    關(guān)注

    7

    文章

    3794

    瀏覽量

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

    關(guān)注

    8

    文章

    639

    瀏覽量

    29185
  • Join
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    3258

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    一文了解MyBatis查詢原理

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

    mybatis plus的常規(guī)用法

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

    一篇讓熟練掌握 MyBatis-Plus

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

    Mybatis-Plus Mybatis增強工具包

    ./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>增強工具包

    MyBatis-Plus的使用與測試

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

    Fluent Mybatis、原生MybatisMybatis Plus對比

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

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

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

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

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

    SpringBoot中MybatisX插件的簡單使用教程

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

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

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

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

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

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

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

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

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

    MyBatis Plus如何簡化開發(fā)

    本篇文章,我們通過 MyBatis Plus 來對一張進行 CRUD 操作,來看看是如何簡化我們開發(fā)的。 1、創(chuàng)建測試表 創(chuàng)建 USER : DROP TABLE IF EXIST
    的頭像 發(fā)表于 10-09 15:08 ?423次閱讀
    <b class='flag-5'>MyBatis</b> <b class='flag-5'>Plus</b>如何簡化開發(fā)

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

    使用顯示連接left join(right join,inner join),盡量避免隱式連接(where逗號連接 .... and .... and ...)這類寫法,假設(shè)三張
    的頭像 發(fā)表于 04-24 12:33 ?576次閱讀
    MySQL<b class='flag-5'>聯(lián)</b><b class='flag-5'>表</b><b class='flag-5'>查詢</b>優(yōu)化
    主站蜘蛛池模板: 中文字幕在线视频观看| 精品丰满人妻无套内射| 日本熟妇乱妇熟色在线电影| Y8848高清私人影院软件优势| 欧美猛男gaygayxxgv| 边摸边吃奶边做下面视频| 日本福利片午夜免费观着| 被窝国产理论一二三影院| 日本无码人妻精品一区二区视频 | 成人免费在线视频| 无人影院在线播放视频| 拔萝卜视频免费看高清| 亚洲精品久久久久69影院| 免费国产麻豆传| 国产人妻777人伦精品HD| 谁有成人网站地址| 极品色αv影院| a亚洲在线观看不卡高清| 视频一区国产在线第一页| 国产日韩精品一区二区三区在线| 亚洲精品黄色| 欧美乱子YELLOWVIDEO| 国产精品A8198V久久A片| 伊人精品在线| 日本高清不卡一区久久精品| 国产精品亚洲精品日韩电影| 伊人久久大香线蕉综合bd高清| 性做久久久久久久久浪潮| 国产婷婷午夜无码A片| 最近最新中文字幕MV高清在线| 免费在线a| 国产白浆视频在线播放| 在线观看亚洲 日韩 国产| 蜜桃人妻无码AV天堂三区| SORA是什么意思| 日本女人水多| 久草在线福利视频在线播放| 国产精品久久久久影院色老大| 阿v天堂2017在无码| 99久久全国免费久久爱| 91av成年影院在线播放|