技术派记录SQL执行日志
选中新版正文中的对应文字,然后点“定位到这里”。
再我们的实际工作过程中,会有很多的场景,是希望将我们的sql执行语句打印出来的,一般这种诉求可以怎么实现呢?
再技术派这个项目中给大家提供了两种sql日志打印的方式,给大家提供一些参考
实际上添加这篇文章主要是为了多数据源做的准备(比如这个sql到底使用的是哪个数据源)
MybaitPlus执行日志
因为技术派使用MybatisPlus作为ORM框架进行数据源的CURD,因此我们可以直接使用mybatis提供的日志输出
如开启控制台输出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
开启之后,表示形式如

从上面的日志输出也可以看出,包含了sql、参数以及返回结果,整体来看信息比较丰富了,基本上以日常问题排查的角度来看,足以满足
但是,当我们想针对执行日志做一些更自定义的操作,如格式化sql,计算执行耗时,sql执行信息统计、上报等,此时我们可以考虑下面这种基于拦截器的实现方式
自定义拦截器
1. Mybatis插件机制
在Mybatis中,插件机制提供了非常强大的扩展能力,在sql最终执行之前,提供了四个拦截点,支持不同场景的功能扩展
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
接下来我们再看一下技术派的sql日志记录
package com.github.paicoding.forum.core.dal;
import com.baomidou.mybatisplus.core.MybatisParameterHandler;
import com.github.paicoding.forum.core.util.DateUtil;
import com.zaxxer.hikari.pool.HikariProxyConnection;
import com.zaxxer.hikari.pool.HikariProxyPreparedStatement;
import io.github.classgraph.utils.ReflectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.springframework.util.CollectionUtils;
import java.sql.Date;
import java.sql.Statement;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
/**
* mybatis拦截器。输出sql执行情况
*
* @author YiHui
* @date 2023/5/01
*/
@Slf4j
@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}), @Signature(type = StatementHandler.class, method = "update", args = {Statement.class})})
public class SqlStateInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocati...未能定位到原文的划线
已加入星球,可直接知识星球授权登录
二哥编程星球目前包含:
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复