使用切面对公共字段字段进行自动赋值---总结

一、引入

当我们在后端对数据库某个表进行插入或者修改操作时,有时候会遇到插入和修改都要对某些相同的字段进行赋值,比如create_user, create_time, update_user, update_time等字段,一般情况下大多数人都是在后端对实体类进行set操作,但是如果实体类中需要每次都set的字段很多呢?一个个set操作就显得有些low了,下面我将介绍使用切面操作的方法对这些字段进行自动赋值,而无需再进行重复的set操作。

二、步骤

  • 先定义一个注解,用来标识需要自动填充的方法,如下代码所示
/**
 * 用于需要自定填充字段的方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    OperationType value();
}

- 这里的Operation是我自定义的枚举类,用来说明是数据库的何种操作,如下图所示

在这里插入图片描述

  • 自定义切面类,实现公共字段自动填充的处理逻辑,如下代码

/**
 * 自定义切面,实现公共字段自动填充处理逻辑
 */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    /**
     * 切入点:定义哪些方法是切入点
     *
     */

    @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[] pointArgs = joinPoint.getArgs();
        if(pointArgs==null||pointArgs.length==0){
            return;
        }
        Object object=pointArgs[0];

        //准备赋值的数据
        LocalDateTime time = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();

        //根据当前不同的操作类型,为对应的属性值通过反射来赋值
        Class objectClass = object.getClass();
        if(operationType.equals(OperationType.INSERT)){
            //四个公共字段
            try {
                Method method1 = objectClass.getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
                Method method2 = objectClass.getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);
                Method method3 = objectClass.getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method method4 = objectClass.getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);
                method1.invoke(object,time);
                method2.invoke(object,currentId);
                method3.invoke(object,time);
                method4.invoke(object,currentId);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if(operationType.equals(OperationType.UPDATE)){
            //两个公共字段
            try {

                Method method3 = objectClass.getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
                Method method4 = objectClass.getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);

                method3.invoke(object,time);
                method4.invoke(object,currentId);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

  • 其中AutoFillConstant类中保存了操作公共字段的方法名,如下图所示
/**
 * 公共字段自动填充相关常量
 */
public class AutoFillConstant {
    /**
     * 实体类中的方法名称
     */
    public static final String SET_CREATE_TIME = "setCreateTime";
    public static final String SET_UPDATE_TIME = "setUpdateTime";
    public static final String SET_CREATE_USER = "setCreateUser";
    public static final String SET_UPDATE_USER = "setUpdateUser";
}
  • 在mapper包中需要自动填充的方法上加上自定义注解@AutoFill,比如我的是新增方法和修改方法,然后去掉在serviceimpl中对这些字段的set操作就OK了,之后进行新增和修改操作时就能自动填充这些字段值了。
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学技术的阿拉斯加

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值