最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot2.3 整合mybatis-plus 高級功能及用法詳解

 更新時間:2020年09月03日 08:12:25   作者:保護我方胖虎  
這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級功能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

學習并使用mybatis-plus的一些高級功能的用法例如: AR模式、 樂觀鎖 、邏輯刪除 、自動填充、數(shù)據(jù)保護等功能

為了方便演示,咱們還是新建一個全新的項目

image-20200806214645476

引入mp依賴

 <dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.3.2</version>
 </dependency>

yml配置

# 配置端口
server:
 port: 8080
spring:
 # 配置數(shù)據(jù)源
 datasource:
 driver-class-name: com.mysql.cj.jdbc.Driver
 url: jdbc:mysql://localhost:3306/mybatis-plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
 username: root
 password: root

# mybatis-plus相關(guān)配置
mybatis-plus:
 # 以下配置均有默認值,可以不設置
 global-config:
 db-config:
  #主鍵類型 auto:"數(shù)據(jù)庫ID自增"
  id-type: auto
 configuration:
 # 是否開啟自動駝峰命名規(guī)則映射:從數(shù)據(jù)庫列名到Java屬性駝峰命名的類似映射
 map-underscore-to-camel-case: true
 # 如果查詢結(jié)果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段
 call-setters-on-nulls: true
 # 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在 Spring Boot 啟動類中添加 @MapperScan 注解,掃描 Mapper 文件夾

image-20200806215534085

(一)AR模式使用

ActiveRecord模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作

即直接使用實體類 CRUD操作

1.繼承Model

image-20200806221012349

點進Model 類中 ,發(fā)現(xiàn)其提供了一些基礎的CRUD操作方法,并實現(xiàn)了序列化接口

image-20200806220842130

注意的是,如果要使用ActiveRecord模式,僅僅繼承Model 是不行的,這一點官網(wǎng)沒有很顯示的提到,還需要編寫mapper接口 繼承BaseMapper接口,泛型為當前實體類

2.mapper接口

如果不編寫Mapper直接使用Model方法會報錯:

image-20200806221302376

那么,咱們來編寫mapper

image-20200806221326120

再次測試

3.CRUD操作

新增操作

image-20200806221413677

查詢操作

image-20200806221705933

修改操作

image-20200806221825358

刪除操作

image-20200806221936204

此AR模式呢,可以在開發(fā)中減少我們很多的調(diào)用代碼,簡單操作無需額外使用Mapper、service調(diào)用

(二)樂觀鎖

使用Mybatis-plus實現(xiàn)樂觀鎖

樂觀鎖:總是假設最好的情況,每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量。

mybatis-plus 提供的樂觀鎖 是采用了版本號機制

數(shù)據(jù)表中加上一個數(shù)據(jù)版本號version字段,表示數(shù)據(jù)被修改的次數(shù),當數(shù)據(jù)被修改時,version值會加一。當線程A要更新數(shù)據(jù)值時,在讀取數(shù)據(jù)的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當前數(shù)據(jù)庫中的version值相等時才更新,否則重試更新操作,直到更新成功。

mp項目使用樂觀鎖是使用其插件配置–配置Bean的形式

1.bean配置

@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
 return new OptimisticLockerInterceptor();
}

image-20200806222513767

2.實體類以及數(shù)據(jù)庫添加對應字段以及列

@Version
private Integer version;

image-20200806222639173

image-20200806222908272

至于version初始值,可以數(shù)據(jù)庫默認設置為0,也可以再新增數(shù)據(jù)時手動設置verion版本號,個人是采用了數(shù)據(jù)庫默認值

那么我們在做任何查詢修改刪除的時候呢,mp會默認幫我們吧版本號作為條件帶上,判斷與數(shù)據(jù)庫中該數(shù)據(jù)版本號是否一致。

3.相關(guān)操作以及注意事項

首先插入一條數(shù)據(jù)

image-20200806223134584

image-20200806223150227

查詢并修改該條信息

發(fā)現(xiàn)其在修改的時候,將version作為了條件,并對version做了修改 set操作(默認是在原基礎上+1)

image-20200806224245623

image-20200806224258714

需要注意的幾個點:

支持的數(shù)據(jù)類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整數(shù)類型下 newVersion = oldVersion + 1
newVersion 會回寫到 entity 中
僅支持 updateById(id) 與 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能復用!!!

什么意思呢,就是要想使用樂觀說,首先 類型有限制,其次,修改方法僅僅只有上方兩個有效,才會在修改時候?qū)Π姹咎柧托行薷牟僮?以及 要想版本號升級必須 是要把之前版本號傳過去。

