溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mybatisplus邏輯刪除如何實現(xiàn)

發(fā)布時間:2023-03-31 15:10:37 來源:億速云 閱讀:100 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了mybatisplus邏輯刪除如何實現(xiàn)的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇mybatisplus邏輯刪除如何實現(xiàn)文章都會有所收獲,下面我們一起來看看吧。

mybatisplus中邏輯刪除通俗說為了在數(shù)據(jù)庫中保留數(shù)據(jù),但是又不想進(jìn)行其他一些sql語句時有他(剛剛通過邏輯刪除了的)的存在。就是在數(shù)據(jù)庫中添加一字段,通過數(shù)值內(nèi)容來說明那些是指刪除了的即可。

mp邏輯刪除的基本實現(xiàn)

步驟一(添加數(shù)據(jù)庫對應(yīng)字段)

首先數(shù)據(jù)庫中添加對應(yīng)字段(此處通過deleted字段代表邏輯刪除字段,即0為未被刪除,1為已刪除)

mybatisplus邏輯刪除如何實現(xiàn)

步驟二(邏輯刪除的實現(xiàn)) 

1.方法一(單表注解設(shè)置)

在數(shù)據(jù)表對象層中對應(yīng)對類的對應(yīng)字段中通過注解實現(xiàn)(@TableLogic(),這里value和delval就是mp給我們定義的是否刪除的標(biāo)記,數(shù)值由開發(fā)者設(shè)定)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    private Long id;
    private String type;
    private String name;
    private String description;
    
    //邏輯刪除(就是在delete字段做標(biāo)記,不是真正意義上的刪除)
    @TableLogic(value = "0",delval = "1")
    private Integer deleted;
}

2.方法二(全局配置文件設(shè)置)

通過配置實現(xiàn)。這樣實現(xiàn)的就比較全局,沒有指定那個指定數(shù)據(jù)表對象層中對應(yīng)對類的對應(yīng)字段實現(xiàn)邏輯刪除這個功能,只要擁有全局設(shè)置一樣的字段即可。

(這使用springboot框架的application.yml配置為例,其中l(wèi)ogic-delete-field是指要指定字段名,logic-delete-value:是刪除后設(shè)置成的值,logic-not-delete-value是未刪除的值是什么)

#  mp日志
mybatis-plus:
    db-config:
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

步驟三(測試)

在測試類中測試并查看數(shù)據(jù)庫對應(yīng)表的對應(yīng)測試數(shù)據(jù)有什么變化。

在此測試中發(fā)現(xiàn),數(shù)據(jù)庫表對應(yīng)的數(shù)據(jù)并沒有真正意義上的刪除,只是在對應(yīng)字段做好了設(shè)定好的標(biāo)記。

而且在其他mp操作此表時并沒有這條數(shù)據(jù)的參與,即實現(xiàn)開發(fā)者想刪除某條數(shù)據(jù),但又想數(shù)據(jù)庫能保留這個數(shù)據(jù)記錄。

1.測試類進(jìn)行邏輯刪除測試代碼

這是通過id實現(xiàn)邏輯刪除

    @Autowired
    private BookDao bookDao;
    @Test
    public void deleteById(){
        int i = bookDao.deleteById(12L);
        System.out.println("影響行數(shù)為:"+i+"條");
    }

2.刪除后數(shù)據(jù)表對應(yīng)數(shù)據(jù)變化

id為12數(shù)據(jù)對應(yīng)的deleted已經(jīng)變成了1

mybatisplus邏輯刪除如何實現(xiàn)

3.測試其他mp操作是否有對標(biāo)記刪除了的數(shù)據(jù)有“參與”

此處是對上面操作完成后進(jìn)行的mp操作(查詢表中所有數(shù)據(jù)所有)

    @Autowired
    private BookDao bookDao;
    @Test
    void findAll() {
        List<Book> books = bookDao.selectList(null);
        for (Book book :books) {
            System.out.println(book);
        }
    }

結(jié)果如下(顯然,id為12的數(shù)據(jù)并沒有查詢出來,但是數(shù)據(jù)庫還是存在此條數(shù)據(jù)。)

mybatisplus邏輯刪除如何實現(xiàn)

mp邏輯刪除不生效

我這總結(jié)了幾個可能遇到的一些僅僅關(guān)于mp邏輯刪除本身可能出現(xiàn)的問題解決參考(排除一些其他因素,單純講講mp邏輯刪除本身的坑點)

坑點一

報錯點: Cause: java.sql.SQLSyntaxErrorException: Unknown column &lsquo;deleted&rsquo; in &lsquo;where clause&rsquo;
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column &lsquo;deleted&rsquo; in &lsquo;where clause&rsquo;:

原因解釋就跳過了,解決方法其實就是只要把設(shè)定的刪除字段設(shè)置為“deleted”即可(也多注意邏輯刪除需要添加的數(shù)據(jù)庫字段得用“deleted”命名,不然可能就會報上面這個報錯點了)。

坑點二

報錯點:就是在多個表使用mp操作的時候,注意一些全局設(shè)置和局部設(shè)置區(qū)別。

例如這篇所說的mp邏輯刪除內(nèi)容,實現(xiàn)有兩個方法,分別是數(shù)據(jù)表對象層中對應(yīng)對類的對應(yīng)字段中通過注解實現(xiàn)@TableLogic()和全局變量配置中設(shè)置。

注意如果設(shè)置成了局部,那么就只是針對設(shè)置了的實現(xiàn),如果設(shè)置了全局,則所有設(shè)置了邏輯刪除字段(deleted)在進(jìn)行mp刪除操作時,都是進(jìn)行邏輯刪除操作。

解決方法就是根據(jù)實際開發(fā)需求,實際操作設(shè)置即可。

關(guān)于“mybatisplus邏輯刪除如何實現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“mybatisplus邏輯刪除如何實現(xiàn)”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI