MyBatis-Plus中的邏輯刪除功能及實(shí)例分析
MyBatis-Plus中的邏輯刪除功能及實(shí)例
介紹:
- 在實(shí)際開(kāi)發(fā)中,數(shù)據(jù)的刪除操作是一個(gè)常見(jiàn)需求。
- MyBatis-Plus提供了方便且靈活的邏輯刪除功能,可以簡(jiǎn)化開(kāi)發(fā)人員在刪除數(shù)據(jù)時(shí)的操作。
案例背景
假設(shè)我們有一個(gè)博客系統(tǒng),包含Blog類作為博客實(shí)體。在這個(gè)系統(tǒng)中,我們希望能夠?qū)Σ┛瓦M(jìn)行軟刪除操作,即將要?jiǎng)h除的博客標(biāo)記為已刪除狀態(tài),而不是直接物理刪除。
通過(guò)邏輯刪除,我們可以保留刪除記錄,有助于追蹤數(shù)據(jù)變更歷史和實(shí)現(xiàn)審計(jì)需求。
使用邏輯刪除功能
配置數(shù)據(jù)庫(kù)和實(shí)體類
首先,在使用邏輯刪除功能之前,我們需要進(jìn)行相關(guān)的配置。
- 在數(shù)據(jù)庫(kù)表中,我們需要添加一個(gè)用于表示邏輯刪除狀態(tài)的字段。例如,我們可以添加一個(gè)名為
deleted
的tinyint
類型字段,默認(rèn)值為0。 - 在實(shí)體類(這里是Blog類)中,我們使用Lombok來(lái)減少getter和setter方法的編寫(xiě)工作。
以下是一個(gè)示例:
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("blog") public class Blog { private Long id; private String title; private String content; @TableLogic private Integer deleted; }
在上述示例中,我們使用@Data
注解簡(jiǎn)化了getter和setter方法的編寫(xiě),并使用@TableName
注解標(biāo)記了實(shí)體類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名。同時(shí),使用@TableLogic
注解標(biāo)記了deleted
字段為邏輯刪除字段。
執(zhí)行邏輯刪除操作
接下來(lái),我們將演示如何在MyBatis-Plus中使用邏輯刪除功能。
方式一:局部配置
局部配置適用于只需要在某個(gè)Mapper接口中應(yīng)用邏輯刪除功能的情況。
首先,在Mapper接口中添加@Repository
注解并繼承BaseMapper
接口,例如:
import org.springframework.stereotype.Repository; @Repository public interface BlogMapper extends BaseMapper<Blog> { }
然后,在Service層的實(shí)現(xiàn)類中進(jìn)行邏輯刪除的調(diào)用:
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements BlogService { @Override public boolean deleteBlogById(Long id) { return baseMapper.deleteById(id) > 0; } }
在上述示例中,我們直接調(diào)用baseMapper的deleteById方法進(jìn)行邏輯刪除操作。MyBatis-Plus會(huì)自動(dòng)將邏輯刪除字段設(shè)置為1(表示已刪除)。
方式二:全局配置
全局配置適用于對(duì)整個(gè)項(xiàng)目中的所有Mapper接口都應(yīng)用邏輯刪除功能的情況。
首先,在application.yml或application.properties文件中配置全局屬性:
mybatis-plus: global-config: db-config: logic-delete-value: 1 logic-not-delete-value: 0
然后,設(shè)置全局配置項(xiàng)并在Mapper接口中使用@TableLogic
注解:
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加樂(lè)觀鎖插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
在上述示例中,我們創(chuàng)建了一個(gè)@Configuration類,并注冊(cè)了Mybatis-Plus提供的分頁(yè)插件(PaginationInterceptor
)和樂(lè)觀鎖插件(OptimisticLockerInnerInterceptor
)。這些插件可以根據(jù)具體需求進(jìn)行配置。
測(cè)試
為了驗(yàn)證邏輯刪除功能是否正常工作,我們可以編寫(xiě)單元測(cè)試。
以下是一個(gè)簡(jiǎn)單的測(cè)試實(shí)例:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class BlogServiceTest { @Autowired private BlogService blogService; @Test public void testDeleteBlog() { Long blogId = 1L; // 假設(shè)要?jiǎng)h除ID為1的博客 boolean result = blogService.deleteBlogById(blogId); System.out.println("Delete successful: " + result); } }
在上述測(cè)試中,我們注入了BlogService接口,并調(diào)用deleteBlogById
方法來(lái)執(zhí)行邏輯刪除操作。
通過(guò)編寫(xiě)和運(yùn)行這些測(cè)試用例,我們可以驗(yàn)證使用邏輯刪除功能時(shí)的正常性。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java后臺(tái)批量生產(chǎn)echarts圖表并保存圖片
這篇文章主要介紹了Java后臺(tái)批量生產(chǎn)echarts圖表并保存圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05淺談java中Math.random()與java.util.random()的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java中Math.random()與java.util.random()的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09Java數(shù)據(jù)庫(kù)連接池之c3p0簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)庫(kù)連接池之c3p0簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)
代碼注釋是架起程序設(shè)計(jì)者與程序閱讀者之間的通信橋梁,最大限度的提高團(tuán)隊(duì)開(kāi)發(fā)合作效率。也是程序代碼可維護(hù)性的重要環(huán)節(jié)之一。下面通過(guò)本文說(shuō)一下我們?cè)谌粘i_(kāi)發(fā)中使用的代碼注釋規(guī)范2017-03-03java中javamail收發(fā)郵件實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了java中javamail收發(fā)郵件實(shí)現(xiàn)方法,實(shí)例分析了javamail的使用方法與相關(guān)注意事項(xiàng),非常具有實(shí)用價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02Spring Boot Web應(yīng)用開(kāi)發(fā) CORS 跨域請(qǐng)求支持
本篇文章主要介紹了Spring Boot Web應(yīng)用開(kāi)發(fā) CORS 跨域請(qǐng)求支持,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05SpringBoot自定義Redis實(shí)現(xiàn)緩存序列化詳解
Spring提供了一個(gè)RedisTemplate來(lái)進(jìn)行對(duì)Redis的操作,但是RedisTemplate默認(rèn)配置的是使用Java本機(jī)序列化。如果要對(duì)對(duì)象操作,就不是那么的方便。所以本文為大家介紹了另一種SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法,需要的可以參考一下2022-07-07