标签:obj lob cts pre fill turn tst stat 背景
背景:
因为每次对业务表的操作都需要记录创建人和修改人。因为不想每次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);
}
标签:obj lob cts pre fill turn tst stat 背景
原文地址:https://www.cnblogs.com/jylsgup/p/12230742.html