1、邏輯刪除
-
這是一個員工和其所籤的合同表,關係是一個員工可以籤多個合同,是一個一(員工)對多(合同)的表
-
員工ID爲1的張業績,總共簽了三個合同,如果此時他離職了,我們需要將員工表中的數據進行刪除,會執行delete操作
-
如果表在設計的時候有主外鍵關係,那麼同時也得將合同表中的前三條數據也刪除掉
-
後期要統計所籤合同的總金額,就會發現對不上,原因是已經將員工1籤的合同信息刪除掉了
-
如果只刪除員工不刪除合同表數據,那麼合同的員工編號對應的員工信息不存在,那麼就會出現垃圾數據,就會出現無主合同,根本不知道有張業績這個人的存在
-
所以經過分析,我們不應該將表中的數據刪除掉,而是需要進行保留,但是又得把離職的人和在職的人進行區分,這樣就解決了上述問題,如:
-
區分的方式,就是在員工表中添加一列數據
deleted
,如果爲0說明在職員工,如果離職則將其改完1,(0和1所代表的含義是可以自定義的)
所以對於刪除操作業務問題來說有:
-
物理刪除:業務數據從數據庫中丟棄,執行的是delete操作
-
邏輯刪除:爲數據設置是否可用狀態字段,刪除時設置狀態字段爲不可用狀態,數據保留在數據庫中,執行的是update操作
MyBatisPlus中邏輯刪除具體該如何實現?
步驟1:修改數據庫表添加deleted
列
字段名可以任意,內容也可以自定義,比如0
代表正常,1
代表刪除,可以在添加列的同時設置其默認值爲0
正常。
步驟2:實體類添加屬性
(1)添加與數據庫表的列對應的一個屬性名,名稱可以任意,如果和數據表列名對不上,可以使用@TableField進行關係映射,如果一致,則會自動對應。
(2)標識新增的字段爲邏輯刪除字段,使用@TableLogic
@Data
//@TableName("tbl_user") 可以不寫是因爲配置了全局配置
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爲正常數據的值,delval爲刪除數據的值
private Integer deleted;
}
步驟3:運行刪除方法
@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testDelete(){
userDao.deleteById(1L);
}
}
從測試結果來看,邏輯刪除最後走的是update操作,會將指定的字段修改成刪除狀態對應的值。
思考
邏輯刪除,對查詢有沒有影響呢?
-
執行查詢操作
@SpringBootTest class Mybatisplus03DqlApplicationTests { @Autowired private UserDao userDao; @Test void testFind(){ System.out.println(userDao.selectList(null)); } }
運行測試,會發現打印出來的sql語句中會多一個查詢條件,如:
可想而知,MyBatisPlus的邏輯刪除會將所有的查詢都添加一個未被刪除的條件,也就是已經被刪除的數據是不應該被查詢出來的。
-
如果還是想把已經刪除的數據都查詢出來該如何實現呢?
通過自己寫SQL語句來實現查詢。
@Mapper public interface UserDao extends BaseMapper<User> { //查詢所有數據包含已經被刪除的數據 @Select("select * from tbl_user") public List<User> selectAll(); }
-
如果每個表都要有邏輯刪除,那麼就需要在每個模型類的屬性上添加
@TableLogic
註解,如何優化?在配置文件中添加全局配置,如下:
mybatis-plus: global-config: db-config: # 邏輯刪除字段名 logic-delete-field: deleted # 邏輯刪除字面值:未刪除爲0 logic-not-delete-value: 0 # 邏輯刪除字面值:刪除爲1 logic-delete-value: 1
介紹完邏輯刪除,邏輯刪除的本質爲:
邏輯刪除的本質其實是修改操作。如果加了邏輯刪除字段,查詢數據時也會自動帶上邏輯刪除字段。
執行的SQL語句爲:
UPDATE tbl_user SET deleted=1 where id = ? AND ==deleted===0
執行數據結果爲:
知識點1:@TableLogic
名稱 | @TableLogic |
---|---|
類型 | 屬性註解 |
位置 | 模型類中用於表示刪除字段的屬性定義上方 |
作用 | 標識該字段爲進行邏輯刪除的字段 |
相關屬性 | value:邏輯未刪除值 delval:邏輯刪除值 |