Springboot实现公共字段填充的示例详解
作者: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公共字段填充的资料请关注脚本之家其它相关文章!