苍穹外卖——day3

1.公共字段自动填充

我们在添加功能的时候常常要重复执行一些重复的操作

如下图

我们在执行update或者insert数据库操作的时候,总是要给下面的一些属性赋值

这样如果代码功能一多,这会显得代码很冗长

所以我们引入了公共字段自动填充这个功能的实现

那么如何来实现它呢?

下图简单的介绍了一下实现方法

要实现这个功能我们要学会一些知识

枚举

枚举,我们很熟悉,但是我们忘记如何使用

其实很简单

就是定义一个枚举类

然后在类中定义出我们要枚举的事物

如这个功能是实现就是要枚举出update,insert

简单来说就是把两个事物存在这个枚举类中,然后我们直接调用其中一个就是了

如果到现在还不理解的话

接下来去看下面的实现代码就一目了然了

AOP面向切面编程

这个没什么好说的,这个挺复杂的,一下子肯定说不清

之前笔记有单独写的,自己去看,这个很重要,一定要掌握

反射

这个,在学Java的那个400集课程学过了

不过现在已经忘记了

这个也很重要

到时候一定要去弄明白

很多东西都要通过反射来实现

上面都是文字概述

接下来都是代码

建议看不懂上面

可以来看看代码

看了就懂了

代码实现

首先是枚举类

public enum OperationType {

    /**
     * 更新操作
     */
    UPDATE,

    /**
     * 插入操作
     */
    INSERT

}

然后是注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    //利用枚举类来确定数据库操作类型
    OperationType value();
}

然后是自定义切面类

/*
* 自定义切面类
* */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    @Pointcut("execution(* com.sky.mapper.*.*(..))&&@annotation(com.sky.annotation.AutoFill)")
    //个人认为前面可以省略,只留@annotation(com.sky.annotation.AutoFill)就行
    public void autoFillPointCut(){}
    /*
    * 前置通知,在通知中进行公共字段的赋值
    * */
    @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("开始进行公共字段自动填充...");
        //这个要自己导的包才不会报错,不然下面调用method()会报错
        // import org.aspectj.lang.reflect.MethodSignature;
       MethodSignature signature= (MethodSignature) joinPoint.getSignature();
        //TODO getClass还是getMethod?
        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){
            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){
            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层的数据库操作是update,insert的作上注解标记就行了

 @AutoFill(OperationType.UPDATE)
    void update(Employee employee);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值