MyBatis修改操作注入動(dòng)態(tài)全局參數(shù)

有時(shí)候我們?cè)诟伦侄蔚臅r(shí)候可能只更新一個(gè)狀態(tài)固惯,但是又需要記錄當(dāng)前的更新人和更新時(shí)間梆造,比如:

updateStatus(@Param("id") String id, @Param("status") Integer status);

這個(gè)時(shí)候又不想創(chuàng)建DO或者DTO,可以添加一個(gè)全局的參數(shù)注入葬毫,把當(dāng)前用戶信息和當(dāng)前時(shí)間注入到當(dāng)前執(zhí)行的sql的上下文中

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ReflectUtil;
import org.apache.ibatis.executor.statement.BaseStatementHandler;
import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.*;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

@Intercepts({
        @Signature(type = StatementHandler.class, method = "parameterize", args = {Statement.class})
})
public class InjectGlobalParamInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object target = invocation.getTarget();
        if(StatementHandler.class.isAssignableFrom(target.getClass())) {
            RoutingStatementHandler statementHandler = (RoutingStatementHandler) target;
            BoundSql boundSql = statementHandler.getBoundSql();
            BaseStatementHandler delegate = (BaseStatementHandler) ReflectUtil.getFieldValue(statementHandler, "delegate");
            MappedStatement mappedStatement = (MappedStatement) ReflectUtil.getFieldValue(delegate, "mappedStatement");
            SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
            if(SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE == sqlCommandType || SqlCommandType.DELETE == sqlCommandType) {
                putParamsIfNecessary(boundSql);
            }
        }
        return invocation.proceed();
    }

    private void putParamsIfNecessary(BoundSql boundSql) {
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        if (parameterMappings != null) {
            for (int i = 0; i < parameterMappings.size(); i++) {
                ParameterMapping parameterMapping = parameterMappings.get(i);
                if (parameterMapping.getMode() != ParameterMode.OUT) {
                    String propertyName = parameterMapping.getProperty();
                    if (Arrays.asList("_G_NOW", "_NOW").contains(propertyName)) {
                        boundSql.setAdditionalParameter(propertyName, DateUtil.date().toString());
                    }
                    if (Arrays.asList("_G_UUID", "_UUID").contains(propertyName)) {
                        boundSql.setAdditionalParameter(propertyName, IdUtil.fastSimpleUUID());
                    }
                }
            }
        }
    }

    @Override
    public Object plugin(Object target) {
        if (target instanceof StatementHandler) {
            return Plugin.wrap(target, this);
        }
        return target;
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

參考源碼位置:
Mybatis:

// DefaultParameterHandler
@Override
 public void setParameters(PreparedStatement ps) {
   ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
   List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
   if (parameterMappings != null) {
     for (int i = 0; i < parameterMappings.size(); i++) {
       ParameterMapping parameterMapping = parameterMappings.get(i);
       if (parameterMapping.getMode() != ParameterMode.OUT) {
         Object value;
         String propertyName = parameterMapping.getProperty();
         if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params
           value = boundSql.getAdditionalParameter(propertyName);
         } else if (parameterObject == null) {
           value = null;
         } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
           value = parameterObject;
         } else {
           MetaObject metaObject = configuration.newMetaObject(parameterObject);
           value = metaObject.getValue(propertyName);
         }
         TypeHandler typeHandler = parameterMapping.getTypeHandler();
         JdbcType jdbcType = parameterMapping.getJdbcType();
         if (value == null && jdbcType == null) {
           jdbcType = configuration.getJdbcTypeForNull();
         }
         try {
           typeHandler.setParameter(ps, i + 1, value, jdbcType);
         } catch (TypeException | SQLException e) {
           throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
         }
       }
     }
   }
 }

Mybatis-Plus:

// MybatisParameterHandler
@Override
   @SuppressWarnings("unchecked")
   public void setParameters(PreparedStatement ps) {
       ErrorContext.instance().activity("setting parameters").object(this.mappedStatement.getParameterMap().getId());
       List<ParameterMapping> parameterMappings = this.boundSql.getParameterMappings();
       if (parameterMappings != null) {
           for (int i = 0; i < parameterMappings.size(); i++) {
               ParameterMapping parameterMapping = parameterMappings.get(i);
               if (parameterMapping.getMode() != ParameterMode.OUT) {
                   Object value;
                   String propertyName = parameterMapping.getProperty();
                   if (this.boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params
                       value = this.boundSql.getAdditionalParameter(propertyName);
                   } else if (this.parameterObject == null) {
                       value = null;
                   } else if (this.typeHandlerRegistry.hasTypeHandler(this.parameterObject.getClass())) {
                       value = parameterObject;
                   } else {
                       MetaObject metaObject = this.configuration.newMetaObject(this.parameterObject);
                       value = metaObject.getValue(propertyName);
                   }
                   TypeHandler typeHandler = parameterMapping.getTypeHandler();
                   JdbcType jdbcType = parameterMapping.getJdbcType();
                   if (value == null && jdbcType == null) {
                       jdbcType = this.configuration.getJdbcTypeForNull();
                   }
                   try {
                       typeHandler.setParameter(ps, i + 1, value, jdbcType);
                   } catch (TypeException | SQLException e) {
                       throw new TypeException("Could not set parameters for mapping: " + parameterMapping + ". Cause: " + e, e);
                   }
               }
           }
       }
   }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镇辉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贴捡,更是在濱河造成了極大的恐慌摊聋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栈暇,死亡現(xiàn)場(chǎng)離奇詭異麻裁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門煎源,熙熙樓的掌柜王于貴愁眉苦臉地迎上來色迂,“玉大人,你說我怎么就攤上這事手销⌒” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锋拖,是天一觀的道長(zhǎng)诈悍。 經(jīng)常有香客問我,道長(zhǎng)兽埃,這世上最難降的妖魔是什么侥钳? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮柄错,結(jié)果婚禮上舷夺,老公的妹妹穿的比我還像新娘。我一直安慰自己售貌,他們只是感情好给猾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颂跨,像睡著了一般敢伸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恒削,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天池颈,我揣著相機(jī)與錄音,去河邊找鬼蔓同。 笑死饶辙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斑粱。 我是一名探鬼主播弃揽,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼则北!你這毒婦竟也來了矿微?” 一聲冷哼從身側(cè)響起尚揣,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤涌矢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后快骗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娜庇,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔次,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了名秀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励负。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匕得,靈堂內(nèi)的尸體忽然破棺而出继榆,到底是詐尸還是另有隱情,我是刑警寧澤汁掠,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布略吨,位于F島的核電站,受9級(jí)特大地震影響考阱,放射性物質(zhì)發(fā)生泄漏翠忠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一羔砾、第九天 我趴在偏房一處隱蔽的房頂上張望负间。 院中可真熱鬧偶妖,春花似錦姜凄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扼鞋,卻和暖如春申鱼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背云头。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工捐友, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溃槐。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓匣砖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親昏滴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猴鲫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容