本文代碼樣例均已上傳至Gitee:https://gitee.com/tqbx/springboot-samples-learn
只對自動注入的sql起效:
- 插入: 不作限制
- 查找: 追加where條件過濾掉已刪除數據,且使用 wrapper.entity 生成的where條件會忽略該字段
- 更新: 追加where條件防止更新到已刪除數據,且使用 wrapper.entity 生成的where條件會忽略該字段
- 刪除: 轉變為 更新
注:
-
邏輯刪除是為了方便數據恢復和保護數據本身價值等等的一種方案,但實際就是刪除。
-
如果你需要頻繁查出來看就不應使用邏輯刪除,而是以一個狀態去表示。
邏輯刪除的配置
- 步驟一:配置yml,全局配置,3.3.0版本之后,配置
logic-delete-field
后可以忽略不配置步驟2。
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局邏輯刪除的實體字段名(since 3.3.0,配置后可以忽略不配置步驟2)
logic-delete-value: 1 # 邏輯已刪除值(默認為 1)
logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)
- 步驟二:加上邏輯刪除的注解,局部配置。
// 邏輯刪除字段
@TableLogic
private Integer deleted;
邏輯刪除的測試
@Test
void logicDelete(){
//UPDATE user SET deleted=1 WHERE deleted=0 AND (name = ?)
boolean remove = userService.remove(
new QueryWrapper<User>().eq("name", "summer"));
System.out.println(remove);
}
@Test
void select(){
//SELECT id,name,deleted FROM user WHERE deleted=0
List<User> list = userService.list(
new QueryWrapper<User>().select("id","name","deleted"));
System.out.println(list);
}
@Test
public void updateById(){
//UPDATE user SET age=? WHERE id=? AND deleted=0
User user = new User();
user.setId(1320008348799713282L);
user.setAge(20);
boolean b = userService.updateById(user);
System.out.println(b);
}
查詢中排除標識字段
使用注解標識需要排除的字段:
@TableField(select = false)
private Integer deleted;