MybatisPlus使用@TableLogic實(shí)現(xiàn)邏輯刪除過程
使用@TableLogic實(shí)現(xiàn)邏輯刪除
接下來要講解是刪除中比較重要的一個(gè)操作,邏輯刪除,先來分析下問題:
這是一個(gè)員工和其所簽的合同表,關(guān)系是一個(gè)員工可以簽多個(gè)合同,是一個(gè)一(員工)對(duì)多(合同)的表
員工ID為1的張業(yè)績(jī),總共簽了三個(gè)合同,如果此時(shí)他離職了,我們需要將員工表中的數(shù)據(jù)進(jìn)行刪除,會(huì)執(zhí)行delete操作
如果表在設(shè)計(jì)的時(shí)候有主外鍵關(guān)系,那么同時(shí)也得將合同表中的前三條數(shù)據(jù)也刪除掉
后期要統(tǒng)計(jì)所簽合同的總金額,就會(huì)發(fā)現(xiàn)對(duì)不上,原因是已經(jīng)將員工1簽的合同信息刪除掉了
如果只刪除員工不刪除合同表數(shù)據(jù),那么合同的員工編號(hào)對(duì)應(yīng)的員工信息不存在,那么就會(huì)出現(xiàn)垃圾數(shù)據(jù),就會(huì)出現(xiàn)無主合同,根本不知道有張業(yè)績(jī)這個(gè)人的存在
所以經(jīng)過分析,我們不應(yīng)該將表中的數(shù)據(jù)刪除掉,而是需要進(jìn)行保留,但是又得把離職的人和在職的人進(jìn)行區(qū)分,這樣就解決了上述問題,如:
區(qū)分的方式,就是在員工表中添加一列數(shù)據(jù)deleted
,如果為0說明在職員工,如果離職則將其改完1,(0和1所代表的含義是可以自定義的)
對(duì)于刪除操作業(yè)務(wù)問題來說有:
- 物理刪除:業(yè)務(wù)數(shù)據(jù)從數(shù)據(jù)庫(kù)中丟棄,執(zhí)行的是delete操作
- 邏輯刪除:為數(shù)據(jù)設(shè)置是否可用狀態(tài)字段,刪除時(shí)設(shè)置狀態(tài)字段為不可用狀態(tài),數(shù)據(jù)保留在數(shù)據(jù)庫(kù)中,執(zhí)行的是update操作
MybatisPlus中邏輯刪除具體該如何實(shí)現(xiàn)
步驟1:修改數(shù)據(jù)庫(kù)表添加deleted列
字段名可以任意,內(nèi)容也可以自定義,比如0
代表正常,1
代表刪除,可以在添加列的同時(shí)設(shè)置其默認(rèn)值為0
正常。
步驟2:實(shí)體類添加屬性
(1)添加與數(shù)據(jù)庫(kù)表的列對(duì)應(yīng)的一個(gè)屬性名,名稱可以任意,如果和數(shù)據(jù)表列名對(duì)不上,可以使用@TableField進(jìn)行關(guān)系映射,如果一致,則會(huì)自動(dòng)對(duì)應(yīng)。
(2)標(biāo)識(shí)新增的字段為邏輯刪除字段,使用@TableLogic
@Data //@TableName("tbl_user") 可以不寫是因?yàn)榕渲昧巳峙渲? public class User { @TableId(type = IdType.ASSIGN_UUID) private String id; private String name; @TableField(value="pwd",select=false) private String password; private Integer age; private String tel; @TableField(exist=false) private Integer online; @TableLogic(value="0",delval="1") //value為正常數(shù)據(jù)的值,delval為刪除數(shù)據(jù)的值 private Integer deleted; }
步驟3:運(yùn)行刪除方法
@SpringBootTest class Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testDelete(){ userDao.deleteById(1L); } }
從測(cè)試結(jié)果來看,邏輯刪除最后走的是update操作,會(huì)將指定的字段修改成刪除狀態(tài)對(duì)應(yīng)的值。
思考
邏輯刪除,對(duì)查詢有沒有影響呢?
執(zhí)行查詢操作
@SpringBootTest class Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testFind(){ System.out.println(userDao.selectList(null)); } }
運(yùn)行測(cè)試,會(huì)發(fā)現(xiàn)打印出來的sql語句中會(huì)多一個(gè)查詢條件,如:
可想而知,MP的邏輯刪除會(huì)將所有的查詢都添加一個(gè)未被刪除的條件,也就是已經(jīng)被刪除的數(shù)據(jù)是不應(yīng)該被查詢出來的。
如果還是想把已經(jīng)刪除的數(shù)據(jù)都查詢出來該如何實(shí)現(xiàn)呢?
@Mapper public interface UserDao extends BaseMapper<User> { //查詢所有數(shù)據(jù)包含已經(jīng)被刪除的數(shù)據(jù) @Select("select * from tbl_user") public List<User> selectAll(); }
如果每個(gè)表都要有邏輯刪除,那么就需要在每個(gè)模型類的屬性上添加@TableLogic
注解,如何優(yōu)化?
在配置文件中添加全局配置,如下:
mybatis-plus: global-config: db-config: # 邏輯刪除字段名 logic-delete-field: deleted # 邏輯刪除字面值:未刪除為0 logic-not-delete-value: 0 # 邏輯刪除字面值:刪除為1 logic-delete-value: 1
介紹完邏輯刪除,邏輯刪除的本質(zhì)為:
邏輯刪除的本質(zhì)其實(shí)是修改操作。如果加了邏輯刪除字段,查詢數(shù)據(jù)時(shí)也會(huì)自動(dòng)帶上邏輯刪除字段。
執(zhí)行的SQL語句為:
UPDATE tbl_user SET deleted=1 where id = ? AND deleted=0
執(zhí)行數(shù)據(jù)結(jié)果為:
知識(shí)點(diǎn):@TableLogic
名稱 | @TableLogic |
---|---|
類型 | 屬性注解 |
位置 | 模型類中用于表示刪除字段的屬性定義上方 |
作用 | 標(biāo)識(shí)該字段為進(jìn)行邏輯刪除的字段 |
相關(guān)屬性 | value:邏輯未刪除值delval: 邏輯刪除值 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringBoot?Start組件開發(fā)之記錄接口日志信息
這篇文章主要為大家介紹了SpringBoot-Start組件開發(fā)之記錄接口日志信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04java通過信號(hào)量實(shí)現(xiàn)限流的示例
本文主要介紹了java通過信號(hào)量實(shí)現(xiàn)限流的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法
Spring MVC中的參數(shù)綁定還是蠻重要的,最近在使用中遇到了同名參數(shù)綁定的問題,想著總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于Spring MVC同名參數(shù)綁定問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08使用dynamic datasource springboot starter實(shí)現(xiàn)多數(shù)據(jù)源及源碼分析
這篇文章主要介紹了使用dynamic-datasource-spring-boot-starter做多數(shù)據(jù)源及源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09