Java中公共字段自动填充处理

目录

步骤1:编写填充字段的规则

步骤2:编写MPBaseEntity类实现Serializable,代码如下

步骤3:实体类继承MPBaseEntity

注意


        在Java项目中使用Mybatis-Plus时,对数据库中的公共字段进行填充处理。

步骤1:编写填充字段的规则

        编写填充字段的规则MyMetaObjectHandler类,需要继承自MetaObjectHandler,填充的规则有多种,下面提供我自己的(也是参考别人的写的)

package com.stu.framework.config.mybatitsPlus;

import com.stu.student.utils.DateFormatUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.stu.common.utils.ShiroUtils;

import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

import java.util.Date;

/**
 * 自动填充的字段处理
 * 字段上方需要添加@TableField注解
 */
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 创建时间
     */
    private static final String CREATE_TIME = "createTime";

    /**
     * 修改时间
     */
    private static final String UPDATE_TIME = "updateTime";

    /**
     * 创建人
     */
    private static final String CREATE_BY = "createBy";

    /**
     * 修改时间
     */
    private static final String UPDATE_BY = "updateBy";
    @Override
    public void insertFill(MetaObject metaObject) {
        String createTime = this.getTypeName(CREATE_TIME, metaObject);
        if (Date.class.getTypeName().equals(createTime)) {
            this.setFieldValByName(CREATE_TIME, new Date(), metaObject);
        } else if (String.class.getTypeName().equals(createTime)) {
            this.setFieldValByName(CREATE_TIME, DateFormatUtil.getDateNow(), metaObject);
        }

        String updateTime = this.getTypeName(UPDATE_TIME, metaObject);
        if (Date.class.getTypeName().equals(updateTime)) {
            this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);
        } else if (String.class.getTypeName().equals(updateTime)) {
            this.setFieldValByName(UPDATE_TIME, DateFormatUtil.getDateNow(), metaObject);
        }

        String createBy = this.getTypeName(CREATE_BY, metaObject);
        if (String.class.getTypeName().equals(createBy)){
            this.setFieldValByName(CREATE_BY, ShiroUtils.getLoginName(), metaObject);
        }

        String updateBy = this.getTypeName(UPDATE_BY, metaObject);
        if (String.class.getTypeName().equals(updateBy)){
            this.setFieldValByName(UPDATE_BY, ShiroUtils.getLoginName(), metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        String updateTime = this.getTypeName(UPDATE_TIME, metaObject);
        if (Date.class.getTypeName().equals(updateTime)) {
            this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);
        } else if (String.class.getTypeName().equals(updateTime)) {
            this.setFieldValByName(UPDATE_TIME, DateFormatUtil.getDateNow(), metaObject);
        }

        String updateBy = this.getTypeName(UPDATE_BY, metaObject);
        if (String.class.getTypeName().equals(updateBy)){
            this.setFieldValByName(UPDATE_BY, ShiroUtils.getLoginName(), metaObject);
        }
    }


    private String getTypeName(String fieldName, MetaObject metaObject) {
        if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)) {
            return metaObject.getGetterType(fieldName).getTypeName();
        } else if (metaObject.hasGetter(Constants.ENTITY)) {
            Object et = metaObject.getValue(Constants.ENTITY);
            if (et != null) {
                MetaObject etMeta = SystemMetaObject.forObject(et);
                if (etMeta.hasSetter(fieldName)) {
                    return etMeta.getGetterType(fieldName).getTypeName();
                }
            }
        }
        return "";
    }

}

步骤2:编写MPBaseEntity类实现Serializable,代码如下

package com.stu.common.core.domain;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Entity基类
 * 
 * @author yanbei
 */
public class MPBaseEntity implements Serializable
{
    private static final long serialVersionUID = 1L;

    /** 搜索值 */
    @TableField(exist = false)
    private String searchValue;

    /** 创建者 */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /** 更新者 */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /** 备注 */
    private String remark;

    /** 请求参数 */
    @TableField(exist = false)
    private Map<String, Object> params;

    public String getSearchValue()
    {
        return searchValue;
    }

    public void setSearchValue(String searchValue)
    {
        this.searchValue = searchValue;
    }

    public String getCreateBy()
    {
        return createBy;
    }

    public void setCreateBy(String createBy)
    {
        this.createBy = createBy;
    }

    public Date getCreateTime()
    {
        return createTime;
    }

    public void setCreateTime(Date createTime)
    {
        this.createTime = createTime;
    }

    public String getUpdateBy()
    {
        return updateBy;
    }

    public void setUpdateBy(String updateBy)
    {
        this.updateBy = updateBy;
    }

    public Date getUpdateTime()
    {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime)
    {
        this.updateTime = updateTime;
    }

    public String getRemark()
    {
        return remark;
    }

    public void setRemark(String remark)
    {
        this.remark = remark;
    }

    public Map<String, Object> getParams()
    {
        if (params == null)
        {
            params = new HashMap<>();
        }
        return params;
    }

    public void setParams(Map<String, Object> params)
    {
        this.params = params;
    }
}

步骤3:实体类继承MPBaseEntity

        例如:StudentUser extends MPBaseEntity

注意

         在使用的过程中要注意自己所需要的填充策略,我个人在MPBaseEntity类中将updateTime和updateBy填充策略设置为:新增和修改。即在执行插入的sql操作时,也会对这两个字段进行填充,若不要填充,可以改为@TableField(fill = FieldFill.UPDATE)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus提供了公共字段填充的功能,可以在插入和更新操作时自动填充公共字段,减少代码重复和出错的可能性。下面是Java代码实现公共字段填充的示例: 1. 创建公共字段填充器类 ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { // 插入时填充字段 private static final String CREATE_TIME = "createTime"; private static final String UPDATE_TIME = "updateTime"; private static final String CREATE_BY = "createBy"; private static final String UPDATE_BY = "updateBy"; @Override public void insertFill(MetaObject metaObject) { // 填充创建时间和更新时间 this.strictInsertFill(metaObject, CREATE_TIME, LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject, UPDATE_TIME, LocalDateTime::now, LocalDateTime.class); // 填充创建人和更新人 this.strictInsertFill(metaObject, CREATE_BY, "system", String.class); this.strictInsertFill(metaObject, UPDATE_BY, "system", String.class); } @Override public void updateFill(MetaObject metaObject) { // 填充更新时间 this.strictUpdateFill(metaObject, UPDATE_TIME, LocalDateTime::now, LocalDateTime.class); // 填充更新人 this.strictUpdateFill(metaObject, UPDATE_BY, "system", String.class); } } ``` 2. 配置公共字段填充器 ```java @Configuration public class MybatisPlusConfig { @Autowired private MyMetaObjectHandler metaObjectHandler; @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加公共字段填充器 List<MetaObjectHandler> metaObjectHandlers = new ArrayList<>(); metaObjectHandlers.add(metaObjectHandler); interceptor.setMetaObjectHandlers(metaObjectHandlers); return interceptor; } } ``` 在以上示例,我们创建了一个名为MyMetaObjectHandler的公共字段填充器类,实现了MetaObjectHandler接口,并在insertFill和updateFill方法分别填充了创建时间、更新时间、创建人和更新人等公共字段。然后在MybatisPlusConfig将MyMetaObjectHandler配置到MybatisPlusInterceptor,作为公共字段填充器。这样,在执行插入和更新操作时,就会自动填充公共字段,无需手动设置,大大提高了开发效率和数据准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值