<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);
}
}