开发随手记-Java公共字段的自动填充

前言

如果说Java开发中有什么是让人很烦的一件事,那一定是无尽的填充字段,本篇作为观众瑰宝系列第二篇,将带来公共字段填充相关的知识点,学完此篇,让你摆脱公共字段填充带来的麻烦,节省代码,降低冗余,妥妥的给项目瘦身,还能一定程度上提高程序的运行效率,所以,你心动吗?

问题描述

可以说,几乎每张表,我们都会有create_time,update_time这样的公共字段,所以几乎每次请求时我们都要去操作这样的字段并重新赋值,这就降低了我们的开发效率,且重复的代码让人不胜其烦,所以我们想要写一个公共的方法可以统一添加这些字段,而不用处处都写相同的代码!

问题解决

在数据库中添加create_time,update_time字段:

 

清空了表中的数据, pojo,entity中添加这两个新字段 

这边使用的字符串String接收,也可使用import java.time.LocalDateTime;

package com.codingfire.cache.entity;
 
import lombok.Data;
 
import java.io.Serializable;
 
@Data
public class User implements Serializable {
    private Long id;
    private String username;
    private String password;
    private Integer age;
    private String phone;
    private String createTime;
    private String updateTime;
}

 接着去重新修改增删改查的代码,我们简单修改如下方法上没有设置时间,前端也不需要传

    @PostMapping
    @CachePut(value = "user", key = "#user.id")
//    @CachePut(value = "userCache", key = "#backUser.id")
    public User add(User user) {
        userService.save(user);
        User backUser = user;
        return backUser;
    }
 
    @PutMapping
    @CachePut(value = "user", key = "#user.id")
//    @CachePut(value = "userCache", key = "#backUser.id")
    public User update(User user) {
        userService.updateById(user);
        User backUser = user;
        return backUser;
    }

解决方案

创建元数据对象处理器



import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: dj
 * @date: 2023/12/19
 */
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    /**
     * 插入时填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充");
        String now = sdf.format(new Date());
        this.setFieldValByName("createTime", now, metaObject);
        this.setFieldValByName("createBy", 1, metaObject);
    }

    /**
     * 更新时填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充");
        String now = sdf.format(new Date());
        this.setFieldValByName("updateTime",now,metaObject);
        this.setFieldValByName("updateBy", 1, metaObject);
    }
}

给时间字段添加注解

做完这些,还需要给自动填充的字段增加一个注解。

如果是插入填充:

    @TableField(fill = FieldFill.INSERT)

如果是插入和更新时都填充:

    @TableField(fill = FieldFill.INSERT_UPDATE)

 进去这个注解类可以看到给我们提供了四种方式

测试

我们重新启动项目,用postman调用此接口,新增加一个用户

查看数据库中新增加的用户信息是否包含了时间

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus提供了公共字段填充的功能,可以在插入和更新操作时自动填充公共字段,减少代码重复和出错的可能性。下面是Java代码实现公共字段填充的示例: 1. 创建公共字段填充器类 ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { // 插入时填充字段 private static final String CREATE_TIME = "createTime"; private static final String UPDATE_TIME = "updateTime"; private static final String CREATE_BY = "createBy"; private static final String UPDATE_BY = "updateBy"; @Override public void insertFill(MetaObject metaObject) { // 填充创建时间和更新时间 this.strictInsertFill(metaObject, CREATE_TIME, LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject, UPDATE_TIME, LocalDateTime::now, LocalDateTime.class); // 填充创建人和更新人 this.strictInsertFill(metaObject, CREATE_BY, "system", String.class); this.strictInsertFill(metaObject, UPDATE_BY, "system", String.class); } @Override public void updateFill(MetaObject metaObject) { // 填充更新时间 this.strictUpdateFill(metaObject, UPDATE_TIME, LocalDateTime::now, LocalDateTime.class); // 填充更新人 this.strictUpdateFill(metaObject, UPDATE_BY, "system", String.class); } } ``` 2. 配置公共字段填充器 ```java @Configuration public class MybatisPlusConfig { @Autowired private MyMetaObjectHandler metaObjectHandler; @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加公共字段填充器 List<MetaObjectHandler> metaObjectHandlers = new ArrayList<>(); metaObjectHandlers.add(metaObjectHandler); interceptor.setMetaObjectHandlers(metaObjectHandlers); return interceptor; } } ``` 在以上示例,我们创建了一个名为MyMetaObjectHandler的公共字段填充器类,实现了MetaObjectHandler接口,并在insertFill和updateFill方法分别填充了创建时间、更新时间、创建人和更新人等公共字段。然后在MybatisPlusConfig将MyMetaObjectHandler配置到MybatisPlusInterceptor,作为公共字段填充器。这样,在执行插入和更新操作时,就会自动填充公共字段,无需手动设置,大大提高了开发效率和数据准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值