精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

Mybatis-Plus使用技巧與隱患分析

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-07-27 10:39 ? 次閱讀

前言

MP 從出現(xiàn)就一直有爭議 感覺一直 都存在兩種聲音

like:

很方便啊 通過函數(shù)自動拼接Sql 不需要去XML 再去使用標簽 之前一分鐘寫好的Sql 現(xiàn)在一秒鐘就能寫好 簡直不要太方便

dislike:

侵入Service層 不好維護 可讀性差 代碼耦合 效率不行 sql優(yōu)化比較難

之前也有前輩說少用MP 理由就是不好維護 但是這個東西真的是方便 只要不是強制不讓用 就還是會去使用 存在集合里 最近也確實有一些體會 就從兩個角度去看一下MP

優(yōu)點

操作簡潔

就從我們編碼中最常用的增刪改查去說

按照我們之前去使用Mybatis的喜歡我們就要去建立一個XML文件 去編寫Sql語句 算是半自動 我們可以直接去操控Sql語句 但是會比較麻煩 很多簡單的數(shù)據(jù)查詢我們都要去寫一個標簽 感覺這種沒有意義的操作還是比較煩的 那么MP里面怎么實現(xiàn)

第一種:最簡單我們就是直接去使用提供的方法 我們非常簡單就能做到這些操作 但是這個就有一個問題

nodeMapper.selectById(1);
nodeMapper.deleteById(2);
nodeMapper.updateById(newNode());
nodeMapper.insert(newNode());

維護性差 以查詢?yōu)槔?這個默認提供的方法都是查詢所有字段我們都知道在編寫Sql的時候第一條優(yōu)化準則就是不要使用Select * 因為這種寫法是很Low

這個就是上面selectById執(zhí)行的結果

SELECTId,name,pidFROMnodeWHEREId=?

這種Sql 肯定是不好的所以我們在使用MP的時候盡量不要去使用自帶的快捷查詢 我們可以去使用它里面的構造器

nodeMapper.selectOne(newQueryWrapper().eq("id",1).select("id"));

這匯總寫法 我們可以通過后面的select() 去指定我們需要查詢的字段 算是解決上面那個問題嗎 但是這個就完事了嗎?這還有一個問題

我們在開發(fā)中經(jīng)常會說一個叫魔法值的東西

//這個就是魔法值
if("變成派大星".equals(node.getName())){
System.out.println("魔法值");
}

之所以不要多用魔法值就是為了后期維護 我們建議使用枚舉 或者建一個常量類 通過Static final修飾

上面那段代碼是不是也有同樣問題 "id"算不算魔法值呢 這種構造器產(chǎn)生的問題就是 不好維護

假設 我們的這Node類是高度使用的 我們到處都在寫

nodeMapper.selectOne(newQueryWrapper().eq("id",1).select("id"));

剛開始沒事 我們樂呵呵的 但是一旦我去修改Id 的字段名怎么辦

1047af64-2c1e-11ee-a368-dac502259ad0.jpg

我修改成test(數(shù)據(jù)庫同步修改) 現(xiàn)在這個實體類中沒有這個字段 我們再去看我們的代碼

105fb21c-2c1e-11ee-a368-dac502259ad0.jpg

沒有什么反應 沒有給我提示報錯 我這個時候去運行怎么辦 我要一個個去找這個錯誤嗎 這明顯很費時間

這個確實是一個問題 但是也是可以解決的

Nodenode=nodeMapper.selectOne(newLambdaQueryWrapper().eq(Node::getId,1).select(Node::getId));

上面這種代碼就可以去解決這個問題 我們在使用的時候可以多用這個東西

108021d2-2c1e-11ee-a368-dac502259ad0.jpg

一旦修改字段就會立馬報錯

但是 這就萬事大吉了嗎 NO No NO 我們要是處理稍微復雜的語句怎么辦?比如如我們字段求和 這個LambdaQueryWrapper還是存在限制的

如果我們想實現(xiàn)這種 怎么去做呢

selectSUM(price_count)frombla_order_dataLIMIT100

首先這種寫法肯定是不太行的 編譯不通過

108fee3c-2c1e-11ee-a368-dac502259ad0.jpg

除非去使用QueryWrapper

10a60d70-2c1e-11ee-a368-dac502259ad0.jpg

還有就是分頁查詢

//條件查詢
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getAge,20);
//分頁對象
PagequeryPage=newPage<>(page,limit);
//分頁查詢
IPageiPage=userInfoMapper.selectPage(queryPage,queryWrapper);
//數(shù)據(jù)總數(shù)
Longtotal=iPage.getTotal();
//集合數(shù)據(jù)
Listlist=iPage.getRecords();

