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站看视频。