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"/>
        <!-- 引入mybatis配置文件 -->
        <property name="configLocation" value="classpath:sql/mybatis-config.xml"/>
        <!-- mapper.xml文件的路径 -->
        <property name="mapperLocations">
            <array>
                <value>classpath*:sql/**/*Mapper.xml</value>
            </array>
        </property>
        <!-- 指定生成sqlSessionFactory时所采用的配置 -->
        <property name="globalConfig" ref="globalConfiguration" />
    </bean>
    ...
    <!-- 生成sqlSessionFactory时所采用的配置 -->
    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
    	<!-- 指定自动填充所使用的bean -->
        <property name="metaObjectHandler" ref="baseMetaObjectHandle"/>
    </bean>
    <!-- 引入刚实现的填充类 -->
    <bean class="com.project.base.config.BaseMetaObjectHandle" id="baseMetaObjectHandle"/>

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值