亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MybatisPlus更新為null的字段及自定義sql注入

 更新時間:2024年05月07日 10:56:37   作者:擺爛小趙  
mybatis-plus在執(zhí)行更新操作,當更新字段為空字符串或者null的則不會執(zhí)行更新,本文主要介紹了MybatisPlus更新為null的字段及自定義sql注入,感興趣的可以了解一下

mybatis-plus在執(zhí)行更新操作,當更新字段為 空字符串 或者 null 的則不會執(zhí)行更新。如果要將指定字段更新null,可以通過以下四種方式實現(xiàn)

1、全局配置(不推薦)

可以在 application.yml 配置文件中注入配置 GlobalConfiguration 屬性 update-strategy,

將 update-strategy 策略調整為 IGNORED,即忽略判斷策略。即可調整全局的驗證策略。

# yml 配置:
mybatis-plus:
  global-config:
    db-config:
      update-strategy: IGNORED

2、添加updateStrategy 注解(不推薦)

在實體類中將需要更新為null的字段上添加updateStrategy 注解,并將更新策略設置為IGNORED。

@TableField(value = "name", updateStrategy=FieldStrategy.IGNORED)
private String name;

3、使用UpdateWrapper更新(當屬性很多寫起來很麻煩)

通過baseMapper的UpdateWrapper將實體類的指定字段set為null。

baseMapper.update(sysUser, Wrappers.<SysUser>lambdaUpdate()
                        .set(SysUser::getOrgId, null)
                        .set(SysUser::getOrgName, null)
                        .eq(SysUser::getId, sysUser.getId())
                );

4、Mybatis Plus 自定義SqlInjector sql注入器(推薦)

(1)、自定義sql注入器MySqlInjector

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;

import java.util.List;

public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        // 根據(jù)id更新所有數(shù)據(jù)
        methodList.add(new UpdateWithNullMethod());
        return methodList;
    }

}

(2)、方法對應的實現(xiàn)類UpdateWithNullMethod

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

import java.lang.reflect.Field;
import java.util.List;

import static java.util.stream.Collectors.joining;

/**
 * @author :zzt
 */
@Slf4j
public class UpdateWithNullMethod extends AbstractMethod {
    protected UpdateWithNullMethod() {
        super("updateWithNull");
    }

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "<script>\nupdate %s %s where %s=#{%s}\n</script>";

        final List<TableFieldInfo> fieldList = tableInfo.getFieldList();
        for (TableFieldInfo tableFieldInfo : fieldList) {
            final Class<? extends TableFieldInfo> aClass = tableFieldInfo.getClass();
            try {
                final Field fieldFill = aClass.getDeclaredField("fieldFill");
                fieldFill.setAccessible(true);
                fieldFill.set(tableFieldInfo, FieldFill.UPDATE);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                log.error("獲取fieldFill失敗", e);
            }
        }
        String setSql = this.sqlSet(tableInfo);
        String sqlResult = String.format(sql, tableInfo.getTableName(), setSql, tableInfo.getKeyColumn(), tableInfo.getKeyProperty());
        log.debug("sqlResult----->{}", sqlResult);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        // 第三個參數(shù)必須和rootMapper的自定義方法名一致
        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateWithNull", sqlSource);
    }

    protected String sqlSet(TableInfo table) {
        String sqlScript = table.getFieldList()
                .stream().map(i -> this.getSqlSet(i, StringPool.EMPTY)).collect(joining(StringPool.NEWLINE));
        sqlScript = SqlScriptUtils.convertTrim(sqlScript, "SET", null, null, ",");
        return sqlScript;
    }

    public String getSqlSet(TableFieldInfo i, String prefix) {
        String newPrefix = prefix == null ? StringPool.EMPTY : prefix;
        String column = i.getColumn();
        String update = i.getUpdate();
        FieldFill fieldFill = i.getFieldFill();
        String el = i.getEl();

        // 默認:column=
        String sqlSet = column + StringPool.EQUALS;
        if (StringUtils.isNotEmpty(update)) {
            sqlSet += String.format(update, column);
        } else {
            sqlSet += SqlScriptUtils.safeParam(newPrefix +el);
        }

        sqlSet += StringPool.COMMA;
        if (fieldFill == FieldFill.UPDATE || fieldFill == FieldFill.INSERT_UPDATE) {
            // 不進行if包裹
            return sqlSet;
        }
        return convertIf(sqlSet, convertIfProperty(newPrefix, column), i.getUpdateStrategy(),
                i.getPropertyType().isPrimitive(), StringUtils.isCharSequence(i.getPropertyType()));
    }

    private String convertIfProperty(String prefix, String property) {
        return StringUtils.isNotBlank(prefix)
                ? prefix.substring(0, prefix.length() - 1) + "['" + property + "']" : property;
    }


    private String convertIf(final String sqlScript, final String property, final FieldStrategy fieldStrategy,
                             boolean isPrimitive, boolean isCharSequence) {
        if (fieldStrategy == FieldStrategy.NEVER) {
            return null;
        }
        if (isPrimitive || fieldStrategy == FieldStrategy.IGNORED) {
            return sqlScript;
        }
        if (fieldStrategy == FieldStrategy.NOT_EMPTY && isCharSequence) {
            return SqlScriptUtils.convertIf(sqlScript, String.format("%s != null and %s !=''", property, property), false);
        }
        return SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", property), false);
    }
}

(2)、自定義基礎Mapper繼承BaseMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * @description: 自定義mapper借口,mybatisPlus
 * @author: zzt
 */
public interface MyBaseMapper<T> extends BaseMapper<T> {

    /**
     * 全字段更新,更新為null的字段
     * @param obj 待更新對象
     * @return 是否成功
     */
    boolean updateWithNull(T obj);
}

最后直接調用即可。

到此這篇關于MybatisPlus更新為null的字段及自定義sql注入的文章就介紹到這了,更多相關MybatisPlus更新為null內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SimpleDateFormat線程安全問題排查詳解

    SimpleDateFormat線程安全問題排查詳解

    這篇文章主要為大家介紹了SimpleDateFormat線程安全問題排查詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java?根據(jù)XPATH批量替換XML節(jié)點中的值

    Java?根據(jù)XPATH批量替換XML節(jié)點中的值

    這篇文章主要介紹了Java根據(jù)XPATH批量替換XML節(jié)點中的值,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • idea插件在線和離線安裝方法

    idea插件在線和離線安裝方法

    這篇文章主要介紹了idea插件在線和離線安裝方法,文末補充介紹了IntelliJ IDEA 安裝mybaits當前運行sql日志插件在線與離線安裝方法
    ,感興趣的朋友一起看看吧
    2023-12-12
  • 解決HashMap多線程操作導致死循環(huán)問題

    解決HashMap多線程操作導致死循環(huán)問題

    文章主要講述了在多線程環(huán)境下,HashMap的并發(fā)操作可能導致的死循環(huán)問題,包括鏈表/紅黑樹結構破壞、擴容過程中的混亂以及讀寫不一致等,為了解決這些問題,文章建議使用線程安全的ConcurrentHashMap替代HashMap,并介紹了其分段鎖機制和優(yōu)化方案
    2025-01-01
  • 在Java中關閉SQL執(zhí)行日志來優(yōu)化服務器性能

    在Java中關閉SQL執(zhí)行日志來優(yōu)化服務器性能

    Java應用程序中,數(shù)據(jù)庫操作是一個常見的任務,如果不適當?shù)靥幚鞸QL執(zhí)行日志,可能會導致不必要的性能損失,SQL執(zhí)行日志通常由數(shù)據(jù)庫連接池、ORM框架(如Hibernate、MyBatis)、或者應用服務器的內置日志機制生成,本文將探討如何在Java中關閉SQL執(zhí)行日志,提升應用性能和效率
    2024-11-11
  • 詳解基于Spring Data的領域事件發(fā)布

    詳解基于Spring Data的領域事件發(fā)布

    這篇文章主要介紹了詳解基于Spring Data的領域事件發(fā)布,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Springboot整合JPA配置多數(shù)據(jù)源流程詳解

    Springboot整合JPA配置多數(shù)據(jù)源流程詳解

    這篇文章主要介紹了Springboot整合JPA配置多數(shù)據(jù)源,JPA可以通過實體類生成數(shù)據(jù)庫的表,同時自帶很多增刪改查方法,大部分sql語句不需要我們自己寫,配置完成后直接調用方法即可,很方便
    2022-11-11
  • JAVA CountDownLatch(倒計時計數(shù)器)用法實例

    JAVA CountDownLatch(倒計時計數(shù)器)用法實例

    這篇文章主要介紹了JAVA CountDownLatch(倒計時計數(shù)器)用法實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java中的logback標記日志過濾器MarkerFilter詳解

    Java中的logback標記日志過濾器MarkerFilter詳解

    這篇文章主要介紹了Java中的logback標記日志過濾器MarkerFilter詳解,在logback-classic中存在一個全局過濾器TurboFilter,TurboFilter是與LoggerContext綁定,會在會在其它過濾器之前執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • Java Springboot 重要知識點整理匯總

    Java Springboot 重要知識點整理匯總

    Spring Boot作為微服務中最好的Java框架,本文主要為大家整理匯總了七個Spring Boot的重要知識點,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-11-11

最新評論