這個還是非常簡單的

簡單總結

MP 在做一些簡單的單表查詢可以去使用但是對于一些復雜的SQl操作還是不要用

1、SQL侵入Service 的問題我們可以仿照 Mybatis 建一個專門存放 MP查詢的包

2、關于維護性 我們可以盡量去使用 LambdaQueryWrapper 去構造

3、MP是有內置的主鍵生成策略

4、內置分頁插件:基于 Mybatis 物理分頁,開發(fā)者無需關心具體操作,配置好插件之后,寫分頁等同于普通List查詢。

缺點

我就說一個最大的缺點就是對于復雜Sql 的操作性很不舒服 比如我們去多表查詢 你怎么去寫呢

看一個例子

10bc9446-2c1e-11ee-a368-dac502259ad0.jpg10cd123a-2c1e-11ee-a368-dac502259ad0.jpg

就是通過 @Select 注解將Mp的查詢條件嵌入進去${ew.customSqlSegment}

咱就是一整個大問號 聯(lián)表老老實實去寫XML吧 這種真的不要去用 太丑了

總結

沒有過多的東西 基本都是最近看到的東西

1、復雜語句不推薦使用MP 能用最好也別用 可讀性差 難維護 使用剛開始沒感覺 后期業(yè)務擴充 真的惡心的

2、可以使用MP中的分頁 比較舒服 逐漸生成策略也舒服

3、盡量不要去使用MP中自帶的selectById 等全表查詢的方法

4、盡量使用LambdaQueryWrapper的書寫形式 至少比較好維護

5、簡單重復Sql 可以用MP。復雜SQL不要用






審核編輯:劉清

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

    關注

    45

    文章

    3597

    瀏覽量

    134171
  • SQL
    SQL
    +關注

    關注

    1

    文章

    760

    瀏覽量

    44078
  • XML技術
    +關注

    關注

    0

    文章

    15

    瀏覽量

    6010

原文標題:Mybatis-Plus 使用技巧與隱患

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

收藏 人收藏

    評論

    相關推薦

    一文了解MyBatis的查詢原理

    本文通過MyBatis一個低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查詢流程,從配置文件的解析到一個查詢的完整執(zhí)行過程詳細解讀MyBatis的一次查詢流
    的頭像 發(fā)表于 10-10 11:42 ?1402次閱讀

    mybatis plus的常規(guī)用法

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

    #硬聲創(chuàng)作季 Java項目實戰(zhàn):MyBatis-Plus簡介

    PlusJAVA編程語言
    Mr_haohao
    發(fā)布于 :2022年09月07日 10:15:17

    Mybatis的內部設計介紹

    Mybatis源碼分析-整體設計(一)
    發(fā)表于 06-06 09:43

    一篇讓你熟練掌握 MyBatis-Plus

    MyBatis-plus 是一款 Mybatis 增強工具,用于簡化開發(fā),提高效率。下文使用縮寫 mp來簡化表示 MyBatis-plus,本文主要介紹 mp 搭配 Spring Boot
    的頭像 發(fā)表于 06-01 09:30 ?2574次閱讀
    一篇讓你熟練掌握 <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 ?1290次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對比

    mapper中再組裝參數(shù)。那對比原生Mybatis, Mybatis Plus或者其他框架,F(xiàn)luentMybatis提供了哪些便利呢?
    的頭像 發(fā)表于 09-15 15:41 ?1406次閱讀

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

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

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

    MyBatis Plus Join`一款專門解決MyBatis Plus 關聯(lián)查詢問題的擴展框架,他并不一款全新的框架,而是基于`MyBatis
    的頭像 發(fā)表于 02-28 15:19 ?2405次閱讀
    <b class='flag-5'>MyBatis-Plus</b>為什么不支持聯(lián)表

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

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

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

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

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

    眾所周知,mybatis plus 封裝的 mapper 不支持 join,如果需要支持就必須自己去實現(xiàn)。但是對于大部分的業(yè)務場景來說,都需要多表 join,要不然就沒必要采用關系型數(shù)據(jù)庫了。
    的頭像 發(fā)表于 07-07 10:19 ?2497次閱讀
    你還在手寫join聯(lián)表查詢?<b class='flag-5'>MyBatis-Plus</b>這樣寫太香了!

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

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

    mybatis和mybatisplus的區(qū)別

    MyBatisMyBatis Plus是兩個非常受歡迎的Java持久層框架。這兩個框架在設計和功能上有一些區(qū)別,下面我將詳細介紹它們之間的差異以及各自的特點。 設計理念與目標: MyBati
    的頭像 發(fā)表于 12-03 11:53 ?2487次閱讀