使用Mybaits-plus自动填充过程中遇到的问题

使用Mybaits-plus自动填充过程中遇到的问题

  • 背景说明
  • MetaObjectHandler实现类中的方法是不一样的
  • 调用service层中的方法时必须传入实体类对象

背景说明

在写Oj系统后端时,数据库表根据阿里巴巴java开发规范,每个表都有create_by、create_time、update_by、update_time四个字段,之前的ORM框架因为用的都是Mybatis,所以一直是通过AOP+反射进行这四个字段的自动填充。本次因为引入了Mybatis-Plus,决定使用MP的字段自动填充功能,因为之前没用过+粗心,遇到了一些问题,幸亏群里大佬指点才解决,这里记录一下,希望能帮到碰到同样问题的同学。

MetaObjectHandler实现类中的方法是不一样的

@Component
public class FillHandler implements MetaObjectHandler {
    /**
     * 插入时填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof User) {
            // 是user类,说明已登录
            this.strictInsertFill(metaObject, "createBy", Long.class, ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
        } else {
            this.strictInsertFill(metaObject, "createBy", Long.class, ConstantToken.NO_LOGIN_USER_ID);
        }
    }

    /**
     * 更新时填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
        if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof User) {
            // 是User类,说明已登录
            this.strictUpdateFill(metaObject, "updateBy", Long.class, ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId());
        } else {
            this.strictUpdateFill(metaObject, "updateBy", Long.class, ConstantToken.NO_LOGIN_USER_ID);
        }
    }
}
  • insertFill中调用的方法是strictInsertFill
  • updateFill中调用的方法是strictUpdateFill

调用service层中的方法时必须传入实体类对象

questionService.update(new Question(), questionUpdateWrapper)
  • 如果不传入一个实体类对象,是无法填充的。

你可能感兴趣的:(Java,mybatis,后端,java)