溫馨提示×

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

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

mybatisplus的邏輯刪除問(wèn)題怎么解決

發(fā)布時(shí)間:2023-03-10 10:45:02 來(lái)源:億速云 閱讀:231 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“mybatisplus的邏輯刪除問(wèn)題怎么解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“mybatisplus的邏輯刪除問(wèn)題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

mybatisplus的邏輯刪除

mp提供的邏輯刪除實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單

只需要在application.yml中進(jìn)行邏輯刪除的相關(guān)配置即可

mybatis-plus:  
  global-config:  
    db-config:  
      logic-delete-field: deleted # 全局邏輯刪除的實(shí)體字段名  
      logic-delete-value: 1 # 邏輯已刪除值(默認(rèn)為1)  
      logic-not-delete-value: 0 # 邏輯未刪除值(默認(rèn)為0)  
      # 若邏輯已刪除和未刪除的值和默認(rèn)值一樣,則可以不配置這2項(xiàng)

測(cè)試代碼

int i = mapper.deleteById(6);  
		System.out.println("rowAffected = " + i);

mybatisplus的邏輯刪除問(wèn)題怎么解決

可以看到,發(fā)出的SQL不再是DELETE,而是UPDATE

此時(shí)我們?cè)賵?zhí)行一次SELECT

@Test  
public void testSelect() {  
	List<User2> users = mapper.selectList(null);  
}

mybatisplus的邏輯刪除問(wèn)題怎么解決

可以看到,發(fā)出的SQL語(yǔ)句,會(huì)自動(dòng)在WHERE后面拼接邏輯未刪除的條件。

查詢(xún)出來(lái)的結(jié)果中,沒(méi)有了id為6的王軟蛋。

若想要SELECT的列,不包括邏輯刪除的那一列,則可以在實(shí)體類(lèi)中通過(guò)@TableField進(jìn)行配置

@TableField(select = false)  
private Integer deleted;

可以看到下圖的執(zhí)行結(jié)果中,SELECT中已經(jīng)不包含deleted這一列了

mybatisplus的邏輯刪除問(wèn)題怎么解決

前面在application.yml中做的配置,是全局的。通常來(lái)說(shuō),對(duì)于多個(gè)表,我們也會(huì)統(tǒng)一邏輯刪除字段的名稱(chēng),統(tǒng)一邏輯已刪除和未刪除的值,所以全局配置即可。

當(dāng)然,若要對(duì)某些表進(jìn)行單獨(dú)配置,在實(shí)體類(lèi)的對(duì)應(yīng)字段上使用@TableLogic即可。

@TableLogic(value = "0", delval = "1")  
private Integer deleted;

【小結(jié)】

開(kāi)啟mp的邏輯刪除后,會(huì)對(duì)SQL產(chǎn)生如下的影響

  • INSERT語(yǔ)句:沒(méi)有影響

  • SELECT語(yǔ)句:追加WHERE條件,過(guò)濾掉已刪除的數(shù)據(jù)

  • UPDATE語(yǔ)句:追加WHERE條件,防止更新到已刪除的數(shù)據(jù)

  • DELETE語(yǔ)句:轉(zhuǎn)變?yōu)閁PDATE語(yǔ)句

注意,上述的影響,只針對(duì)mp自動(dòng)注入的SQL生效。如果是自己手動(dòng)添加的自定義SQL,則不會(huì)生效。

比如:

public interface User2Mapper extends BaseMapper<User2> {  
	@Select("select * from user2")  
	List<User2> selectRaw();  
}

調(diào)用這個(gè)selectRaw,則mp的邏輯刪除不會(huì)生效。

另,邏輯刪除可在application.yml中進(jìn)行全局配置,也可在實(shí)體類(lèi)中用@TableLogic進(jìn)行局部配置。

使用mybatisplus邏輯刪除,修改含有邏輯刪除的字段爆錯(cuò)

mybatisplus在配置文件中配置如下

mybatisplus的邏輯刪除問(wèn)題怎么解決

以上是全局邏輯刪除配置。

當(dāng)使用mybatisplus生成的修改方法,修改含有showStatus對(duì)應(yīng)的字段時(shí),會(huì)報(bào)錯(cuò)。

錯(cuò)誤sql語(yǔ)句如下

mybatisplus的邏輯刪除問(wèn)題怎么解決

而我要修改的如下:

mybatisplus的邏輯刪除問(wèn)題怎么解決

正確的修改的sql語(yǔ)句應(yīng)該如下:

mybatisplus的邏輯刪除問(wèn)題怎么解決

所以我們可以在xml文件中單獨(dú)寫(xiě)sql語(yǔ)句

或者不在配置文件中設(shè)置邏輯刪除字段名 使用@TableLogic注解

如下:

mybatisplus的邏輯刪除問(wèn)題怎么解決

showStatus是表示此信息是否顯示。

如:

mybatisplus的邏輯刪除問(wèn)題怎么解決

表示 show_status等于0時(shí) brand_id (即id)=1591652104429125634 的信息不顯示。

這樣我們就是局部使用邏輯刪除。

讀到這里,這篇“mybatisplus的邏輯刪除問(wèn)題怎么解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI