記事ディレクトリ
この記事では主に、Mybatis-Plus がフィールドを null に更新するための updateById() と update() の使用法を紹介します。この記事では、サンプル コードを通じて詳細に紹介しています。これは、すべての人の学習や仕事に一定の参考と学習価値をもたらします。以下に続きますので、一緒に学びましょう
1. 問題の背景
mybatis-plusを使用する際、クエリ結果の特定のフィールドの値をnullに更新したいのですが、次のduty_jsonフィールドなど、以前からnull以外のデータが格納されているため、オブジェクト(データベース設計)を更新したいのです。 null を許可します)が、結果としてこのフィールドの更新は失敗し、更新メソッドの実行後もクエリの結果は同じです。
2. 問題の原因
mybatis-plus FieldStrategy には 3 つの戦略があります。
- 無視: 0 無視します
- NOT_NULL: 1 つの非 NULL、デフォルト ポリシー
- NOT_EMPTY: 2 は空ではありません
および默认更新策略是NOT_NULL
: 非 NULL、つまり、インターフェイスを通じてデータを更新するときに、データが NULL 値の場合、データベースには更新されません。
3. 解決策
1. グローバルなフィールド戦略を設定する
プロパティファイル形式:
mybatis-plus.global-config.db-config.field-strategy=ignored
yml ファイル形式:
mybatis-plus:
global-config:
#字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
field-strategy: 0
これはグローバル構成であり、すべてのフィールドは無視されます。一部のフィールドは変更したくないが、値が渡されるときに渡されない場合、それらのフィールドは null に更新され、他のビジネス データの正確性に影響を与える可能性があります。
2. フィールドごとに個別のフィールド戦略を設定する
特定の状況に応じて、フィールドが空でないことを確認するなど、更新する必要があるフィールドの検証アノテーションを調整します。
@TableField(strategy=FieldStrategy.NOT_EMPTY)
この場合、次のように、null に更新する必要があるフィールドに無視ポリシーを設定するだけで済みます。
@TableField(strategy = FieldStrategy.IGNORED)
private String dutyJson;
更新コードでは、次のように mybatis-plus の updateById メソッドを直接使用して正常に更新します。
/**
* updateById更新字段为null
* @param id
* @return
*/
@Override
public boolean updateProductById(Integer id) {
InsuranceProduct insuranceProduct = Optional.ofNullable(articleMapper.selectById(id)).orElseThrow(RuntimeException::new);
insuranceProduct.setDutyJson(null);
insuranceProductMapper.updateById(insuranceProduct);
}
上記の方法では、このように処理する必要があるフィールドが多数ある場合、各フィールドにアノテーションを追加する必要があり、少し面倒に思えます。次に、フィールドに注釈を追加せずに正常に更新できる 3 番目の方法の使用を検討できます。
3. UpdateWrapper メソッドを使用して更新します (推奨)
mybatis-plus では、updateById メソッドに加えて、update メソッドも提供されており、update メソッドを直接使用してフィールドを null に設定することもできます。コードは次のとおりです。
/**
* 根据商品唯一编码,更新商品责任的dutyjson
*/
public int updateProduct(String productCode) {
InsuranceProduct old = lambdaQuery().eq(InsuranceProduct::getProductCode, productCode).one();
UpdateWrapper<InsuranceProduct> wrapper = new UpdateWrapper<>();
wrapper.lambda().eq(InsuranceProduct::getProductCode, productCode)
.set(InsuranceProduct::getDutyJson, null)
.eq(InsuranceProduct::getDeleted, 0);
return getBaseMapper().update(old, wrapper);
}
この方法は他のメソッドに影響を与えず、グローバル構成を変更する必要がなく、フィールドに個別の注釈を付ける必要もないため、この方法をお勧めします。