MyBatis-Plus 公共字段填充功能

本文基于 SpringBoot
在项目开发过程中,我们的数据库表中,经常不可避免的会出现一些公共字段,比如创建人信息、创建时间、修改人信息、修改时间等等相关信息,我们一般都是拿到当前操作人员 set 相关属性进行写入,或者利用 aop 、反射等相关技术进行处理,当我们使用了 MyBatis-Plus 之后,这一切就变得简单起来了

一、引入 MyBatis-Plus

1、引入相关依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

		<!--mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.6</version>
		</dependency>

		<!--mybatis plus 相关依赖版本注意保持一致,否则会有惊喜-->
		<!--mybatis plus 集成 springboot 核心依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.1.0</version>
		</dependency>

		<!--mybatis plus 代码生成器-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-generator</artifactId>
			<version>3.1.0</version>
		</dependency>

2、SpringBoot 配置文件

数据库相关连接信息按自己的进行配置

mybatis-plus:
   #扫描所有xml
  mapper-locations: classpath:mapper/*.xml
   #扫描实体类
  type-aliases-package: com.wxw.springboot_mybatisplus.MetaObject.entity
   #打印日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二、准备相关实体类代码

1、基础实体类父类

@Data
public class BaseEntity implements Serializable {

    /**
     * id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private String id;
    /**
     * 创建人
     */
    @TableField(value = "create_user_id", fill = FieldFill.INSERT)
    private String createUserId;

    /**
     * 创建人
     */
    @TableField(value = "create_user_code", fill = FieldFill.INSERT)
    private String createUserCode;

    /**
     * 创建时间
     */
    @TableField(value = "create_date", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createDate;
    /**
     * 更新人
     */
    @TableField(value = "update_user_id", fill = FieldFill.UPDATE)
    private String updateUserId;

    /**
     * 更新人
     */
    @TableField(value = "update_user_code", fill = FieldFill.UPDATE)
    private String updateUserCode;

    /**
     * 更新时间
     */
    @TableField(value = "update_date", fill = FieldFill.UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateDate;
    /**
     * 是否删除
     */
    @TableField(value = "delete_flag", fill = FieldFill.INSERT)
    @TableLogic
    private String deleteFlag;


}

在需要自动填充的字段上增加注解
@TableField(value = “delete_flag”, fill = FieldFill.INSERT)
@TableField(value = “update_date”, fill = FieldFill.UPDATE)

value 是对应的字段名称
fill = FieldFill.INSERT 表示插入的时候进行操作

我们可以看 FieldFill 的源码,有如下几种选项
INSERT 表示插入的时候进行填充
UPDATE 表示修改的时候进行填充
INSERT_UPDATE 表示插入和修改的时候都进行填充
在这里插入图片描述

2、自定义公共填充类实现元对象处理器接口

/**
 * 自动填充公共字段
 */
@Slf4j
@Component
public class BaseMetaObjectHandler implements MetaObjectHandler {


    private static final String ID = "id";

    /**
     * 创建人员ID
     */
    private static final String CREATE_USER_ID = "createUserId";

    /**
     * 创建人员Code
     */
    private static final String CREATE_USER_CODE = "createUserCode";

    /**
     * 创建时间
     */
    private static final String CREATE_DATE = "createDate";

    /**
     * 更新人ID
     */
    private static final String UPDATE_USER_ID = "updateUserId";


    /**
     * 更新人员code
     */
    private static final String UPDATE_USER_CODE = "updateUserCode";

    /**
     * 更新时间
     */
    private static final String UPDATE_DATE = "updateDate";

    /**
     * 删除标记
     */
    private static final String DELETE_FLAG = "deleteFlag";



    /**
     * 新增
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        setFieldValByName(CREATE_USER_ID, "1", metaObject);
        setFieldValByName(CREATE_USER_CODE, "admin", metaObject);

        // 创建时间
        setFieldValByName(CREATE_DATE, new Date(), metaObject);
        // 删除标记
        setFieldValByName(DELETE_FLAG, "0", metaObject);

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        // 更新用户
        setFieldValByName(UPDATE_USER_ID, "123", metaObject);
        setFieldValByName(UPDATE_USER_CODE, "admin", metaObject);
        setFieldValByName(UPDATE_DATE, new Date(), metaObject);
    }
}

类上增加注解 @Component 表示 此类加入 Spring 的管理,如果不加此注解,也可以通过注入 bean 的形式进行注入

当我们实现元对象处理器接口之后,我们可以重写接口中的两个方法
insertFill 和 updateFill
分别对插入时需要填充的公共字段 和 修改时需要填充的公共字段做处理,我这里只是简单的填充一些测试数据,可以按照自己的实际情况惊醒填充,比如拿到 security 中的用户进行填充或者拿到 session 中的用户进行填充等等,都可以

注意:
1、setFieldValByName 方法中,例如 UPDATE_DATE 等字段,必须使用驼峰转换之后的字段名,比如 update_date , 这里就是 updateDate,否则,在填充的时候不会报错,但是填充的数据就会一直是 null,所以这里的字段名必须要对应
2、需要填充的字段,必须要有 get 和 set 方法,否则也是会填充不进去的,我这里是在基础实体的父类中使用了 lombok 的 @data 注解来实现 get 和 set
3、如果填充的字段,一直都填充的是 null,请检查填充的字段和数据库字段是否没有对应上

三、测试自动填充

1、写两个接口测试插入以及修改

在这里插入图片描述

2、使用 postman 调用测试

测试插入
在这里插入图片描述
可以看到控制台输出的 sql 有插入我们在公共填充接口中填充的数据
在这里插入图片描述

测试修改
在这里插入图片描述
在这里插入图片描述

关注公众号查看更多资源
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值