SpringBoot之JdbcTemplate输出完整SQL日志

applicatio.yml开启日志功能

java 复制代码
jdbc-log:
  # 开启完整SQL日志输出功能
  enabled: true

logging:
  level:
  	# 切面类路径,日志级别为DEBUG,因为SpringBoot默认日志级别为INFO
    com.xxx.xxx.JdbcTemplateAspect: DEBUG

日志切面

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;

@Slf4j
@Aspect
@Component
@ConditionalOnProperty(prefix = "jdbc-log", value = "enabled", havingValue = "true")
public class JdbcTemplateAspect {
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	
	//执行切面前,输出完整SQL,防止执行SQL过程中报错,导致无法输出完整SQL。
    @Before(value = "execution(* org.springframework.jdbc.core.JdbcTemplate.*(..))")
    public void afterQuery(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        if (ArrayUtils.isNotEmpty(args) && args[0] instanceof String && args[2] instanceof Object[]) {
            String sql = ((String) args[0]).replaceAll("[\\s\\n\\t]+", " ");
            Object[] params = (Object[]) args[2];
            for (Object propertyValue : params) {
                String value;
                if (Objects.isNull(propertyValue)) {
                    value = "null";
                    sql = sql.replaceFirst("\\?", value);
                    continue;
                }
                if (propertyValue instanceof String) {
                    value = "'" + propertyValue + "'";
                } else if (propertyValue instanceof Date) {
                    value = "'" + DATE_TIME_FORMATTER.format(((Date) propertyValue).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()) + "'";
                } else if (propertyValue instanceof LocalDate) {
                    value = "'" + DATE_FORMATTER.format((LocalDate) propertyValue) + "'";
                } else if (propertyValue instanceof LocalDateTime) {
                    value = "'" + DATE_TIME_FORMATTER.format((LocalDateTime) propertyValue) + "'";
                } else {
                    value = propertyValue.toString();
                }
                sql = sql.replaceFirst("\\?", value);
            }
            log.debug("\033[32mexecute SQL:\n{}\033[0m", sql);
        }
    }
}

启动项目,调用某个JdbcTemplate类里面的方法就会输出完整SQL到控制台,如下内容

sql 复制代码
execute SQL:
select * from table where id=1
相关推荐
parafeeee1 天前
程序人生-Hello’s P2P
数据库·后端·asp.net
bug攻城狮1 天前
Spring Boot应用内存占用分析与优化
java·jvm·spring boot·后端
迪巴拉15251 天前
基于Vue与Spring Boot+Open Cv的智慧校园考勤系统
前端·vue.js·spring boot
今天你TLE了吗1 天前
JVM学习笔记:第八章——执行引擎
java·jvm·笔记·后端·学习
me8321 天前
【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程
java·spring boot·nginx
XPoet1 天前
AI 编程工程化:Rule——给你的 AI 员工立规矩
前端·后端·ai编程
韩立学长1 天前
基于Springboot校园志愿者服务平台77pz7812(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Java基基1 天前
Spring让Java慢了30倍,JIT、AOT等让Java比Python快13倍,比C慢17%
java·开发语言·后端·spring
qq_12498707531 天前
基于SpringBoot微信小程序的智能在线预约挂号系统(源码+论文+部署+安装)
spring boot·后端·微信小程序·毕业设计·计算机毕设·毕业设计源码
小马爱打代码1 天前
SpringBoot + 异地多活 + 消息回放:金融级数据一致性容灾架构设计与演练
spring boot·金融