基本上所有的数据库表设计的时候都会有创建时间、更新时间字段,完善一点的还会有创建时间、更新时间字段,有些项目还会有创建人、更新人等。在编写代码的过程中,反复的手写创建时间、更新时间等字段的赋值,不仅会有大量的代码冗余,还会有忘记赋值的情况出现,造成数据的不准确。对于这种情况,Mybatis-plus提供了自动赋值的方式,供我们使用。
本文章使用的Mybatis-plus版本为3.1.2 。
我们只要在要自动填充的字段上加标签,MybatisPlus会在执行sql语句之前进行填充,然后再执行语句。添加标签的方式如下:
// fill = FieldFill.INSERT 表示这个字段在执行insert语句之前,会被进行填充
@ApiModelProperty(value = "创建机构名称")
@TableField(value = "CRTE_ORG_NAME", fill = FieldFill.INSERT)
private String crteOrgName;
// fill = FieldFill.INSERT_UPDATE 表示这个字段在执行insert或者update语句之前,会被进行填充
@ApiModelProperty(value = "经办机构名称")
@TableField(value = "OPT_ORG_NAME", fill = FieldFill.INSERT_UPDATE)
private String optOrgName;
填充模式有四种,都在FieldFill这个enum内:
public enum FieldFill {
DEFAULT, // 默认不处理
INSERT, // 插入
UPDATE, // 更新
INSERT_UPDATE; // 插入和更新
private FieldFill() {
}
}
要实现自动填充功能,需要定义一个组件,实现MetaObjectHandler接口中定义的方法。
这里还涉及到一个问题,如果想自动填充经办人和创建人信息,需要有用户信息,存放于上下文中。
此部分可自行实现。
填充类的代码如下,其中BaseContextHolder.getContext().getBaseCurrentUser()是我项目中定义的获取上下文环境中用户信息的方法。
具体实现可参照文章【SpringBoot:实现上下文管理】
package com.project.base.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.project.base.context.BaseContextHolder;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class BaseMetaObjectHandle implements MetaObjectHandler {
Logger logger = LoggerFactory.getLogger(BaseMetaObjectHandle.class);
@Override
public void insertFill(MetaObject metaObject) {
logger.info("新增数据补充创建人和经办人信息");
this.setFieldValByName("crterId", BaseContextHolder.getContext().getBaseCurrentUser().getUserId(), metaObject);
this.setFieldValByName("crterName", BaseContextHolder.getContext().getBaseCurrentUser().getUserName(), metaObject);
this.setFieldValByName("crteTime", new Date(), metaObject);
this.setFieldValByName("crteOrgId", BaseContextHolder.getContext().getBaseCurrentUser().getOrgId(), metaObject);
this.setFieldValByName("crteOrgName", BaseContextHolder.getContext().getBaseCurrentUser().getOrgName(), metaObject);
this.setFieldValByName("opterId", BaseContextHolder.getContext().getBaseCurrentUser().getUserId(), metaObject);
this.setFieldValByName("opterName", BaseContextHolder.getContext().getBaseCurrentUser().getUserName(), metaObject);
this.setFieldValByName("optTime", new Date(), metaObject);
this.setFieldValByName("optOrgId", BaseContextHolder.getContext().getBaseCurrentUser().getOrgId(), metaObject);
this.setFieldValByName("optOrgName", BaseContextHolder.getContext().getBaseCurrentUser().getOrgName(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
logger.info("更新数据补充经办人信息");
this.setFieldValByName("opterId", BaseContextHolder.getContext().getBaseCurrentUser().getUserId(), metaObject);
this.setFieldValByName("opterName", BaseContextHolder.getContext().getBaseCurrentUser().getUserName(), metaObject);
this.setFieldValByName("optTime", new Date(), metaObject);
this.setFieldValByName("optOrgId", BaseContextHolder.getContext().getBaseCurrentUser().getOrgId(), metaObject);
this.setFieldValByName("optOrgName", BaseContextHolder.getContext().getBaseCurrentUser().getOrgName(), metaObject);
}
}
这里有一个比较容易踩的坑就是,填充的字段的类型,要和实体类中的类型一致,否则会是填充失效。
只添加一个工具是不行的,因为Mybatis-plus在生成SqlSessionFactory的时候会使用默认的配置进行生成,也就使用了默认的填充器,内容为空,不进行任何填充。
这时,需要我们显式的配置,我所采用的配置方式是在数据库配置文件(xml文件)中进行引用。配置文件如下:
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:sql/mybatis-config.xml"/>
<property name="mapperLocations">
<array>
<value>classpath*:sql/**/*Mapper.xmlvalue>
array>
property>
<property name="globalConfig" ref="globalConfiguration" />
bean>
...
<bean id="globalConfiguration" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="metaObjectHandler" ref="baseMetaObjectHandle"/>
bean>
<bean class="com.project.base.config.BaseMetaObjectHandle" id="baseMetaObjectHandle"/>
通过以上的配置,就实现了字段的自动填充。