Mybatis-Plus は updateById()、update() を使用してフィールドを null に更新します

この記事では主に、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);
    }

この方法は他のメソッドに影響を与えず、グローバル構成を変更する必要がなく、フィールドに個別の注釈を付ける必要もないため、この方法をお勧めします。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_47061482/article/details/132191205