mybatisplus邏輯刪除基本實(shí)現(xiàn)和坑點(diǎn)解決
當(dāng)你在使用Mybatis 時進(jìn)行配置的時候有這樣幾個坑一定要注意下。
mybatisplus中邏輯刪除通俗說為了在數(shù)據(jù)庫中保留數(shù)據(jù),但是又不想進(jìn)行其他一些sql語句時有他(剛剛通過邏輯刪除了的)的存在。
就是在數(shù)據(jù)庫中添加一字段,通過數(shù)值內(nèi)容來說明那些是指刪除了的即可
mp邏輯刪除的基本實(shí)現(xiàn)
步驟一(添加數(shù)據(jù)庫對應(yīng)字段)
首先數(shù)據(jù)庫中添加對應(yīng)字段(此處通過deleted字段代表邏輯刪除字段,即0為未被刪除,1為已刪除)
步驟二(邏輯刪除的實(shí)現(xiàn))
1.方法一(單表注解設(shè)置)
在數(shù)據(jù)表對象層中對應(yīng)對類的對應(yīng)字段中通過注解實(shí)現(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è)置)
通過配置實(shí)現(xiàn)。這樣實(shí)現(xiàn)的就比較全局,沒有指定那個指定數(shù)據(jù)表對象層中對應(yīng)對類的對應(yīng)字段實(shí)現(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ù)的參與,即實(shí)現(xiàn)開發(fā)者想刪除某條數(shù)據(jù),但又想數(shù)據(jù)庫能保留這個數(shù)據(jù)記錄。
1.測試類進(jìn)行邏輯刪除測試代碼
這是通過id實(shí)現(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
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ù)。)
mp邏輯刪除不生效
我這總結(jié)了幾個可能遇到的一些僅僅關(guān)于mp邏輯刪除本身可能出現(xiàn)的問題解決參考(排除一些其他因素,單純講講mp邏輯刪除本身的坑點(diǎn))
坑點(diǎn)一
報錯點(diǎn): Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘deleted’ in ‘where clause’
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column ‘deleted’ in ‘where clause’:
原因解釋就跳過了,解決方法其實(shí)就是只要把設(shè)定的刪除字段設(shè)置為“deleted”即可(也多注意邏輯刪除需要添加的數(shù)據(jù)庫字段得用“deleted”命名,不然可能就會報上面這個報錯點(diǎn)了)。
坑點(diǎn)二
報錯點(diǎn):就是在多個表使用mp操作的時候,注意一些全局設(shè)置和局部設(shè)置區(qū)別。
例如這篇所說的mp邏輯刪除內(nèi)容,實(shí)現(xiàn)有兩個方法,分別是數(shù)據(jù)表對象層中對應(yīng)對類的對應(yīng)字段中通過注解實(shí)現(xiàn)@TableLogic()和全局變量配置中設(shè)置。
注意如果設(shè)置成了局部,那么就只是針對設(shè)置了的實(shí)現(xiàn),如果設(shè)置了全局,則所有設(shè)置了邏輯刪除字段(deleted)在進(jìn)行mp刪除操作時,都是進(jìn)行邏輯刪除操作。
解決方法就是根據(jù)實(shí)際開發(fā)需求,實(shí)際操作設(shè)置即可。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java如何獲取List<String>中的String詳解
工作了這么長時間了,一直沒有記錄的習(xí)慣,以至于導(dǎo)致我即便是查過的東西總會忘記,下面這篇文章主要給大家介紹了關(guān)于Java如何獲取List<String>中String的相關(guān)資料,需要的朋友可以參考下2022-02-02解決IDEA創(chuàng)建maven項(xiàng)目時pom.xml沒有變藍(lán)的問題
這篇文章主要介紹了解決IDEA創(chuàng)建maven項(xiàng)目時pom.xml沒有變藍(lán)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法
這篇文章主要介紹了Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02