打开网站弹出一张图片 怎么做,乐清市网站建设服务,网站建设与管理教学方案,简单asp网站问题分析 总会有些公共字段#xff0c;例如创建时间和创建人 实现思路 对mapper定义注解#xff0c;使用切面思想来判断是不是更新和新增操作对于指定的操作来更新公共字段 自定义操作类型 package com.sky.enumeration;/*** 数据库操作类型*/
public enum OperationType {/*…问题分析 总会有些公共字段例如创建时间和创建人 实现思路 对mapper定义注解使用切面思想来判断是不是更新和新增操作对于指定的操作来更新公共字段 自定义操作类型 package com.sky.enumeration;/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}自定义注解AutoFill 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 {OperationType value();
}
自定义切面 定义切点获取当前的mapper方法的具体操作类型获取当前的mapper方法的参数 实体对象entity获取要填充的数据根据操作类型进行填充 package com.sky.aspect;import cn.hutool.core.util.ObjectUtil;
import com.sky.annotation.AutoFill;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import com.sky.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
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.time.LocalDateTime;import static com.sky.constant.AutoFillConstant.*;
import static com.sky.constant.MessageConstant.AUTO_FILL_FAILED;/*** 自动填充切面*/
Aspect
Component
Slf4j
public class AutoFillAspect {// 切入点// mapper包下的所有方法 所有的参数类型Pointcut(execution(* com.sky.mapper..*.*(..)) annotation(com.sky.annotation.AutoFill))public void autoFillPointCut() {}// 前置通知 在方法执行之前执行// 进行自动填充Before(autoFillPointCut())public void before(JoinPoint joinPoint) {log.info(自动填充切面执行);// 获取当前的mapper方法的具体操作类型MethodSignature methodSignature (MethodSignature)joinPoint.getSignature();OperationType operationType methodSignature.getMethod().getAnnotation(AutoFill.class).value();// 获取当前的mapper方法的参数 实体对象entityObject[] args joinPoint.getArgs();//非空判断if(ObjectUtil.isEmpty(args)) return;// 获取实体对象Object entity args[0];// 获取要填充的数据// 获取当前登录用户的信息Long currentUserId BaseContext.getCurrentId();// 获取当前时间LocalDateTime now LocalDateTime.now();// 根据操作类型进行填充switch (operationType) {case INSERT:// 插入操作try {entity.getClass().getMethod(SET_CREATE_USER, Long.class).invoke(entity, currentUserId);entity.getClass().getMethod(SET_UPDATE_USER, Long.class).invoke(entity, currentUserId);entity.getClass().getMethod(SET_CREATE_TIME, LocalDateTime.class).invoke(entity, now);entity.getClass().getMethod(SET_UPDATE_TIME, LocalDateTime.class).invoke(entity, now);} catch (Exception e) {log.error(AUTO_FILL_FAILED, e);throw new BaseException(AUTO_FILL_FAILED);}break;case UPDATE:// 更新操作try {entity.getClass().getMethod(SET_UPDATE_USER, Long.class).invoke(entity, currentUserId);entity.getClass().getMethod(SET_UPDATE_TIME, LocalDateTime.class).invoke(entity, now);} catch (Exception e) {log.error(AUTO_FILL_FAILED, e);throw new BaseException(AUTO_FILL_FAILED);}break;default:break;}}
}
使用 AutoFill(OperationType.UPDATE)void update(Category category);AutoFill(OperationType.INSERT)Insert(insert into category(type, name, sort, status, create_time, update_time, create_user, update_user) VALUES (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser}))void insert(Category category);