即version操作時,我必須把舊的帶過去

版本號不對,是無法進行數(shù)據(jù)更新操作的(刪除、修改)

image-20200806224911876

而如果不傳遞版本號的話,那么該字段就不會被維護了(失去了樂觀鎖 版本號機制 的意義了)

image-20200806225056838

版本號回傳 修改正確 版本號維護成功

image-20200806225332135

如此,就實現(xiàn)了樂觀鎖了,mp基礎上使用樂觀鎖,就是這么簡單

(三)邏輯刪除

物理刪除:將數(shù)據(jù)庫中該信息進行徹底刪除,無法恢復。 應的SQL語句:delete from 表名 where 條件

邏輯刪除:邏輯刪除的本質(zhì)是修改操作,所謂的邏輯刪除其實并不是真正的刪除,而是在表中將對應的是否刪除標識,然后修改 查詢操作時將 是否刪除標識字段作為條件帶上,進而達到邏輯上刪除了數(shù)據(jù),但實際仍然保留了數(shù)據(jù)(盡管此數(shù)據(jù)在邏輯中不會再使用了)

例如:自己設置一個邏輯刪除字段,例如1表示數(shù)據(jù)有效,0表示被刪除即可,默認是1

Mybatis-plus 已經(jīng)為我們提供了邏輯刪除封裝

只對自動注入的sql起效:

插入: 不作限制
查找: 追加where條件過濾掉已刪除數(shù)據(jù),且使用 wrapper.entity 生成的where條件會忽略該字段
更新: 追加where條件防止更新到已刪除數(shù)據(jù),且使用 wrapper.entity 生成的where條件會忽略該字段
刪除: 轉(zhuǎn)變?yōu)?更新
例如:

刪除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
字段類型支持說明:

支持所有數(shù)據(jù)類型(推薦使用 Integer,Boolean,LocalDateTime)
如果數(shù)據(jù)庫字段使用datetime,邏輯未刪除值和已刪除值支持配置為字符串null,另一個值支持配置為函數(shù)來獲取值如now()
附錄:

邏輯刪除是為了方便數(shù)據(jù)恢復和保護數(shù)據(jù)本身價值等等的一種方案,但實際就是刪除。
如果你需要頻繁查出來看就不應使用邏輯刪除,而是以一個狀態(tài)去表示。

使用步驟:

1.數(shù)據(jù)庫添加字段

對某個表的數(shù)據(jù)需要使用邏輯刪除,則必須創(chuàng)建邏輯刪除字段

image-20200808110331856

2.mp邏輯刪除配置

在原有的mp配置上 添加邏輯刪除設置

其已刪除 未刪除值均有默認值 1 0 如果你預想設置值與之一致,僅僅編寫 邏輯刪除字段名即可

image-20200808110905817

3.實體類加邏輯刪除字段以及注解

image-20200808111149966

mp中 邏輯刪除相關(guān)配置就沒了 ,很是簡單------------咱們開始測試

咱們先刪除數(shù)據(jù)庫中原有數(shù)據(jù)

image-20200808111441145

可以看到 ,刪除語句實際上是執(zhí)行了update(修改) 額外將 我們設置好的邏輯刪除字段值作為條件(未刪除 0),并修改 值為1(已刪除)

image-20200808111531657

接下來,我們來進行查詢操作,看是否還能取出數(shù)據(jù)

total=0 ,沒有數(shù)據(jù), 那么我們便做到了業(yè)務意義上的數(shù)據(jù)刪除(邏輯刪除)

image-20200808111933875

其只要是設置了邏輯刪除 ,修改 刪除 查詢操作均會攜帶上未刪除條件 ,保證操作的數(shù)據(jù)時 “存在” 的()

(四)自動填充

在開發(fā)中哈,我們一個表的字段除了業(yè)務字段外,實際上還會添加維護字段 ,即 創(chuàng)建人 創(chuàng)建時間 修改人 修改時間 ,讓數(shù)據(jù)的操作 有跡可循,方便管理

如下:

image-20200808112656976

實體類添加維護字段信息

image-20200808112809346

那么每次在操作數(shù)據(jù)的時候需要我們手動插入到該model中 進行保存,再操作數(shù)據(jù)

例如添加時

image-20200808113226978

image-20200808113243561

例如修改時

image-20200808113539478

image-20200808113559081

這樣呢,每次我們在操作數(shù)據(jù)時都需要在業(yè)務代碼中編寫 新增用戶ID 當前時間 修改用戶ID 修改時間等字段等,就比較繁瑣

項目很大,幾百個Model 乘以Four 那么就額外編寫幾千行代碼進行維護了

解決辦法:

