当前位置: 首页 > 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。

http://www.xdnf.cn/news/365617.html

相关文章:

  • htmlUnit和Selenium的区别以及使用BrowserMobProxy捕获网络请求
  • RoPE长度外推:外插内插
  • ResNet详解
  • 企业名录搜索软件靠谱吗 企业名录搜索软件怎么使用
  • LSTM的简单模型
  • git做commit信息时的校验
  • C++ —— 可变参数
  • D720201 PCIE 转USB HUB
  • 值拷贝、浅拷贝和深拷贝
  • 利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组|文献速递-深度学习医疗AI最新文献
  • DAY04:Vue.js 指令与事件处理深度解析之从基础到实战
  • 弹窗表单的使用,基于element-ui二次封装
  • 十三、基于大模型的在线搜索平台——整合function calling流程
  • 萤石无插件取流巡检组件,便捷支持多屏预览与回放
  • MCP(Model Context Protocol,模型上下文协议)
  • tcpdump 的用法
  • [sklearn] 特征工程
  • LeRobot 项目部署运行逻辑(五)——intelrealsense.py/configs.py
  • 【PostgreSQL】不开启归档模式,是否会影响主从库备份?
  • OrangePi Zero 3学习笔记(Android篇)4 - eudev编译(获取libudev.so)
  • 边界网关协议 - BGP【高级】
  • 蓝绿激光对潜通信介绍
  • 【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门
  • 画家沈燕的山水实验:在传统皴法里植入时代密码
  • mysql性能提升方法大汇总
  • 【kafla扫盲】FROM GPT
  • 基于51单片机步进电机控制—9个等级
  • async/await 原理揭秘
  • Windows11下通过Docker安装Redis
  • USB学习【4】协议层数据格式