springboot入门11 – MyBatis写入时null问题统一处理方案

如果MySQL表的一些字段被设置为不允许为空,使用MyBatis写入的数据中相应字段的值是null就有可能会报类似下面的错误:

对于这个问题,我通常的做法是为对应字段的null值直接赋值一个空字符串(或其它默认值)。但是这次,不知道为什么那么多不必要的字段被设置为了不能为空:七八个字段,要判断是否为空,还要一个个赋默认值 —— 想想就头疼。一定要想办法优化掉这种啰嗦且难看的东西。

参考分页插件 PageHelper 的实现后找到了思路:添加一个拦截器,获取参数实例,为实例的值为null的Field设置一个默认值。

拦截器的实现如下:

在这个拦截器中通过反射的方式为参数实例值为null的字段完成了赋默认值。这里只为几个我常用的类型(字符串、整型和日期类型)设置了默认值,如果还会用到其他值请自行修改setDefaultValue方法。

代码中有一个重要的点就是拦截器类上的注解@Signature

这个注解指明了具体要拦截的类和方法。在这里,数据库操作主要是通过Executor类完成;并且不论是新增或是更新都是通过update方法实现的,args属性则明确了方法参数只有一个Object类型的值。

然后是让这个拦截器生效。代码如下:

这里通过@Configuration完成的自定义拦截器的注入。

配置完成后,再次执行写入和更新的测试案例,一次通过,搞定!

示例代码:zhyea / spring-boot-database-pad

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据