码迷,mamicode.com
首页 > 其他好文 > 详细

mybatisplus - 属性自动注入问题

时间:2020-01-23 16:59:13      阅读:319      评论:0      收藏:0      [点我收藏+]

标签: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);
}
 
 

mybatisplus - 属性自动注入问题

标签:obj   lob   cts   pre   fill   turn   tst   stat   背景   

原文地址:https://www.cnblogs.com/jylsgup/p/12230742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!