使用Mybatis-plus实现公共字段填充

1、首先在实体类上使用@TableFiled,指定填充策略,即什么时候进行填充

	//比如在创建、修改时间字段,创建人、修改人字段进行自动填充,就要按如下进行标记
    @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;

2、编写类实现MetaObjectHandler接口,编写元数据处理器,在此类中为公共字段统一填充

/**
 * 自定义元数据处理器
 */
@Slf4j
@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",new Long(1));
        metaObject.setValue("updateUser",new Long(1));
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",new Long(1));
    }
}

由于MyMetaObjecthandler类中无法调用HttpSession,所以创建、修改者的id无法获取,暂时使用写死的new Long(1)代替。

解决方法:使用ThreadLocal,ThreadLocal是线程的一个局部变量,具有隔离性,只有线程内才能获取到对应值,在登录验证时,存储登录者id到Thread的局部变量,在填充字段时获取。

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户
 */
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();
    }
}

登录过滤器中

//验证登录状态,已登录则放行
    if (request.getSession().getAttribute("employee")!=null){
        Long empId= (Long) request.getSession().getAttribute("employee");
        //获取登录id到ThreadLocal局部变量
        BaseContext.setCurrentId(empId);
        filterChain.doFilter(request,response);
        return;
    }

修改后的MyMetaObjectHandler类

/**
 * 自定义元数据处理器
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime06",LocalDateTime.now());
        metaObject.setValue("updateTime06",LocalDateTime.now());
        metaObject.setValue("createUser06",BaseContext.getCurrentId());
        metaObject.setValue("updateUser06",BaseContext.getCurrentId());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime06",LocalDateTime.now());
        metaObject.setValue("updateUser06",BaseContext.getCurrentId());
    }
}

你可能感兴趣的:(java,mybatis,spring,boot)