論理削除のサポート
論理削除は、データベース内のレコードを物理的に削除する代わりに「削除済み」としてマークすることで、データの履歴を保持しながら、クエリ結果の整合性を確保する優雅なデータ管理戦略です。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 # グローバル論理削除フィールド名 logic-delete-value: 1 # 論理削除済み値 logic-not-delete-value: 0 # 論理未削除値
ステップ2:エンティティクラスで @TableLogic
アノテーションを使用
エンティティクラスで、データベーステーブルの論理削除フィールドに対応するフィールドに @TableLogic
アノテーションを追加します:
import com.baomidou.mybatisplus.annotation.TableLogic;
public class User { // その他のフィールド...
@TableLogic private Integer deleted;}
よくある質問と回答
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 で論理削除機能を簡単に実装し、データ管理の柔軟性とセキュリティを向上させることができます。