吴忠躺衫网络科技有限公司

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

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

3天內不再提示

你還在手寫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,如果需要支持就必須自己去實現。但是對于大部分的業(yè)務場景來說,都需要多表 join,要不然就沒必要采用關系型數據庫了。

那么有沒有一種不通過硬 SQL 的形式,通過框架提供 join 能力呢?答案是,可以有。經過一段時間的插眼排眼操作,成功的封裝了一個 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 實現的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址: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));
}
}

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

MPJLambdaWrapper 還有很多其他的功能

  • 簡單的SQL函數使用: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));
}
}

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

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

分頁查詢

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

對應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")
//行列轉換
.select("CASEt.sexWHEN'男'THEN'1'ELSE'0'ENDASsex")
//求和函數
.select("sum(a.province)ASprovince")
//自定義數據集
.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"));
}
}

對應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 感興趣的,可以下載對應的源碼,進一步的學習!



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

    關注

    7

    文章

    3846

    瀏覽量

    64686
  • 源碼
    +關注

    關注

    8

    文章

    652

    瀏覽量

    29455
  • Join
    +關注

    關注

    0

    文章

    9

    瀏覽量

    3270

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

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

收藏 人收藏

    評論

    相關推薦

    一文了解MyBatis查詢原理

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

    如何一鍵生成mybatisplus

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

    mybatis plus的常規(guī)用法

    上篇文章我們介紹過通過 Mybatis Plus 進行增刪改查,如下這段代碼: /** * 根據id修改 * UPDATE user SET user_name=?, user_age
    的頭像 發(fā)表于 09-25 15:06 ?977次閱讀
    <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 ?2661次閱讀
    一篇讓<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用戶。包括引入,配置,使用,以及擴展等常用的方面做一個匯總整理,盡量包含大家常用的場景內容。
    的頭像 發(fā)表于 08-22 11:56 ?1371次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對比

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

    源碼學習之MyBatis的底層查詢原理

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

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

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

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

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

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

    `的所有功能`MyBatis Plus Join`同樣擁有;框架的使用方式和`MyBatis Plus`一樣簡單,幾行代碼就能實現
    的頭像 發(fā)表于 02-28 15:19 ?2543次閱讀
    <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 ?1200次閱讀
    介紹一款基于<b class='flag-5'>Mybatis-Plus</b>的代碼自助生成器

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

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

    SpringBoot+Mybatis如何實現流式查詢?

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

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

    使用顯示連接left join(right join,inner join),盡量避免隱式連接(where逗號連接 .... and .... and ...)這類寫法,假設三張
    的頭像 發(fā)表于 04-24 12:33 ?647次閱讀
    MySQL<b class='flag-5'>聯(lián)</b><b class='flag-5'>表</b><b class='flag-5'>查詢</b>優(yōu)化
    任你博百家乐官网现金网| 百家乐2棋牌作弊软件| 百家乐官网国际娱乐场开户注册| 百家乐官网电投网址| 百家乐官网大赢家客户端| 屯门区| 德惠市| 太阳城百家乐官网赌博害人| 百家乐官网台布21点| 富易堂百家乐官网娱乐城| 开心8百家乐官网现金网| 百家乐官网塑料扑克牌盒| 百家乐官网技巧方法| 百家乐官网园百乐彩| 百家乐大眼仔小路| 真钱百家乐大转轮| 威尼斯人娱乐城代理| 大发888手机版官网| 在线真人娱乐| 百家乐官网投注技巧球讯网| 百家乐官网十赌九诈| 百家乐官网正负计算| 百家乐书| 老虎机规律| 名门国际娱乐| 百家乐官网线上真人游戏| 玩百家乐官网如何硬| 百家乐官网必胜绝| 澳门百家乐洗码提成查询| 百家乐娱乐城新闻| 百家乐巴厘岛平台| 网上百家乐真钱游戏| 太阳城网上投注| 百家乐官网翻天youtube| 百家乐小77论坛| 百家乐博弈指| 网上合法赌博网站| 百家乐博百家乐的玩法技巧和规则| 二八杠游戏平台| 玩机器百家乐官网心得| 八运24山阴阳|