日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Mybatis-Plus如何使用

發(fā)布時(shí)間:2024/1/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis-Plus如何使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:最近也在忙于學(xué)習(xí)公司的一些代碼,業(yè)務(wù),這篇Mybatis-Plus是前幾天復(fù)習(xí)的,沒(méi)有太多的時(shí)間做下筆記,因此熬了一會(huì)兒,相當(dāng)于又復(fù)習(xí)了一遍,以加深自己的印象和幫助到各位小伙伴兒們😉😉。
最近還會(huì)繼續(xù)更新,如果有什么需要改進(jìn)的地方,還請(qǐng)大佬不吝賜教🤞🤞
小威在此先感謝諸佬了👏👏

文章目錄

  • 🍓Mybatis-Plus自動(dòng)填充
  • 🍺實(shí)現(xiàn)樂(lè)觀鎖
  • 🍵分頁(yè)查詢
  • 🍹邏輯刪除

🏠個(gè)人主頁(yè):小威要向諸佬學(xué)習(xí)呀
🧑個(gè)人簡(jiǎn)介:大家好,我是小威,一個(gè)想要與大家共同進(jìn)步的男人😉😉
目前狀況🎉:目前大二,在一家滿意的公司實(shí)習(xí)👏👏

🎁如果大佬在準(zhǔn)備面試,找工作,刷算法,可以使用我找實(shí)習(xí)前用的刷題神器哦刷題神器點(diǎn)這里喲
💕歡迎大家:這里是CSDN,我總結(jié)知識(shí)的地方,歡迎來(lái)到我的博客,我親愛(ài)的大佬😘

牛客部分使用反饋,個(gè)人感覺(jué)還不錯(cuò),幫我找到了心儀的公司,希望各位伙伴兒們通過(guò)它也能提高不少🥂🥂🥂

以下正文開(kāi)始

🍓Mybatis-Plus自動(dòng)填充

在我們做項(xiàng)目的過(guò)程中經(jīng)常會(huì)遇到一些數(shù)據(jù),每次都使用相同的方式填充,例如記錄的創(chuàng)建時(shí)間,更新時(shí)間等。
我們可以選擇用普通的方法來(lái)自己填充,也可以使用MyBatis Plus的自動(dòng)填充功能,完成這些字段的賦值工作。
因此我們兩個(gè)方法都介紹一遍。

首先用到我們上一篇的項(xiàng)目,我們需要給項(xiàng)目添加兩個(gè)字段,并且需要在數(shù)據(jù)庫(kù)中添加create_time,update_time字段。

private Date createTime; private Date updateTime;

拿我們添加用戶的demo舉例,按照我們平常的做法,我們應(yīng)該這樣做:

@Testpublic void insertUser(){System.out.println(("----- insert method test ------"));User user=new User();user.setName("wangWu");user.setId(8L);user.setAge(21);user.setCreateTime(new Date());user.setUpdateTime(new Date());user.setEmail("wangWU@qq.com");int result = userMapper.insert(user);System.out.println(result);}

我們需要自己通過(guò)user對(duì)象設(shè)置CreateTime,UpdateTime屬性,這樣的方法當(dāng)然可以運(yùn)行的。
但是一旦所創(chuàng)建的對(duì)象比較多時(shí),我們一直寫一些重復(fù)的代碼,會(huì)看起來(lái)很不舒服,因此,我們下面介紹如何通過(guò)Mybatis-Plus自動(dòng)填充。

第一步,我們需要在實(shí)體類給對(duì)應(yīng)的字段中添加相關(guān)的注解。

@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;

上面的第一個(gè)注解,fill是填充的意思,也就是在插入數(shù)據(jù)的時(shí)候給表自動(dòng)填充,第二個(gè)則是在插入和更新數(shù)據(jù)的時(shí)候自動(dòng)填充。

但是,光有這些還不夠。我們應(yīng)該自己設(shè)置一個(gè)類來(lái)進(jìn)行配置。

實(shí)現(xiàn)元對(duì)象處理器接口
MetaObjectHandler接口是mybatisPlus提供給我們的一個(gè)擴(kuò)展接口,我們可以利用這個(gè)接口在我們插入或者更新數(shù)據(jù)的時(shí)候,為一些字段指定默認(rèn)值。
不要忘記添加 @Component 注解

