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