Java如何优雅保存公共字段数据

项目中创建人、创建时间等等公共字段抽取出来做成公共对象,更优雅的保存,在实际开发业务的时候无需关心公共字段数据,更关注业务数据

1.准备Mybatis-plus 3.3.0(以上版本支持)

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

2.准备抽取的公共对象

package com.hhjt.server.model.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

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

/**
 * @ClassName : BaseEntity
 * @Description :
 * @Author : pengyifeng
 * @Date: 2020-10-21 20:08
 */
@Data
public class BaseEntity implements Serializable {

    private static final Long serialVersionUID = 1L;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * 创建人员
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    /**
     * 更新人员
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * 逻辑删除字段 0 未删除 1删除
     */
    private Integer delFlag;
}

3.业务实体依赖公共对象

package com.hhjt.server.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.io.Serializable;
import java.util.Date;
import lombok.Data;

/**
 * 瞭望塔主表
 *
 * @author pengyifeng
 * @email pengyifeng@aliyun.com
 * @date 2021-08-17 16:00:39
 */
@Data
@TableName("bus_watchtower")
public class WatchtowerEntity extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 瞭望塔名
     */
    private String name;
    /**
     * 经度
     */
    private String longitude;
    /**
     * 纬度
     */
    private String latitude;
    /**
     * 地址名称
     */
    private String address;
    /**
     * 所属行政区域code
     */
    private String areaCode;


}

4.需要注入实现接口MetaObjectHandler

  • 实现该接口,可以在特定场景(新增、修改)下优雅的设置公共数据,并重写相应的方法即可
package com.hhjt.server.config;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.hhjt.server.utils.CertifyUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @ClassName : MyMetaObjectHandler
 * @Description :
 * @Author : pengyifeng
 * @Date: 2020-10-21 20:12
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.debug("新增数据自动填充开始...");
        this.strictInsertFill(metaObject, "createTime", Date.class, DateUtil.date());
        this.strictInsertFill(metaObject, "createUser", Integer.class, CertifyUtils.getUserId());
        this.strictUpdateFill(metaObject, "updateTime", Date.class, DateUtil.date());
        this.strictUpdateFill(metaObject, "updateUser", Integer.class, CertifyUtils.getUserId());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.debug("更新数据自动填充开始...");
        this.strictUpdateFill(metaObject, "updateTime", Date.class, DateUtil.date());
        this.strictUpdateFill(metaObject, "updateUser", Integer.class, CertifyUtils.getUserId());
    }
}

接口调用

    /**
     * 保存、更新
     */
    @PostMapping("/insertOrUpdate")
    public RespResult insertOrUpdate(@RequestBody WatchtowerParam param){
        WatchtowerEntity watchtowerEntity=new WatchtowerEntity();
        BeanUtil.copyProperties(param,watchtowerEntity);
        boolean update = watchtowerService.saveOrUpdate(watchtowerEntity);

        return update ? RespResult.respMessage(ResponseCode.RESULT_SUCCESS) : RespResult.respMessage(ResponseCode.RESULT_FAIL);
    }

调用接口

image

打印SQL

image

自动填充公共字段,这样开发就只关系业务字段

关键注解

更多详细注解官网了解:https://mp.baomidou.com/guide/annotation.html#tablefield

@TableField

  • 描述:字段注解(非主键)
  • | fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
  • image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容