使用自定义注解以及AOP切面编程实现公共字段自动填充

mybits-plus包含自动填充功能,但是使用该功能需要使用他的sql操作方法,如果自己编写sql语句进行操作的话不会自动填充。

自己编写sql语句是指如下图

下面是mybits-plus官网的截图

1.自定义注解

@Retention(RetentionPolicy.RUNTIME)
//指定该注解是加在方法上
@Target(ElementType.METHOD)
public @interface AutoFill {
    OperationType value();
}

2.其中OperationType是自定义的枚举类型,标识自动填充的操作是插入还是更新

public enum OperationType {
    /**
     * 更新操作
     */
    UPDATE,
    /**
     * 插入操作
     */
    INSERT

}

3.定义切入点匹配到注解,并且执行自动填充逻辑

@Component
@Aspect
public class AutoAspect {
    /*
       定义切入点
     */
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    public void pointCut() {};

    /**
     * 定义前置通知
     */
    @Before("pointCut()")
    public void autoFill(JoinPoint joinPoint) throws Exception {
        //获取注解类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);
        OperationType operationType = autoFill.value();
        //获取第一个参数
        Object [] args = joinPoint.getArgs();
        if (args.length ==0||args == null) {
            return;
        }
        Object  entity = args[0];
        LocalDateTime localTime = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();

        if (operationType == OperationType.INSERT) {
           //获取方法
            Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
            setCreateTime.invoke(entity,localTime);
            Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
            setCreateUser.invoke(entity,currentId);
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
            setUpdateTime.invoke(entity,localTime);
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
            setUpdateUser.invoke(entity,currentId);
        }else if (operationType == OperationType.UPDATE) {
            Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
            setUpdateTime.invoke(entity,localTime);
            Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
            setUpdateUser.invoke(entity,currentId);
        }
    }
}
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";
}

4.注意事项

①自定义注解是在加mapper包下的*mapper类中的方法上,一般为update和insert

②使用自定义的枚举类型,避免拼写错误,使用更加规范

③JoinPoint导入的包是import org.aspectj.lang.JoinPoint;

如果导入的是下面这个,会导致unbound pointcut parameter joinpoint错误。

 ④约定在mapper方法中将实体类放在第一个参数,因为在自动填充的逻辑中是为第一个参数填充。

本篇文章是学习黑马程序员的苍穹外卖的笔记。想看视频解析的话可以去b站看视频。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值