Springboot实现公共字段填充的示例详解

 更新时间:2023年10月05日 11:24:33   作者:xyy123  
这篇文章主要为大家详细介绍了Springboot实现公共字段填充的相关知识,文中的示例代码讲解详细,对我们深入学习springboot有一定的帮助,感兴趣的小伙伴可以了解下

问题分析

方式一:自定义注解AutoFill

创建注解

/**  
* 自定义注解,用于标识某个方法需要进行功能字段自动填充处理  
*/  
@Target(ElementType.METHOD)  // 只能加载方法上
@Retention(RetentionPolicy.RUNTIME)  // 固定写法 
public @interface AutoFill {  
    //枚举,数据库操作类型:UPDATE INSERT  
    OperationType value();  
}

创建枚举

/**  
* 数据库操作类型  
*/  
public enum OperationType {  
    /**  
    * 更新操作  
    */  
    UPDATE,  
    /**  
    * 插入操作  
    */  
    INSERT  
}

创建切面类

/**  
* 自定义切面,实现公共字段自动填充处理逻辑  
*/  
@Aspect  
@Component  
@Slf4j  
public class AutoFillAspect {  
    /**  
    * 切入点,指定拦截mapper的下带有autofill注解的方法
    */  
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")  
    public void autoFillPointCut(){
    }  
    /**  
    * 前置通知,在通知中进行公共字段的赋值  
    */  
    @Before("autoFillPointCut()")  
    public void autoFill(JoinPoint joinPoint){  
        log.info("开始进行公共字段自动填充...");  
        //获取到当前被拦截的方法上的数据库操作类型  
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象  
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象  
        OperationType operationType = autoFill.value();//获得数据库操作类型  
        //获取到当前被拦截的方法的参数--实体对象  
        Object[] args = joinPoint.getArgs();  
        if(args == null || args.length == 0){  
        return;  
    }  
    Object entity = args[0];  
    //准备赋值的数据  
    LocalDateTime now = LocalDateTime.now();  
    Long currentId = BaseContext.getCurrentId();  
    //根据当前不同的操作类型,为对应的属性通过反射来赋值  
    if(operationType == OperationType.INSERT){  
        //为4个公共字段赋值  
        try {  
            Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);  
            Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);  
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);  
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);  
            //通过反射为对象属性赋值  
            setCreateTime.invoke(entity,now);  
            setCreateUser.invoke(entity,currentId);  
            setUpdateTime.invoke(entity,now);  
            setUpdateUser.invoke(entity,currentId);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }else if(operationType == OperationType.UPDATE){  
        //为2个公共字段赋值  
        try {  
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);  
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);  
            //通过反射为对象属性赋值  
            setUpdateTime.invoke(entity,now);  
            setUpdateUser.invoke(entity,currentId);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 }  
}

mapper方法中添加注解

方式二:使用mybatis plus提供方法

实体类添加注解 @TableField(fill = FieldFill.XXX)

package com.example.demo.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * 员工信息
 * @TableName employee
 */
@TableName(value ="employee")
@Data
@Accessors(chain = true)
public class Employee implements Serializable {
    /**
     * 主键
     */
    @TableId
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 创建时间
     */
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @TableField(fill = FieldFill.INSERT)//插入时填充字段
    private LocalDateTime createTime;
    /**
     * 更新时间
     */
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @TableField(fill = FieldFill.INSERT_UPDATE)//插入、更新时填充字段,后面的是枚举
    private LocalDateTime updateTime;
    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * 修改人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
}

创建数据处理器

package com.example.demo.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.example.demo.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Autowired
    HttpServletRequest request;
    @Autowired
    RedisUtils redisUtils;
    @Override
    public void insertFill(MetaObject metaObject) {
        //填充创建时间
        metaObject.setValue("createTime", LocalDateTime.now());
        //填充 更新的时间
        metaObject.setValue("updateTime", LocalDateTime.now());
        Long result = BaseContext.get();
        //填充创建人信息
        metaObject.setValue("createUser",result);
        //填充更新人信息
        metaObject.setValue("updateUser",result);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        //因为是更新,所以不用操作创建时间
        //更新 更新的时间
        metaObject.setValue("updateTime", LocalDateTime.now());
        Long result = BaseContext.get();;
        //填充更新人信息
        metaObject.setValue("updateUser",result);
    }
}

以上就是Springboot实现公共字段填充的示例详解的详细内容,更多关于Springboot公共字段填充的资料请关注脚本之家其它相关文章!

相关文章

  • 使用JAVA8 filter对List多条件筛选的实现

    使用JAVA8 filter对List多条件筛选的实现

    这篇文章主要介绍了使用JAVA8 filter对List多条件筛选的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Eclipse常用快捷键总结(必看篇)

    Eclipse常用快捷键总结(必看篇)

    下面小编就为大家带来一篇Eclipse常用快捷键总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java concurrency之集合_动力节点Java学院整理

    Java concurrency之集合_动力节点Java学院整理

    Java集合主体内容包括Collection集合和Map类;而Collection集合又可以划分为List(队列)和Set(集合),有需要的小伙伴可以参考下
    2017-06-06
  • Spring cloud alibaba之Gateway网关功能特征详解

    Spring cloud alibaba之Gateway网关功能特征详解

    spring cloud gateway是spring cloud推出的第二代网关,是由WebFlux+Netty+Reactor实现的响应式的API网关,它不能在传统的servlet容器中工作,也不能构建成war包,接下来通过本文给大家分享Spring cloud alibaba--Gateway网关,需要的朋友可以参考下
    2021-08-08
  • 利用Thumbnailator轻松实现图片缩放、旋转与加水印

    利用Thumbnailator轻松实现图片缩放、旋转与加水印

    java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,这篇文章主要介绍了利用Thumbnailator如何轻松的实现图片缩放、旋转与加水印,需要的朋友可以参考下
    2017-01-01
  • 如何使用Maven管理项目?Maven管理项目实例

    如何使用Maven管理项目?Maven管理项目实例

    下面小编就为大家带来一篇如何使用Maven管理项目?Maven管理项目实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • JavaScript不使用临时变量交换两个变量值的方法总结

    JavaScript不使用临时变量交换两个变量值的方法总结

    在 JavaScript 中交换两个变量的值是一项基础但重要的操作,传统方法会使用一个临时变量,但在某些情况下,我们可能需要不使用临时变量来实现交换,本文将详细介绍多种不使用临时变量交换两个变量值的方法,需要的朋友可以参考下
    2025-04-04
  • Java建造者设计模式详解

    Java建造者设计模式详解

    这篇文章主要为大家详细介绍了Java建造者设计模式,对建造者设计模式进行分析理解,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Springboot整合GuavaCache缓存过程解析

    Springboot整合GuavaCache缓存过程解析

    这篇文章主要介绍了springboot整合GuavaCache缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot配置文件application.properties的使用

    SpringBoot配置文件application.properties的使用

    这篇文章主要介绍了SpringBoot配置文件application.properties的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论