<aside> 💡 我们的数据库中有很多的表,但是很多表可能都有公共的字段,因此可以设置公共字段自动填充

</aside>

下面是一个类别表的示例,对于创建时间、更新时间、创建人、修改人很多表可能都有这个字段

@Data
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    //类型 1 菜品分类 2 套餐分类
    private Integer type;
    //分类名称
    private String name;
    //顺序
    private Integer sort;

    //创建时间
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    //更新时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    //创建人
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    //修改人
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}

因此我们可以通过@TableField(fill = FieldFill.INSERT)设置当数据在插入时,不用特定指定,自动填充改数据。@TableField(fill = FieldFill.INSERT_UPDATE)当数据在插入或更新时,自动填充数据。

所以我们新建一个类,用来自动数据填充

@Component
public class MymetaObjectHandler implements MetaObjectHandler {
    @Override
    // 当进行插入数据时
    public void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }

    @Override
    // 当进行更新数据时
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
}

这里有一个BaseContext是什么意思呢?因为我们无法在这个对象中,获得当前的用户ID,所以需要这个上下文对象。在用户每次通过URL访问时,我们就把用户id存进BaseContext中。

public class BaseContext{
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }
    public static Long getCurrentId() {
        return threadLocal.get();
    }
}

那么程序怎么写比较好,什么用户每次访问URL时,必经路径是哪个呢?没错就是过滤器。我们可以在用户在访问拦截器时,就把用户的ID存入BaseContext中。

@Override
public class LoginCheckFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        BaseContext.setCurrentId((Long) employ);
        filterChain.doFilter(req, resp);
    }
}