論理削除する方法
主に2通りの方法が存在する。
方法1.アノテーションを付与する
@TableLogic
を論理削除フィールドに付与する
User.java
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
@Data
public class User {
private int id;
private String userName;
private int age;
@TableLogic
private int deleted;
}
生成されるSQL文
テストコード
package com.example.demo;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void test() {
List<User> userList = userMapper.selectList(null);
// ==> Preparing: SELECT id,user_name,age,deleted FROM user WHERE deleted=0
// ==> Parameters:
// <== Total: 10
userMapper.deleteById(2);
// ==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
// ==> Parameters: 2(Integer)
// <== Updates: 1
User updateUser = new User();
updateUser.setId(5);
updateUser.setAge(10);
userMapper.updateById(updateUser);
// ==> Preparing: UPDATE user SET age=? WHERE id=? AND deleted=0
// ==> Parameters: 10(Integer), 5(Integer)
// <== Updates: 1
}
}
注意
下記のいずれかを行いたい場合は、@TableLogic
の付与は非推奨
- 論理削除済みのレコードもselectしたい
- 条件に
deleted=0
が追加されるため
- 条件に
- 論理削除時に更新時間を記録したい
-
deleteById()
=> 削除フラグ以外更新できない -
updateById()
=> 削除フラグを更新できない - SQLインジェクターをカスタムして更新する方法はある(→ Mybatis Plus逻辑删除时自动填充时间 - 知乎)
-
方法2. 共通の論理削除フィールド名を設定する
以下のように設定すると、deleted
フィールドはアノテーションを付与しなくても論理削除フィールドとみなされる。(3.3.0以降)
application.yml
mybatis-plus:
global-config:
db-config:
logicDeleteField: deleted # 共通の論理削除フィールド名, デフォルト値: null
# デフォルトの削除値、未削除値でよい場合は下記の設定は不要
logic-delete-value: 1 # 論理削除値, デフォルト値: 1
logic-not-delete-value: 0 # 論理未削除値, デフォルト値: 0
参考ページ