package com.mpdemo.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component;import java.util.Date;@Component public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime",new Date(),metaObject);//根據(jù)名字設(shè)置屬性值this.setFieldValByName("updateTime",new Date(),metaObject);this.setFieldValByName("version",1,metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime",new Date(),metaObject);} }

啟動(dòng)項(xiàng)目進(jìn)行增添和修改測(cè)試,結(jié)果如下

🍺實(shí)現(xiàn)樂(lè)觀鎖

在我們進(jìn)行大項(xiàng)目的開(kāi)發(fā)時(shí),訪問(wèn)數(shù)據(jù)時(shí)不可能串行(one by one)地進(jìn)行的,但如果多個(gè)人同時(shí)修改一個(gè)數(shù)據(jù),可能最后一個(gè)數(shù)據(jù)會(huì)將前面的數(shù)據(jù)覆蓋掉,因此能夠使用樂(lè)觀鎖而不是悲觀鎖,Mybatis-Plus會(huì)基于版本號(hào)這樣做:

  • 取出記錄時(shí),獲取當(dāng)前version
  • 更新時(shí),帶上這個(gè)version
  • 執(zhí)行更新時(shí), set version = newVersion where version = oldVersion
  • 如果version不對(duì),就更新失敗

接下來(lái)我們來(lái)實(shí)現(xiàn)。

首先還是在實(shí)體類和數(shù)據(jù)庫(kù)中定義新字段:

ALTER TABLE `user` ADD COLUMN `version` INT

在實(shí)體類中需要為版本號(hào)加上@Version注解,表示這個(gè)字段是版本號(hào)。

@Version @TableField(fill = FieldFill.INSERT) private Integer version;

同時(shí)加上@TableField注解,在新增時(shí)定義版本號(hào)的默認(rèn)值。
在handler類中配置

@Component public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime",new Date(),metaObject);//根據(jù)名字設(shè)置屬性值this.setFieldValByName("updateTime",new Date(),metaObject);this.setFieldValByName("version",1,metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime",new Date(),metaObject);} }

同時(shí)也需要在configuration配置類中進(jìn)行配置

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.mybatis.spring.annotation.MapperScan import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement //開(kāi)啟事務(wù)注解 @Configuration @MapperScan("com.atguigu.mybatis_plus.mapper") public class MybatisPlusConfig {/*** 樂(lè)觀鎖插件*/@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();} }

編寫添加用戶數(shù)據(jù)和更新用戶數(shù)據(jù)的類

//增加用戶數(shù)據(jù)測(cè)試類@Testpublic void insertUser(){System.out.println(("----- insert method test ------"));User user=new User();user.setName("wangWu");user.setId(8L);user.setAge(21);// user.setCreateTime(new Date()); // user.setUpdateTime(new Date());user.setEmail("wangWU@qq.com");int result = userMapper.insert(user);System.out.println(result);}編寫更新數(shù)據(jù)測(cè)試類@Testpublic void testOptimisticLocker(){User user=userMapper.selectById(8L);//必須先查詢獲取version的值,然后再修改,version值才會(huì)有變化user.setAge(20);int i = userMapper.updateById(user);System.out.println(i);}

需要注意的是:一定要先查詢對(duì)象的version值,才生效!如果直接進(jìn)行updateById的話不會(huì)生效。

測(cè)試結(jié)果如下:

添加用戶,version值為1

修改用戶age為21,此時(shí)version+1變?yōu)榱?。

🍵分頁(yè)查詢

Mybatis-Plus自帶分頁(yè)查詢的插件,不用編寫一些類,但需要我們簡(jiǎn)單配置。

首先還是在我們的configuration配置類中配置:

//分頁(yè)的插件 @Bean public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();

配置完上面內(nèi)容即可使用:

