Mybatis-Plus如何使用
前言:最近也在忙于學(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 注解
啟動(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類中配置
同時(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)題。
- 上一篇: ensp 移动主机搜索不到AP信道_案例
- 下一篇: 列出所有的电影ID,名字和销售总额(以百