当前位置: 首页 > news >正文

在 MyBatis 中实现控制台输出 SQL 参数

在 MyBatis 中实现控制台输出 SQL 参数,可通过以下方案实现:

# 一、使用 MyBatis-Plus 的 SqlLogInterceptor(推荐)

‌适用场景‌:项目已集成 MyBatis-Plus(3.5.3+版本)
‌配置步骤‌:

‌1、添加拦截器‌:

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new SqlLogInterceptor());return interceptor;}
}

‌2、配置日志输出‌(application.yml):

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

此方案可直接输出完整 SQL(参数替换为真实值)。

二、通过 log4jdbc 工具输出完整 SQL

‌适用场景‌:需独立查看带参数的 SQL,不依赖 MyBatis-Plus
‌步骤‌:

1‌、添加依赖‌:

<dependency><groupId>org.bgee.log4jdbc-log4j2</groupId><artifactId>log4jdbc-log4j2-jdbc4.1</artifactId><version>1.16</version>
</dependency>

‌2、修改 JDBC 驱动配置‌:

# 原 JDBC URL 前追加 "jdbc:log4jdbc:"
spring:datasource:url: jdbc:log4jdbc:mysql://localhost:3306/dbnamedriver-class-name: net.sf.log4jdbc.DriverSpy

‌3、配置日志级别‌(logback.xml):

<logger name="jdbc.sqlonly" level="DEBUG"/>  <!-- 仅输出 SQL -->
<logger name="jdbc.sqltiming" level="INFO"/> <!-- 输出 SQL 及执行时间 -->

此工具支持参数替换及 SQL 格式化。

三、自定义拦截器输出参数(原始 MyBatis)

‌适用场景‌:需定制化输出格式
‌实现步骤‌:

‌1、创建拦截器类‌:

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class SqlParamInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object parameter = invocation.getArgs()[1];// 解析参数并拼接 SQLSystem.out.println("Params: " + parameter);return invocation.proceed();}
}

2‌、注册拦截器‌(mybatis-config.xml):

<plugins><plugin interceptor="com.example.interceptor.SqlParamInterceptor"/>
</plugins>

此方式需自行解析参数绑定逻辑,灵活性高但实现复杂。

四、注意事项

1‌、性能影响‌

输出完整 SQL 会增加日志量,生产环境建议关闭 DEBUG 级别日志。

2、参数敏感信息‌

若 SQL 含敏感参数(如密码),需过滤或脱敏处理。

3‌、IDE 工具支持‌

IDEA 可通过安装插件(如 MyBatis Log Plugin)直接查看参数替换后的 SQL。

相关文章:

  • java学习笔记
  • AI客服问答自动生成文章(基于deepseek实现)
  • ABB电机保护单元通过Profibus DP主站转Modbus TCP网关实现上位机通讯
  • Vulnhub Lazysysadmin靶机攻击实战(一)
  • 硬链接与软连接
  • 如何从极狐GitLab 容器镜像库中删除容器镜像?
  • Bitcoin跨链协议Clementine的技术解析:重构DeFi生态的信任边界
  • 自然语言处理-词性标注的基本概念
  • requests库
  • Edwards爱德华STP泵软件用于操作和监控涡轮分子泵
  • RabbitMQ-运维
  • 单调栈所有模版型题目(1)
  • 使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据
  • vue3 ts 写一个滑动选择的日期选择器组件
  • 值拷贝、浅拷贝和深拷贝
  • 一、每日Github软件分享----QuickGo外链直达工具​
  • LeetCode面试题 17.21 直方图的水量
  • ABP vNext + EF Core 实战性能调优指南
  • 浏览器自动化与网络爬虫实战:工具对比与选型指南
  • Liunx ContOS7 安装部署 Docker
  • 时隔14个月北京怀柔区重启供地,北京建工以3.59亿元摘得
  • 总奖池超百万!第五届七猫现实题材征文大赛颁奖在即
  • 泽连斯基称与特朗普通话讨论停火事宜
  • 75岁亚当·费舍尔坐镇,再现80分钟马勒《第九交响曲》
  • 北上广深均宣布下调个人住房公积金贷款利率
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世