aop记录日志操作

在对应方法上添加注解:

@OperationLog(operationType= OperationType.INSERT,operationBu="隐患",operationContent="新增隐患")

日志参数默认值设置:

public enum OperationType {
    UNKNOWN("unknown"),
    DELETE("delete"),
    SELECT("select"),
    UPDATE("update"),
    INSERT("insert");

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    OperationType(String s) {
        this.value = s;
    }
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
    //操作内容
    String operationContent() default "";

    //操作类型
    OperationType operationType() default OperationType.UNKNOWN;

    //操作业务模块
    String operationBu() default "";

}

记录日志

import com.alibaba.fastjson.JSON;
import com.zhjt.annotation.OperationLog;
import com.zhjt.security.UserUtil;
import lombok.Getter;
import lombok.Setter;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.UUID;

/**
 * @ClassName OpLog
 * @Description 日志切面类
 * @Author wang
 * @Date 2019/10/29 16:07
 **/
@Component
@Aspect
public class OpLog {
    @Getter
    @Setter
    @Value("${spring.datasource.url}")
    private String url;
    @Getter
    @Setter
    @Value("${spring.datasource.username}")
    private String user;
    @Getter
    @Setter
    @Value("${spring.datasource.password}")
    private String password;
    public OpLog(){
        System.out.println("-----日志初始化");
    }
    @Pointcut("@annotation(com.zhjt.annotation.OperationLog)")
    private void log() {
    }

    @Around("log()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        PreparedStatement pst = null;
        Connection conn = null;
        Object res = null;
        System.out.print("进入日志记录页面");
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        try {
            res =  joinPoint.proceed();
            return res;
        } finally {
            try {
                //获取到拦截的接口的方法名
//                String methodName = joinPoint.getSignature().getName();
                //被拦截的方法的参数名称数组
//                String[] parameterNames = signature.getParameterNames();
                //被拦截的方法的参数值对象数组,这里我们将传入的参数转为json字符串格式便于存入数据库
                //1.加载驱动程序
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                //2.获得数据库链接
                conn= DriverManager.getConnection(url, user, password);

                //方法执行完成后增加日志
                OperationLog annotation = signature.getMethod().getAnnotation(OperationLog.class);
                String content = annotation.operationContent();
                String type = annotation.operationType().getValue();
                String bu = annotation.operationBu();
                String uid = UserUtil.getCurrUserId();
                String id = UUID.randomUUID().toString();
                Object[] objects = joinPoint.getArgs();
                StringBuilder args = new StringBuilder("");
                //暂时只记录删除操作
                if("delete".equals(type)){
                    for (int i = 0; i < objects.length; i++) {
                        String s = JSON.toJSONString(objects[i]);
                        if (i == objects.length - 1){
                            args.append(s);
                        }else {
                            args.append(s).append(",");
                        }
                    }
                }
                String businessId = "";
                //记录修改
                if("update".equals(type)) {
                    if(bu.equals("菜单管理")) {
                        args.append(objects[0]);
                    }
                }
                String inSql = "insert into opreate_log (id,operate_man,operate_content,operate_type,operate_time,operate_bu,operate_opinions) values(?,?,?,?,GETDATE(),?,?)";
                pst = conn.prepareStatement(inSql);
                pst.setString(1,id);
                pst.setString(2,uid);
                pst.setString(3,content);
                pst.setString(4,type);
                pst.setString(5,bu);
                pst.setString(6,args.toString());
                pst.execute();
            }catch (Exception e){
                e.printStackTrace();
            }
            finally {
                pst.close();
                conn.close();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用AOP(面向切面编程)来记录批量插入操作AOP可以帮助您在不修改原始代码的情况下,通过在关键点织入横切关注点来实现日志记录。 首先,您需要创建一个切面,用于记录插入操作日志。在该切面中,您可以定义一个通知(Advice),在执行批量插入操作之前和之后执行。 以下是一个示例切面的代码: ```java import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class BatchInsertAspect { @Before("execution(* com.example.dao.BatchInsertDAO.insert(..))") public void beforeInsert(JoinPoint joinPoint) { System.out.println("开始批量插入操作..."); // 在这里可以记录日志或执行其他操作 } @After("execution(* com.example.dao.BatchInsertDAO.insert(..))") public void afterInsert(JoinPoint joinPoint) { System.out.println("批量插入操作完成。"); // 在这里可以记录日志或执行其他操作 } } ``` 在上述示例中,切面类被注解为`@Aspect`,并且使用`@Before`和`@After`注解定义了两个通知方法。`@Before`通知会在执行批量插入操作之前被调用,而`@After`通知会在执行批量插入操作之后被调用。您可以根据实际需求选择适合的通知类型。 请注意,上述示例假设您的批量插入操作在名为`BatchInsertDAO`的DAO类中。您需要根据您的实际情况修改切点表达式(Pointcut Expression)以匹配您的批量插入方法。 最后,确保将切面类纳入到Spring的组件扫描范围中,以便Spring能够自动检测并应用切面。 通过使用上述示例切面,您可以在批量插入操作之前和之后记录日志或执行其他操作。这样,您可以方便地对批量插入操作进行监控和追踪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值