mybatisplus - 屬性自動注入問題


背景:

      因為每次對業務表的操作都需要記錄創建人和修改人。因為不想每次set操作。所以寫了一個攔截器實現MetaObjectHandler接口,並實現了insertFill方法。

@Override
public void insertFill(MetaObject metaObject) {
String userNum = RequestContext.getStrHead(Constants.GlobalParam.USER_NUM, Constants.SystemUser.USER_NUM);
this.setFieldValByName("creator", userNum, metaObject);
this.setFieldValByName("update", userNum, metaObject);
}

然后在需要注入的DO對象中,屬性加上注解:
@TableField(fill = FieldFill.INSERT)


問題:
創建時,發現DO對象的屬性,即使不標上注解,表中的創建人和修改人字段也記錄了從head中獲取的用戶賬號數據。


后面通過查看源碼,發現整個過程是:
1、首先進入了DynamicSqlSource類的getBoundSql()方法,根據前端傳過來的json對象中屬性是否有值,來生成sql。
public BoundSql getBoundSql(Object parameterObject) {
DynamicContext context = new DynamicContext(this.configuration, parameterObject);
this.rootSqlNode.apply(context);
SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(this.configuration);
Class parameterType = parameterObject == null?Object.class:parameterObject.getClass();
SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType, context.getBindings());
BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
Map var10000 = context.getBindings();
Objects.requireNonNull(boundSql);
var10000.forEach(boundSql::setAdditionalParameter);
return boundSql;
}

真正拼裝sql是在MixedSqlNode類中有個
List<SqlNode> contents;

其中如果加了注解@TableField(fill = FieldFill.INSERT)
那么list中就會是 屬性名, 

如果沒有加注解,則是 屬性名 != null
 
         
         
        
2、然后進入了MybatisDefaultParameterHandler的構造方法;
public MybatisDefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
super(mappedStatement, processBatch(mappedStatement, parameterObject), boundSql);
this.mappedStatement = mappedStatement;
this.configuration = mappedStatement.getConfiguration();
this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
this.parameterObject = parameterObject;
this.boundSql = boundSql;
}

3、然后進入了MybatisDefaultParameterHandler的populateKeys()方法;
if(metaObjectHandler != null) {
if(isInsert && metaObjectHandler.openInsertFill()) {
metaObjectHandler.insertFill(metaObject);
} else if(!isInsert) {
metaObjectHandler.updateFill(metaObject);
}
}

4、進入自己實現的insertFill()方法。


原因:
屬性不加注解,但是前端傳來的json串中包含了創建人和修改人,且有值。
不過在insertFill()方法中,被我覆蓋掉了。

解決辦法:
insertFill()方法中加上判斷,如果不為空,則將head中的值替換進去。
比如:
Object creatorObject = getFieldValByName("creator", metaObject);
if (creatorObject == null) {
this.setFieldValByName("creator", userNum, metaObject);
}
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM