目录
1.溯源
3年前当时Mybatis plus还没有那么火爆的时候,当时在创业公司是遇到了 Mybatis plus ,因为baseMapper也没有集成batch的接口(到现在也没有),然后发现继承的MetaObjectHandler接口没有生效。
public class DefaultDBFieldHandler implements MetaObjectHandler {
public DefaultDBFieldHandler() {
}
public void insertFill(MetaObject metaObject) {
if (!Objects.isNull(metaObject)) {
LocalDateTime current = LocalDateTime.now();
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, current);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, current);
String userId = (String)Optional.ofNullable(LoginUserHolder.get()).map(UserVO::getUserId).orElse((Object)null);
this.strictInsertFill(metaObject, "createBy", String.class, userId);
this.strictInsertFill(metaObject, "updateBy", String.class, userId);
}
}
}
因为当时非常忙,就没时间去研究这些东西,没办法批量的接口自己手动填充。
2.孽缘
3年后,现在做新的项目我尽量避免batchInsert,实在不行我们就循环insert,mysql的insert性能还是比较可靠的,不是update都好说。毕竟
可是后面发现不对劲啊,很多批量操作不能总是一条条插入吧,mysql的insert性能不用担心,那过频繁的io的传输时间也够呛的吧。
3.发现
于是打开源码,先看看Mybatis plus提供的顶层扩展service,
看完后果然,为了解决一次性sql超长的问题,设置了一个批次的大小。
4.尝试
那如果我们自己写的batchInset可以填充吗,通过Mybatisx生成一个batchInset
很失望,无情的 can,t be null 报错
java.sql.SQLIntegrityConstraintViolationException: Column 'create_by' cannot be null
于是这次debug到源码,尤其是看到作者的注释,我懵了
【尝试提取参数进行填充,如果是多参数时,在使用注解时,请注意使用collection,list,array进行声明】
当组装参数的时候,map.getKey()只会尝试collection,list,array的key,而我自己写的xml是mybatisx 自动帮我生成的。默认是【业务属性+collection】,
5.结果
只需要把自定义的map和xml 的parm名字改成collection,list,array的其中一个就可以了。
6.吐槽
我觉得苞米豆有点不厚道了哦,说起来是一个公司的产品,
mybatisx的插件帮你自动生成的参数名字叫: xxxCollection
Mybatis plus你却把注释写到了源码里面,只能接受collection,list,array 这三个名字。
我怀疑是故意的,然后锻炼开发人员查问题的能力的吧