MybatisPlus 统一管理创建人、更新人、创建时间、更新时间等公共字段

实体类父类:

package com.byx.communitycontrol.common.entity;

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

import java.time.LocalDateTime;


@Data
public class BaseEntity {

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

    /**
     * 创建时间
     */
    @TableField(value = "CREATEDTIME", fill = FieldFill.INSERT)
    private LocalDateTime createdTime;
    /**
     * 更新人
     */
    @TableField(value = "UPDATEDBY", fill = FieldFill.INSERT_UPDATE)
    private String updatedBy;
    /**
     * 更新时间
     */
    @TableField(value = "UPDATEDTIME", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedTime;
}

@TableLogic
框架提供的逻辑删除注解。
配合以下配置一起使用:
mybatis-plus.configuration.global-config.db-config.logic-delete-value=1 ##字段值为1时 表示逻辑删除
mybatis-plus.configuration.global-config.db-config.logic-delete-value=0 ##字段值为0时 表示未删除
当字段添加上@TableLogic后 框架在生成sql模板时 自动在后面添加上逻辑删除字段=0(配置文件中的配置) 的查询条件

@TableField
该注解用于标识非主键的字段。
存在多个属性,各个属性的用法如下:
value :指定映射的数据库字段名
el:映射为原生 #{ … } 逻辑,相当于写在 xml 里的 #{ … } 部分。新版本已经没有el表达式了
exist:是否为数据库表字段,默认为 true。
condition:字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s}。
update:字段 update set 部分注入,例如:update=“%s+1”:表示更新时会 set version=version+1(该属性优先级高于 el 属性)。
fill:字段自动填充策略,默认为 FieldFill.DEFAULT。
… 其他的自己去官网看…

本文主要用到 fill的自动填充策略

配置类:

package com.byx.communitycontrol.context.helper;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.byx.communitycontrol.common.entity.BaseEntity;
import com.byx.communitycontrol.context.user.JwtUser;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Objects;


@Component
public class BaseEntityConfig implements MetaObjectHandler {
    /**
     * 使用mp做添加操作时候,这个方法执行
     *
     * @param metaObject 元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        //this.setFieldValByName("createdTime", LocalDateTime.now(), metaObject);
        //this.setFieldValByName("updatedTime", LocalDateTime.now(), metaObject);
        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
            LocalDateTime now = LocalDateTime.now();
            // 创建时间为空,则以当前时间为插入时间
            if (Objects.isNull(baseEntity.getCreatedTime())) {
                baseEntity.setCreatedTime(now);
            }
            // 更新时间为空,则以当前时间为更新时间
            if (Objects.isNull(baseEntity.getUpdatedTime())) {
                baseEntity.setUpdatedTime(now);
            }
            // 此处写获取用户及用户名的业务代码
            JwtUser user = WebAppContextHelper.getUser();
            // 当前登录用户不为空,创建人为空,则当前登录用户为创建人
            if (Objects.nonNull(user) && Objects.isNull(baseEntity.getCreatedBy())) {
                baseEntity.setCreatedBy(user.getUsername());
            }
            // 当前登录用户不为空,更新人为空,则当前登录用户为更新人
            if (Objects.nonNull(user) && Objects.isNull(baseEntity.getUpdatedBy())) {
                baseEntity.setUpdatedBy(user.getUsername());
            }
        }
    }

    /**
     * 使用mp做修改操作时候,这个方法执行
     *
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updatedTime", LocalDateTime.now(), metaObject);
        // 此处写获取用户及用户名的业务代码
        JwtUser user = WebAppContextHelper.getUser();
        this.setFieldValByName("updatedBy", user.getUsername(), metaObject);

    }

}

子类: 

package com.byx.communitycontrol.common.entity.liveService;

import com.baomidou.mybatisplus.annotation.*;
import com.byx.communitycontrol.common.entity.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.ibatis.type.JdbcType;

import java.time.LocalDateTime;


@Data
@EqualsAndHashCode(callSuper = false)
@TableName(value = "X_LIFEINFORMATION")
@KeySequence(value = "SEQ_X_LIFEINFORMATION")
public class LifeInformation extends BaseEntity {

    @TableId(value = "ID", type = IdType.INPUT)
    private Integer id;

    /**
     * 作者
     */
    @TableField(value = "AUTHOR")
    private String author;

    /**
     * 标题
     */
    @TableField(value = "TITLE")
    private String title;

    /**
     * 封面
     */
    @TableField(value = "COVER", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
    private String cover;

    /**
     * 摘要
     */
    @TableField(value = "SUMMARY", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
    private String summary;
    /**
     * 内容
     */
    @TableField(value = "CONTENT", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
    private String content;

    /**
     * 发布时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "PUBLISHTIME")
    private LocalDateTime publishTime;

    /**
     * 图片
     */
    @TableField(value = "PICS", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
    private String pics;

    /**
     * 附件
     */
    @TableField(value = "ATTACHMENTS", updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
    private String attachments;

    /**
     * 状态
     */
    @TableField(value = "STATUS")
    private Integer status;

    /**
     * 类型
     */
    @TableField(value = "TYPE")
    private String type;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实体类中,我们可以使用注解和AOP等方式来实现自动给公共字段赋值的功能。下面是一个示例: ```java import java.util.Date; public class BaseEntity { private Long id; private String createBy; private Date createTime; private String updateBy; private Date updateTime; // 在实体类持久化之前,自动设置createBy、createTime、updateBy、updateTime @PrePersist public void prePersist() { createTime = updateTime = new Date(); createBy = updateBy = "system"; } // 在实体类更新之前,自动设置updateBy、updateTime @PreUpdate public void preUpdate() { updateTime = new Date(); updateBy = "system"; } // 省略getter和setter方法 } ``` 上述代码中,使用了JPA提供的注解 `@PrePersist` 和 `@PreUpdate` 标注了 `prePersist()` 和 `preUpdate()` 方法,这两个方法在实体类被持久化前和更新前自动调用。在这两个方法中,我们可以编写代码来实现自动给公共字段赋值的功能。 在 `prePersist()` 方法中,我们使用 `new Date()` 方法来获取当前时间,并将其赋值给 `createTime` 和 `updateTime` 字段。同时,我们将 `createBy` 和 `updateBy` 字段赋值为 "system",表示是系统自动创建更新的。 在 `preUpdate()` 方法中,我们同样使用 `new Date()` 方法来获取当前时间,并将其赋值给 `updateTime` 字段。同时,我们将 `updateBy` 字段赋值为 "system",表示是系统自动更新的。 需要注意的是,上述代码中的字段和默认值都是示例,具体情况需要根据实际需求进行调整。同时,如果需要自动获取当前登录用户信息,可以使用AOP等方式来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值