MyBatis-Plus实现自动字段填充

MyBatis-Plus实现自动字段填充

  • 使用场景
    • 需要做的事
    • 自动填充标签
    • 实现自动填充类
    • 修改配置,使填充生效

使用场景

基本上所有的数据库表设计的时候都会有创建时间、更新时间字段,完善一点的还会有创建时间、更新时间字段,有些项目还会有创建人、更新人等。在编写代码的过程中,反复的手写创建时间、更新时间等字段的赋值,不仅会有大量的代码冗余,还会有忘记赋值的情况出现,造成数据的不准确。对于这种情况,Mybatis-plus提供了自动赋值的方式,供我们使用。
本文章使用的Mybatis-plus版本为3.1.2 。

需要做的事

  1. 给要自动填充的字段添加标签
  2. 实现自动填充类
  3. 修改配置文件

自动填充标签

我们只要在要自动填充的字段上加标签,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"/>

通过以上的配置,就实现了字段的自动填充。

你可能感兴趣的:(Java,mybatis,java,mysql)