公共字段自动填充
这些字段在每张表基本都有,手动进行填充效率低,且后期维护更改繁琐
使用到注解+AOP主要
先答应一个AutoFill注解
再定义一个切面类进行通知
对应代码
用到了枚举类和反射
package com.sky.aspect;
/**
* 自定义切面类,实现公共字段自动填充
*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
/**
* 切入点
*/
//不仅需要符合切入点表达式,且要满足方法上有对应注解
@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
public void auotFillPointCut(){}
/**
* 前置通知,在通知中进行公共字段赋值
*/
@Before("auotFillPointCut()")
public void autoFill(JoinPoint joinPoint){
log.info("开始进行公共字段的自动填充...");
//获取方法上的数据库操作类型(决定是否需修改CreateUser和CreateTime)
MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
AutoFill annotation = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
OperationType value = annotation.value();//获取数据库的操作类型
//获取方法上的参数--实体参数
Object[] args = joinPoint.getArgs();
if (args==null || args.length==0){
return;
}
Object entity=args[0];//可能接收不同实体,因为是公共字段,可能员工,菜品什么的都有,所以用object
//准备赋值数据
LocalDateTime now = LocalDateTime.now();
Long currentId = BaseContext.getCurrentId();
//根据当前不同的操作类型,为对应属性进行赋值
if(value==OperationType.INSERT)
{
try {
//通过反射获取对应的方法
Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
//再进行赋值
setCreateTime.invoke(entity,now);
setUpdateTime.invoke(entity,now);
setCreateUser.invoke(entity,currentId);
setUpdateUser.invoke(entity,currentId);
} catch (Exception e) {
e.printStackTrace();
}
}
else if(value==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里面所有方法还要带@AutoFill注解
所以我们在对应mapper文件的insert和update操作做上加上@AutoFill注解并且指定value(操作类型)
然后我们就可以把之前service中设置UpdateTime和UpdateUser以及Create的全都可以注释/删除
进行测试
我这里测试过了
提交推送即可
增加菜品业务
需求分析
涉及到我们的菜品分类的回查
还有文件上传图片可以用阿里云的oss实现
代码开发
先开发一个阿里云的服务