mybatis-plus添加数据和修改数据的时候自动填充数据

it2024-04-11  44

# 我们在实际开发中往数据库中存放数据的时候会有一些默认值,比如创建时间,更新时间之类的,这里给大家安利两种方法

## 1,如果使用的是创建时间和更新时间这种字段我们可以使用数据库的工具操作

![image](https://upload-images.jianshu.io/upload_images/19909560-1a2d5f505177d995.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

数据库中勾选这个在你每次更新数据库中这个表的字段的时候都会获取当前的时间做为这个字段的值,CURRENT_TIMESTAMP:将默认值设置为这个参数则会在创建的时候获取当前时间作为这个参数的值,这是基于数据库完成对这些字段的维护操作,适用于简单的可以直接拿到值,不需要从请求获取参数的场景,如果是我在创建对象的时候需要记录创建对象的人是谁,更新的时候需要知道更新的人是谁,这种方法就没有办法满足了

## 2,基于mybatis-plus的注解的方式完成新建和更改的时候给参数赋值

### 2.1简单的赋值,如1中所说的给创建时间,更改时间赋值

    /**      * 创建时间      */     @TableField(value = "create_time",fill = FieldFill.INSERT)     private LocalDateTime createTime;

    /**      * 更新时间      */     @TableField(value = "modify_time",fill = FieldFill.INSERT_UPDATE)     private LocalDateTime modifyTime;

这里我们使用create_time和modify_time字段表示创建时间和更新时间,我们在加上TableField的fill 属性的时候就是说当前这个字段的字段填充策略是什么 ```   public enum FieldFill {     /**      * 默认不处理      */     DEFAULT,     /**      * 插入时填充字段      */     INSERT,     /**      * 更新时填充字段      */     UPDATE,     /**      * 插入和更新时填充字段      */     INSERT_UPDATE } ``` 这就是fill 的枚举,我们在实体类中添加了注解之后再写个类来实现MetaObjectHandler 

``` @Component public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override     public void insertFill(MetaObject metaObject) {         this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());     }

    @Override     public void updateFill(MetaObject metaObject) {         this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());     }

} ``` 这里的两个方法就是新建和更新的时候执行的方法,如果在实体类中有使用了FieldFill.INSERT或者FieldFill.INSERT_UPDATE的属性就会执行这两个方法 strictInsertFill的方法就会把当前的时间赋值给createTime(这里如果是modifyTime这个字段不存在则不会跟新:注意这里的字段是使用的我们实体类中的字段而不是数据库中的字段)

### 2.2当我们赋值之后就不需要通过这个方式赋值,如果我们没有设置值则自动来设置值 我们只需要在上面这个方法中获取你参数的值的时候使用`Object createTime1 = getFieldValByName("createTime", metaObject);`方法来获取是否赋值给这个参数 ```  @Override     public void insertFill(MetaObject metaObject) {

        //判断添加/更新的时候是否给他赋值         Object createTime1 = getFieldValByName("createTime", metaObject);         if (createTime1 != null) {             this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());         }     }

    @Override     public void updateFill(MetaObject metaObject) {         //判断添加/更新的时候是否给他赋值         Object modifyTime1 = getFieldValByName("modifyTime", metaObject);         if (modifyTime1 != null) {             this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());      ``` ### 2.3当我们赋值的参数的值需要从请求中获取值的时候(比如我更新的时候需要设置更新用户![8c94340eb607f2a62090e7367e4a99c.png](https://upload-images.jianshu.io/upload_images/19909560-e0409a289226b4d6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 的值) ``` @Component public class MyMetaObjectHandler extends HttpFilter implements MetaObjectHandler {

    private HttpServletRequest request;

    @Override     public void insertFill(MetaObject metaObject) {

        //判断添加/更新的时候是否给他赋值         Object createTime1 = getFieldValByName("createTime", metaObject);         if (createTime1 != null) {             this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());         }     }

    @Override     public void updateFill(MetaObject metaObject) {         //判断添加/更新的时候是否给他赋值         Object modifyTime1 = getFieldValByName("modifyTime", metaObject);         if (modifyTime1 != null) {             this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());         }         String userId = request.getHeader(HeaderConstant.USER_ID);         this.strictUpdateFill(metaObject, "userId", Long.class, userId);     }

    @Override     public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)             throws IOException, ServletException {         this.request = request;         chain.doFilter(request, response);     }

}

``` 我们通过HttpFilter 去获取请求头中的参数然后赋值给我们更新的时候的参数,最后在更新数据库中的字段的时候就会更新这个字段的值

以上就是我对于字段填充功能的方法的总结,如有疑问或者更好的建议可以联系我-。-!

 

#补充一点这种实现方式是线程非安全的,可能会导致数据存入失败,这里发一下最新的写法,代码的实现逻辑差不多

/** * 新增的时候添加字段 * * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()); if (null != servletRequestAttributes) { String userId = servletRequestAttributes.getRequest().getHeader(HeaderConstant.USER_ID); String departmentId = servletRequestAttributes.getRequest().getHeader(HeaderConstant.DEPARTMENT_ID); log.error("userId=[{}],时间为[{}]", userId, LocalDateTime.now()); if (StringUtils.isNotBlank(userId)) { this.strictInsertFill(metaObject, "createUid", Long.class, Long.valueOf(userId)); log.error("userId=[{}],时间为[{}]", Long.valueOf(userId), LocalDateTime.now()); } if (StringUtils.isNotBlank(departmentId)) { this.strictInsertFill(metaObject, "createDepartmentId", Long.class, Long.valueOf(departmentId)); } } }
最新回复(0)