Mybatis-plus自动填充

Mybatis-plus自动填充

定义MyMetaObjectHandler的类,该类实现了MetaObjectHandler接口。这个类主要用于自动填充数据库表中的字段,通常在插入(insert)或更新(update)记录时。

  • @Component:这是一个Spring框架的注解,表示这个类是一个Spring组件。这意味着这个类的实例将被Spring容器管理,可以被注入到其他组件中。
  • @Slf4j:这是一个Lombok库的注解,用于在类中自动创建一个SLF4J的logger实例。

这个类中有两个方法,分别是insertFillupdateFill。这两个方法是MetaObjectHandler接口的方法,必须被实现。

  • insertFill:在插入操作时被调用。该方法通过SecurityUtil.getUsername()获取当前用户的用户名,并使用setFieldValByName方法将这个用户名设置为createBy字段的值。同时,它还将当前日期时间设置为createTime字段的值。
  • updateFill:在更新操作时被调用。它的工作方式与insertFill类似,但是它设置的是updateByupdateTime字段的值。

总的来说,这个类的作用是自动为数据库表中的某些字段设置值,特别是在记录被插入或更新时。这可以帮助跟踪记录的创建者和创建时间,以及最后更新记录的用户和时间,对于审计和跟踪记录的历史信息非常有用。

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        String userName = SecurityUtil.getUsername();
        this.setFieldValByName("createBy",userName,metaObject);
        this.setFieldValByName("createTime",new Date(),metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        String userName = SecurityUtil.getUsername();
        this.setFieldValByName("updateBy", userName, metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

当用户成功登录后,Spring Security的认证管理器会创建一个Authentication对象,并将其自动存入SecurityContextHolder的上下文中。Authentication对象通常在用户成功登录后被存入SecurityContextHolder。当用户提交登录请求时,Spring Security的过滤器链会捕获这个请求,并将其传递给认证管理器进行验证。如果验证成功,认证管理器会创建一个Authentication对象,并将它存入SecurityContextHolder的上下文中。只要这个安全上下文仍然有效(例如,在同一个会话中),你就可以通过SecurityContextHolder.getContext().getAuthentication()来获取这个Authentication对象,进而访问当前认证用户的信息。

所以创建一个 SecurityUtil从SecurityContextHolder的上下文获取登录后的用户

public class SecurityUtil {
    public static String getUsername(){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (Objects.nonNull(authentication)) {
            User user = (User)authentication.getPrincipal();
            return user.getUsername();
        }
        return null;
    }
}

这段代码定义了一个名为BaseEntity的抽象类,该类主要作为一些实体的基类,包含了一些公共字段和注解。下面是关于代码的主要功能的概述:

  1. @Data:这是Lombok库的一个注解,它为类提供了getter、setter、equals、hashCode和toString方法的自动实现。
  2. 字段定义
    • id: 这是一个长整型字段,用于唯一标识一个实体。@TableId注解表明它是数据库表的主键,并且其值自动生成。
    • createByupdateBy: 这两个字符串字段分别用于记录创建和更新该实体的用户。通过@TableField注解与FieldFill枚举,它们会在插入和更新操作时自动填充。
    • createTimeupdateTime: 这两个日期字段分别用于记录实体的创建和更新时间。它们同样通过注解在插入和更新时自动填充,并且@JsonFormat注解指定了它们序列化为JSON时的日期时间格式。
    • deleted: 这是一个整型字段,用于表示实体是否被删除。@TableLogic注解表明它用于逻辑删除,即实际的数据不会被从数据库中移除,但会被标记为已删除。
    • remark: 这是一个字符串字段,通常用于存储与该实体相关的一些备注或额外信息。

总的来说,这个抽象基类定义了一些在多个数据库实体中常见的字段,如创建时间、创建者、更新时间、更新者等,并提供了一种方式来自动填充这些字段的值。通过使用这样的基类,可以确保数据的一致性和减少重复代码。

@Data
public abstract class BaseEntity {
    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField(value = "create_by",fill = FieldFill.INSERT)
    private String createBy;

    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(value = "update_by",fill = FieldFill.UPDATE)
    private String updateBy;

    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    @TableField(value = "update_time",fill=FieldFill.UPDATE)
    private Date updateTime;

    @TableLogic
    private Integer deleted;

    private String remark;
}

继承了 BaseEntity类,就自动会填充createBy、createTime、updateBy、updateTime

@Data
@TableName("sys_user")
@ApiModel(value="SysUser对象", description="用户表")
public class SysUser extends BaseEntity {

你可能感兴趣的:(mybatis)