python做网站 jsp,网站建设出题,建设企业手机银行,摄影网站 源码文章目录 概要整体架构流程技术细节小结 概要
在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段#xff0c;在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段#xff0c;也就是也就是在我们的系统中很多表…文章目录 概要整体架构流程技术细节小结 概要
在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段也就是也就是在我们的系统中很多表中都会有这些字段如下
序号字段名含义数据类型1create_time创建时间datetime2create_user创建人idbigint3update_time修改时间datetime4update_user修改人idbigint
而针对于这些字段我们的赋值方式为
1). 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。
2). 在更新数据时, 将updateTime 设置为当前时间, updateUser设置为当前登录用户ID。
我们使用AOP切面编程实现功能增强来完成公共字段自动填充功能。 技术细节
在实现公共字段自动填充也就是在插入或者更新的时候为指定字段赋予指定的值使用它的好处就是可以统一对这些字段进行处理避免了重复代码。在上述的问题分析中我们提到有四个公共字段需要在新增/更新中进行赋值操作, 具体情况如下:
序号字段名含义数据类型操作类型1create_time创建时间datetimeinsert2create_user创建人idbigintinsert3update_time修改时间datetimeinsert、update4update_user修改人idbigintinsert、update 实现步骤
1). 自定义注解 AutoFill用于标识需要进行公共字段自动填充的方法
2). 自定义切面类 AutoFillAspect统一拦截加入了 AutoFill 注解的方法通过反射为公共字段赋值
3). 在 Mapper 的方法上加入 AutoFill 注解 若要实现上述步骤需掌握以下知识(之前课程内容都学过)
技术点枚举、注解、AOP、反射
枚举类:
package com.sky.enumeration;/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}自定义注解:
package com.sky.annotation;import com.sky.enumeration.OperationType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解用于标识某个方法需要进行功能字段自动填充处理*/
Target(ElementType.METHOD)
Retention(RetentionPolicy.RUNTIME)
public interface AutoFill {//数据库操作类型UPDATE INSERTOperationType value();
} 自定义切面类:
公共字段填充,我们选择在连接点(方法)执行前就进行,所以用Before将连接点上的AutoFill注解拦截下利用注解的.value()获取到注解中的内容(数据库操作类型)获取到该连接点的参数准备好填充的内容利用反射根据数据库操作类型进行填充 package com.sky.aspect;import com.sky.annotation.AutoFIll;
import com.sky.constant.AutoFillConstant;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.time.LocalDateTime;Aspect
Slf4j
Component
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(进行公共字段赋值);//获取当前被拦截方法上的注解AutoFIll autoFIll ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(AutoFIll.class);//MethodSignature signature (MethodSignature) joinPoint.getSignature();//方法签名对象//AutoFIll autoFill signature.getMethod().getAnnotation(AutoFIll.class);//获取数据库操作类型(INSERT,UPDATE)OperationType operationType autoFIll.value();//获取当前被拦截方法上的参数(实体对象)Object[] args joinPoint.getArgs();if (args null || args.length 0) {return;}Object entity args[0];//准备要填充的内容LocalDateTime now LocalDateTime.now();Long id 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, id);setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, id);} 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, id);} catch (Exception e) {e.printStackTrace();}}}
}AutoFIll(value OperationType.INSERT)void insert(Dish dish);
效果展示