在 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。