1.自定義Aop 進行數(shù)據(jù)填充

2.使用現(xiàn)成的 (mp都用了,用他的自動填充不香嗎)

操作開始:

1.自定義實現(xiàn)類 MyMetaObjectHandler

這里需要注意哈

這二者呢,一個是插入的類型 一個是插入的值 必須對應上,或者 自動填充時會報錯

image-20200808114936751

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

 @Override
 public void insertFill(MetaObject metaObject) {
  log.info("start insert fill ....");
  this.strictInsertFill(metaObject, "createTime", Long.class, System.currentTimeMillis());
  //開發(fā)中 創(chuàng)建者 修改者ID 通過Aop 或者權(quán)限框架獲取當前操作用戶 ,用用戶ID進行填充即可
  this.strictInsertFill(metaObject, "createId", Long.class, 666L);

 }

 @Override
 public void updateFill(MetaObject metaObject) {
  log.info("start update fill ....");
  this.strictUpdateFill(metaObject, "modifyTime", Long.class, System.currentTimeMillis());
  this.strictUpdateFill(metaObject, "modifyId", Long.class, 666L);

 }
}

2.實體類注解

要開啟自動填充功能 實現(xiàn) MetaObjectHandler 還不行,因為Mp 啊,對其字段默認是不做處理的,所以,咱們配置了 新增修改 自動填充時 還需要在其字段上進行開啟

@TableField(fill = FieldFill.INSERT)

image-20200808114731349

image-20200808114705528

OK。設置好了,咱們插入修改試一試吧!

image-20200808115231603

image-20200808115251910修改

image-20200808115517443

image-20200808115528774

如此 mp的自動填充就可以了,根據(jù)業(yè)務 合理對默寫字段填充,填充什么值 自己考量即可

但是呢,也是有一定問題的

比如:我有一個定時維護功能,是由xxl-job發(fā)起的定時任務,那么這個時候,我字段維護信息,為了區(qū)分開到底是認為維護還是自動維護,那么就需要手動設置 創(chuàng)建修改人 以及時間了

這個時候呢,自動填充功能會把我們自己設置的進行覆蓋

所以呢,自動填充咱們也可以進行優(yōu)化,當有該維護字段時,且字段無值時才填充,當無維護字段或者 維護字段設置了值則不填充

3.自動填充優(yōu)化

實際就是做了判斷 判斷該字段是否有set屬性 有則嘗試填充 (無值則填充)

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

 @Override
 public void insertFill(MetaObject metaObject) {
  //判斷是否有set屬性
  if (metaObject.hasSetter("createId")) {
   //判斷是否有值 如果沒設置值 則為null
   Object createId = getFieldValByName("createId", metaObject);
   if (createId == null) {
    log.info("創(chuàng)建人需要維護 且值為空 需要填充 ");
    //開發(fā)中 創(chuàng)建者 修改者ID 通過Aop 或者權(quán)限框架獲取當前操作用戶 ,用用戶ID進行填充即可
    this.strictInsertFill(metaObject, "createId", Long.class, 666L);

   }
  }
  if (metaObject.hasSetter("createTime")) {
   Object createTime = getFieldValByName("createTime", metaObject);
   if (createTime == null) {
    log.info("創(chuàng)建時間需要維護 且值為空 需要填充 ");
    this.strictInsertFill(metaObject, "createTime", Long.class, System.currentTimeMillis());
   }
  }

 }

 @Override
 public void updateFill(MetaObject metaObject) {
  if (metaObject.hasSetter("modifyId")) {
   Object modifyId = getFieldValByName("modifyId", metaObject);
   if (modifyId == null) {
    log.info("修改人需要維護 且值為空 需要填充 ");
    this.strictUpdateFill(metaObject, "modifyId", Long.class, 666L);
   }
  }
  if (metaObject.hasSetter("modifyTime")) {
   Object modifyTime = getFieldValByName("modifyTime", metaObject);
   if (modifyTime == null) {
    log.info("修改時間需要維護 且值為空 需要填充 ");
    this.strictUpdateFill(metaObject, "modifyTime", Long.class, System.currentTimeMillis());
   }
  }

 }
}

測試:

我這里設置了創(chuàng)建者ID ,雖然createId需要維護,但我們設置了值 則不會進行填充了,修改亦是如此!

image-20200808124200342

image-20200808124331978

那么自動填充功能,就完了,整合時 結(jié)合項目,適當修改即可。

(五)數(shù)據(jù)保護

使用mp中的加密方式,對配置文件中一些敏感信息進行加密(例如密碼)

其和 Jasypt 項目加密方式類似

1.生成隨機秘鑰以及內(nèi)容加密

