論理削除サポート
論理削除は、データベースから物理的に削除するのではなく、レコードに「削除済み」のマークを付けることで、データの履歴を保持しつつ、クエリ結果の整理整頓を確保する、優雅なデータ管理戦略です。MyBatis-Plusは便利な論理削除サポートを提供し、この戦略の実施を簡単かつ効率的にします。
論理削除の仕組み
MyBatis-Plusの論理削除機能は、データベース操作を実行する際に論理削除フィールドを自動的に処理します。以下がその動作方法です:
- 挿入: 論理削除フィールドの値は制限されません。
- 検索: 削除済みとしてマークされたレコードをフィルタリングする条件を自動的に追加します。
- 更新: 削除済みレコードの更新を防止します。
- 削除: 削除操作を更新操作に変換し、レコードに削除済みのマークを付けます。
例:
- 削除:
update user set deleted=1 where id = 1 and deleted=0
- 検索:
select id,name,deleted from user where deleted=0
サポートされるデータ型
論理削除フィールドはすべてのデータ型をサポートしますが、Integer
、Boolean
、または LocalDateTime
の使用を推奨します。
datetime
型を使用する場合、論理未削除値を null
(長さ4の文字列、yamlではエスケープ文字(単一引用符)で囲む必要があります) に設定でき、削除済み値には now()
などの関数を使用して現在時刻を取得できます。
bigint
型を使用する場合、論理未削除値を 0 に設定でき、削除済み値には UNIX_TIMESTAMP()
などの関数を使用して現在のタイムスタンプを削除識別子として取得できます。削除フィールドを一意インデックスの構成列として使用する場合に適しており、複数回の論理削除が可能です。
使用方法
方法 1: グローバルな論理削除プロパティを設定する
application.yml
で MyBatis-Plus のグローバルな論理削除プロパティを設定します:
mybatis-plus: global-config: db-config: logic-delete-field: deleted # グローバルな論理削除フィールド名(deletedはエンティティクラスのプロパティ名) logic-delete-value: 1 # 論理削除済み値。オプション、デフォルト値は 1 logic-not-delete-value: 0 # 論理未削除値。オプション、デフォルト値は 0
方法 2: グローバル設定を使用したくない場合、エンティティクラスで @TableLogic
アノテーションを使用して、クラスごとに個別に設定できます
エンティティクラスで、対応するデータベーステーブルの論理削除フィールドに @TableLogic
アノテーションを追加します:
import com.baomidou.mybatisplus.annotation.TableLogic;
public class User { // 他のフィールド...
@TableLogic private Integer deleted;}
同様に、論理未削除値のデフォルトは 0、論理削除済み値のデフォルトは 1 です。これらの値は、@TableLogic
アノテーションの value
属性と delval
属性の値を設定することで変更できます。
よくある質問
1. 挿入操作はどのように処理しますか?
- 方法1: データベースで論理削除フィールドのデフォルト値を設定します。
- 方法2: データを挿入する前に、論理削除フィールドの値を手動で設定します。
- 方法3: MyBatis-Plus の自動入力機能を使用します。
2. 削除インターフェースの自動入力機能が無効になった場合はどうすればよいですか?
- 方法1:
deleteById
メソッドを使用します。 - 方法2:
update
メソッドを使用し、UpdateWrapper.set(column, value)
を使用します。 - 方法3:
update
メソッドを使用し、UpdateWrapper.setSql("column=value")
を使用します。 - 方法4: Sql インジェクターを使用して
com.baomidou.mybatisplus.extension.injector.methods.LogicDeleteByIdWithFill
を注入し、使用します(3.5.0 バージョンで非推奨、deleteById の使用を推奨)。
以上の手順により、MyBatis-Plus で論理削除機能を簡単に実装し、データ管理の柔軟性と安全性を高めることができます。