@Testpublic void testPage(){Page<User> page=new Page<>(2,3);//前面數(shù)據(jù)表示當(dāng)前頁(yè),后面數(shù)據(jù)表示每一頁(yè)顯示幾條數(shù)據(jù)。userMapper.selectPage(page,null);//查詢條件為空System.out.println(page.getCurrent());//獲取當(dāng)前頁(yè)System.out.println(page.getRecords());//獲取每頁(yè)數(shù)據(jù)的list集合System.out.println(page.getSize());//每頁(yè)顯示記錄的條數(shù)System.out.println(page.getTotal());//總記錄數(shù)System.out.println(page.getPages());//總頁(yè)數(shù)System.out.println(page.hasNext());//是否有下一頁(yè)System.out.println(page.hasPrevious());//是否有上一頁(yè)}

查詢結(jié)果如下:根據(jù)第一行的日志SQL語(yǔ)句,Mybatis-Plus在幫我們查詢時(shí)自帶了Limit關(guān)鍵字進(jìn)行查詢。

🍹邏輯刪除

首先,需要知道什么是邏輯刪除:

物理刪除:真實(shí)刪除,直接將對(duì)應(yīng)的數(shù)據(jù)從數(shù)據(jù)庫(kù)中刪除,之后查詢不到此條被刪除數(shù)據(jù)
邏輯刪除:假刪除,將對(duì)應(yīng)的數(shù)據(jù)中代表是否被刪除字段狀態(tài)修改為“被刪除狀態(tài)”,一般用0和1表示,之后在數(shù)據(jù)庫(kù)中仍舊能看到此條數(shù)據(jù)記錄,存在有一個(gè)刪除字段,用0和1代表是否數(shù)據(jù)被刪除

首先還是先在數(shù)據(jù)庫(kù)和實(shí)體類中添加字段

/*** @TableLogic 邏輯刪除注解*/@TableLogic@TableField(fill = FieldFill.INSERT)private Integer deleted; ALTER TABLE `user` ADD COLUMN `deleted` boolean

然后跟上面的操作一樣,在handler類中進(jìn)行配置

@Override public void insertFill(MetaObject metaObject) {//這里和上面的一樣,不寫了,占字?jǐn)?shù)🤣。this.setFieldValByName("deleted", 0, metaObject);//表示deleted字段的默認(rèn)值為0,在插入時(shí)字段填充字段值。 }

同時(shí),也可以在Properties或Ymal中對(duì)默認(rèn)值進(jìn)行設(shè)置。

mybatis-plus.global-config.db-config.logic-delete-value=1//刪除 mybatis-plus.global-config.db-config.logic-not-delete-value=0//沒(méi)有刪除

舊版的還需要再配置類中添加配置:

@Bean public ISqlInjector sqlInjector() {return new LogicSqlInjector(); }

首先我們先編寫,刪除一條記錄的代碼:

/*** 測(cè)試 邏輯刪除*/ @Test public void testLogicDelete() {int result = userMapper.deleteById(7L);System.out.println(result); }

運(yùn)行程序,查看控制臺(tái)語(yǔ)句:

我們經(jīng)過(guò)測(cè)試后發(fā)現(xiàn),數(shù)據(jù)并沒(méi)有被刪除,deleted字段的值由0變成了1
測(cè)試后分析打印的sql語(yǔ)句,是一條update
注意:被刪除數(shù)據(jù)的deleted 字段的值必須是 0,才能被選取出來(lái)執(zhí)行邏輯刪除的操作

最后操作查詢所有字段的語(yǔ)句:

/*** 測(cè)試 邏輯刪除后的查詢:* 不包括被邏輯刪除的記錄*/ @Test public void testLogicDeleteSelect() {User user = new User();List<User> users = userMapper.selectList(null);users.forEach(System.out::println); }

可以看出控制臺(tái)的SQL語(yǔ)句自動(dòng)加上了deleted不為0的條件。

文章到這里就結(jié)束了,下篇我們將繼續(xù)介紹Mybatis-Plus的其他知識(shí)點(diǎn),喜歡的大佬可以多多支持哦😉😉。
如果有什么疑問(wèn)的地方請(qǐng)指出,諸佬們一起討論🍻🍻

最后再次給大家安利一波牛客,牛客真的很不錯(cuò)的軟件,點(diǎn)擊刷題神器
注冊(cè)牛客,快來(lái)和博主一起刷題吧嘿嘿嘿👏
同時(shí)祝伙伴兒找到理想的工作及猛猛地提升算法能力哦😏

再次感謝各位小伙伴兒們的支持🤞

總結(jié)

以上是生活随笔為你收集整理的Mybatis-Plus如何使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。