前言
一个项目最初的开发,刚把项目搭建起来,在进行各种配置。进行mybatis-plus填充器配置的时候,我发现了一个问题,以前在项目中进行的配置是这样的:
因为每张表的这几个字段都是相同的,所以在那几个字段上面加上注解@TableField(fill = FieldFill.INSERT) 或者 @TableField(fill = FieldFill.UPDATE),就可以在新增或修改时自动填充值了。
(题外话:填充器只能是通过实体修改或者新增才生效,如果他是通过Lambda Update来修改的,那么填充器是不生效的。解决办法参考:https://blog.youkuaiyun.com/assember/article/details/108617148)
但是这次我发现某些表中的字段名不同,那么再这样处理,就不行了,
分析
在网上也没有找到对应的案例,就自己研究了,填充值的主要代码是这一句
setFieldValByName("createCode", user.getUsername(), metaObject);
setFieldValByName这个方法有三个参数,第一个是属性名,第二个是属性值,那么第三个MetaObject应该就是和实体相关的。然后我去翻了一下MetaObject的源码,果然找到了一些端倪:
在MetaObject里面找到了一个属性,叫:originalObject看着名字,就感觉有搞头。
为了确认我的想法,我去百度了一下MetaObject这个类,这个类果然是对实体的包装,参考:https://blog.youkuaiyun.com/mz4138/article/details/81671319
既然能拿到源实体对象,那么就好办了。
解决
既然MetaObject是对实体的封装,那么通过他拿到原本的实体,再通过实体不同,进行不同的填充操作,就OK了,参考代码
总结
完美解决问题,如果表中还有其他不同的字段,那就多几个判断语句就行了。
但是,正常来说,这些表的命名应该规范一点,都是添加时间,就都叫createTime,不要一些叫createTime,一些叫insertTime,什么乱七八糟的。