Java開發學習(四十八)----MyBatisPlus刪除語句之邏輯刪除

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:邏輯刪除值

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章