image-20200808154301136

image-20200808154406180

2.配置文件替換

我們將原本的明文信息(root)換成加密后的密文信息

格式:

mpw:xxxx密文信息

image-20200808154539290

3.設置密鑰到啟動參數(shù)中

idea 設置方式:

image-20200808154642114

image-20200808154702402

啟動測試–獲取到了數(shù)據(jù) 證明數(shù)據(jù)庫連接成功,其加密內(nèi)容在連接時也被密鑰解密了,但配置中,無明文信息,一定程度保護了項目

image-20200808154741030

jar 啟動時 設置密鑰參數(shù):

image-20200808155350475

項目地址:springboot-mp進階

到此這篇關(guān)于springboot2.3 整合mybatis-plus 高級功能及用法詳解的文章就介紹到這了,更多相關(guān)springboot2.3 整合mybatis-plus內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java如何優(yōu)雅的處理異常

    詳解Java如何優(yōu)雅的處理異常

    在編寫 Java 程序的過程中,有一種異常幾乎每個開發(fā)者都會遇到——空指針異常(NullPointerException),那么我們應該如何有效且優(yōu)雅的處理空指針異常呢,下面小編就來詳細介紹這個處理方案吧
    2023-08-08
  • 深入解讀分布式事務Seata的XA模式

    深入解讀分布式事務Seata的XA模式

    這篇文章主要介紹了深入解讀分布式事務Seata的XA模式,XA 規(guī)范 描述了全局的事務管理器與局部的資源管理器之間的接口,XA規(guī)范 的目的是允許的多個資源在同一事務中訪問,這樣可以使 ACID 屬性跨越應用程序而保持有效,需要的朋友可以參考下
    2023-08-08
  • springboot的SpringPropertyAction事務屬性源碼解讀

    springboot的SpringPropertyAction事務屬性源碼解讀

    這篇文章主要介紹了springboot的SpringPropertyAction事務屬性源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Spring?Boot超大文件上傳實現(xiàn)秒傳功能

    Spring?Boot超大文件上傳實現(xiàn)秒傳功能

    這篇文章主要介紹了Spring?Boot超大文件上傳實現(xiàn)秒傳功能,在實現(xiàn)分片上傳的過程,需要前端和后端配合,比如前后端的上傳塊號的文件大小,前后端必須得要一致,否則上傳就會有問題,需要的朋友可以參考下
    2022-12-12
  • Spring MVC+FastJson+Swagger集成的完整實例教程

    Spring MVC+FastJson+Swagger集成的完整實例教程

    這篇文章主要給大家分享介紹了關(guān)于Spring MVC+FastJson+Swagger集成的完整實例教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • springboot解決使用localhost或127.0.01模擬CORS失效

    springboot解決使用localhost或127.0.01模擬CORS失效

    CORS允許不同源的網(wǎng)頁請求訪問另一個源服務器上的某些資源,本文主要介紹了springboot解決使用localhost或127.0.01模擬CORS失效,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Java單鏈表的實現(xiàn)代碼

    Java單鏈表的實現(xiàn)代碼

    這篇文章主要介紹了Java單鏈表的實現(xiàn)代碼的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Java異常學習之自定義異常詳解

    Java異常學習之自定義異常詳解

    你的程序總有一天會崩潰掉,在崩潰掉的時候我們要知道它在哪,為了什么而崩潰掉,數(shù)據(jù)的保存或者丟失情況如何等問題。下面這篇文章主要給大家介紹了關(guān)于Java異常學習之自定義異常的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • Java使用JDBC連接Oracle_MSSQL實例代碼

    Java使用JDBC連接Oracle_MSSQL實例代碼

    這篇文章主要介紹了Java使用JDBC連接Oracle_MSSQL實例代碼,需要的朋友可以參考下
    2014-01-01
  • SpringDataJPA之Specification復雜查詢實戰(zhàn)

    SpringDataJPA之Specification復雜查詢實戰(zhàn)

    這篇文章主要介紹了SpringDataJPA之Specification復雜查詢實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

泌阳县| 巧家县| 兖州市| 霸州市| 建瓯市| 兴仁县| 大名县| 独山县| 株洲市| 南岸区| 海南省| 油尖旺区| 博爱县| 内江市| 松滋市| 金川县| 庆阳市| 浦东新区| 峨边| 腾冲县| 巫山县| 建阳市| 卢龙县| 海南省| 麻阳| 福清市| 罗平县| 当阳市| 白河县| 尤溪县| 金阳县| 简阳市| 南华县| 抚宁县| 开原市| 嘉祥县| 内乡县| 寿光市| 沁阳市| 常州市| 肇东市|