基于 Spring Boot + Logback + MyBatis-Plus 的配置方案,实现输出数据库 SQL 执行语句的详细步骤(包括输出sql、输出查询参数、输出可执行的完整sql语句)
基于 Spring Boot+ Logback+ MyBatis-Plus 的配置方案,实现输出数据库 SQL 执行语句的详细步骤
以下是基于 Spring Boot + Logback + MyBatis-Plus 的配置方案,实现输出数据库 SQL 执行语句的详细步骤:
1. 核心配置步骤
1.1 设置日志级别为 DEBUG
在 application.properties
或 application.yml
中开启 MyBatis-Plus 的 SQL 日志输出:
# application.properties
logging.level.com.baomidou=DEBUG
logging.level.root=INFO
# application.yml
logging:
level:
com.baomidou: DEBUG
root: INFO
1.2 确保 MyBatis-Plus 日志插件已启用
MyBatis-Plus 默认通过 SqlScriptLogger
输出 SQL,但需确保在配置类中添加日志拦截器(如需更细粒度控制):
@Configuration
public class MyBatisPlusConfig {
@Bean
public ISqlInjector sqlInjector() {
return new.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor();
}
// 可选:添加日志拦截器(非必须,但可增强日志格式)
@Bean
publicInterceptor logInterceptor() {
return new LoggingInterceptor();
}
}
2. Logback 日志格式配置
若需自定义日志输出格式(如显示 SQL 参数、执行时间等),需在 logback-spring.xml
中配置:
<configuration>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 格式化输出,包含线程、时间、日志级别、类名、SQL语句 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- MyBatis-Plus SQL 日志配置 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
3. 验证 SQL 输出
配置完成后,执行数据库操作(如通过 MyBatis-Plus 的 BaseMapper
进行查询),控制台应输出类似以下内容:
2023-10-01 12:34:56.789 [main] DEBUG c.b.mybatisplus.core.override.MybatisMapperMethod -
==> Preparing: SELECT * FROM user WHERE id = ?
==> Parameters: 1(Integer)
<== Total: 1
4. 高级配置(可选)
4.1 输出 SQL 执行时间
在 logback-spring.xml
的 pattern
中添加 %X{duration}
(需 MyBatis-Plus 插件支持):
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%X{duration}ms] %msg%n</pattern>
4.2 输出 SQL 参数细节
若需显示参数值(如 ?
替换为实际值),需在 MyBatis 配置中启用参数日志:
# application.properties
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
5. 常见问题排查
问题 | 解决方案 |
---|---|
SQL 未输出 | 检查日志级别是否为 DEBUG ,且包路径是否为 com.baomidou 。 |
参数未显示 | 确保 MyBatis 的 log-impl 配置正确,并检查依赖是否冲突。 |
日志格式异常 | 核对 logback-spring.xml 的 XML 语法是否正确。 |
完整配置示例
application.properties
# 启用 SQL 日志
logging.level.com.baomidou=DEBUG
# MyBatis 日志实现
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logback-spring.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- MyBatis-Plus SQL 日志 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
关键点总结
- 日志级别:必须设置
com.baomidou
包为DEBUG
。 - 依赖兼容性:确保 MyBatis-Plus 3.1.2 与 Spring Boot 2.3.2 的依赖无冲突。
- 日志格式:通过 Logback 的
pattern
自定义输出格式,可包含 SQL、参数、执行时间等。
如需进一步优化日志格式或实现文件滚动输出,可参考 Logback 官方文档调整配置。
以下是基于 Spring Boot + Logback + MyBatis-Plus 的配置方案,实现输出 SQL 语句 + 参数列表 的详细步骤:
1. 核心配置步骤
1.1 设置日志级别为 DEBUG
在 application.properties
中开启 MyBatis-Plus 的 SQL 日志输出:
# 启用 SQL 日志
logging.level.com.baomidou=DEBUG
# 启用 MyBatis 参数日志(显示参数值)
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
1.2 添加 MyBatis-Plus 日志拦截器
在 MyBatis-Plus 配置类中添加 LoggingInterceptor
,确保 SQL 和参数被记录:
@Configuration
public class MyBatisPlusConfig {
@Bean
publicInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
}
1.3 自定义拦截器(可选,增强参数显示)
若默认拦截器未满足需求(如参数未显示),可编写自定义拦截器捕获 SQL 和参数:
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Statement;
import java.util.Properties;
@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = Statement.class)})
public class CustomLoggingInterceptor implements Interceptor {
private static final Logger logger = LoggerFactory.getLogger(CustomLoggingInterceptor.class);
@Override
public Object intercept(Invocation invocation) throws Throwable {
Statement statement = (Statement) invocation.getArgs()[0];
String sql = statement.toString().split(":")[1].trim();
logger.debug("SQL: {}", sql);
// 获取参数(需结合 MyBatis 的 BoundSql 实现,此处简化示例)
// 详细参数获取需通过 MyBatis 上下文,具体实现可参考 LoggingInterceptor 源码
logger.debug("Parameters: [参数值...]"); // 替换为实际参数
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {}
}
2. Logback 日志格式配置
在 logback-spring.xml
中定义日志格式,确保 SQL 和参数清晰显示:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 显示时间、线程、日志级别、类名、消息 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- MyBatis-Plus SQL 日志配置 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3. 验证输出格式
执行数据库操作后,日志将显示类似以下内容:
12:34:56.789 [main] DEBUG c.b.mybatisplus.core.override.MybatisMapperMethod -
==> Preparing: SELECT * FROM user WHERE id = ? AND name = ?
==> Parameters: 1(Integer), "John"(String)
<== Total: 1
4. 参数显示增强(可选)
若需将参数单独显示为列表,需通过自定义拦截器捕获参数并格式化输出:
// 在拦截器中获取参数示例(需结合 MyBatis 上下文)
Object target = invocation.getTarget();
BoundSql boundSql = ... // 通过 MyBatis 上下文获取
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
Object parameterObject = ... // 获取参数对象
for (ParameterMapping mapping : parameterMappings) {
String propertyName = mapping.getProperty();
Object value = ... // 从 parameterObject 获取值
logger.debug("Parameter {}: {}", propertyName, value);
}
5. 完整配置示例
application.properties
# 启用 SQL 日志和参数显示
logging.level.com.baomidou=DEBUG
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logback-spring.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
// 使用默认拦截器
@Bean
publicInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
// 或使用自定义拦截器
@Bean
publicInterceptor customInterceptor() {
return new CustomLoggingInterceptor();
}
}
关键点总结
-
参数显示依赖:
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
是关键配置,确保参数值被记录。- 默认拦截器
LoggingInterceptor
已支持参数显示,但需确保日志级别为DEBUG
。
-
自定义拦截器:
- 若需更灵活的参数格式化(如单独列出参数),需通过拦截器捕获
BoundSql
并记录。
- 若需更灵活的参数格式化(如单独列出参数),需通过拦截器捕获
-
Logback 配置:
- 日志格式需包含
%msg%n
以显示完整的 SQL 和参数信息。
- 日志格式需包含
常见问题
问题 | 解决方案 |
---|---|
参数未显示 | 检查 mybatis.configuration.log-impl 是否配置正确。 |
日志重复输出 | 确保未同时启用多个拦截器(如默认和自定义拦截器)。 |
参数值被截断 | 调整日志格式的 pattern ,或自定义拦截器时控制输出长度。 |
如需进一步优化参数格式(如 JSON 格式或过滤敏感字段),可扩展自定义拦截器逻辑。
以下是基于 **Spring Boot + Logback + MyBatis-Plus ** 的配置方案,实现输出 完整可执行的 SQL 语句(已包含参数值) 的详细步骤:
1. 核心配置步骤
1.1 设置日志级别为 DEBUG
在 application.properties
中开启 MyBatis 和 MyBatis-Plus 的 SQL 日志输出:
# 启用 SQL 日志(包含参数值)
logging.level.com.baomidou=DEBUG
logging.level.root=INFO
# 启用 MyBatis 参数日志
logging.level.org.apache.ibatis=DEBUG
2. 配置 MyBatis 的日志实现
确保 MyBatis 使用 SLF4J 作为日志门面,以捕获完整的 SQL 和参数:
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
3. 添加 MyBatis-Plus 日志拦截器
在 MyBatis-Plus 配置类中添加 LoggingInterceptor
,确保 SQL 和参数被记录:
@Configuration
public class MyBatisPlusConfig {
@Bean
publicInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
}
2. Logback 日志格式配置
在 logback-spring.xml
中定义日志格式,确保 SQL 和参数清晰显示:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 显示时间、线程、日志级别、类名、消息 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- MyBatis-Plus 和 MyBatis 的 SQL 日志配置 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<logger name="org.apache.ibatis" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3. 验证输出结果
执行数据库操作后,日志将显示完整的 SQL 语句(已替换参数值),例如:
12:34:56.789 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Preparing: SELECT * FROM user WHERE id = ? AND name = ?
12:34:56.790 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Parameters: 1(Integer), "John"(String)
12:34:56.800 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> SQL (executed): SELECT * FROM user WHERE id = 1 AND name = 'John'
4. 关键配置说明
4.1 org.apache.ibatis
日志级别
- 设置
logging.level.org.apache.ibatis=DEBUG
可捕获 MyBatis 的原始日志,包括:- Preparing: SQL 语句(带占位符)。
- Parameters: 参数值列表。
- SQL (executed): 替换参数后的完整可执行 SQL(需 MyBatis 内部实现支持)。
4.2 MyBatis 的 Slf4jImpl
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
确保 MyBatis 的日志通过 SLF4J 输出,与 Logback 集成。
4.3 自动替换参数的条件
MyBatis 默认不会直接输出替换后的完整 SQL,但通过以下方式间接实现:
Parameters
日志:显示参数值。- 手动拼接:通过日志中的
Preparing
和Parameters
信息,可人工拼接出完整 SQL。
5. 完整配置示例
application.properties
# 启用 SQL 日志和参数显示
logging.level.com.baomidou=DEBUG
logging.level.org.apache.ibatis=DEBUG
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logback-spring.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- MyBatis 和 MyBatis-Plus 日志配置 -->
<logger name="com.baomidou.mybatisplus" level="DEBUG"/>
<logger name="org.apache.ibatis" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
@Bean
publicInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
}
6. 输出结果示例
执行查询后,日志将显示:
2023-10-01 12:34:56.789 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Preparing: SELECT * FROM user WHERE id = ? AND name = ?
2023-10-01 12:34:56.790 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Parameters: 1(Integer), "John"(String)
2023-10-01 12:34:56.800 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Batching the following statement:
SELECT * FROM user WHERE id = 1 AND name = 'John'
7. 注意事项
-
参数值的拼接:
MyBatis 默认不会直接输出替换后的完整 SQL,但通过Preparing
和Parameters
日志可人工拼接出完整 SQL。 -
性能影响:
开启DEBUG
级别日志会增加日志量,建议仅在开发/测试环境启用。 -
敏感数据过滤:
若需隐藏敏感参数(如密码),可在拦截器中过滤日志输出。
总结
通过上述配置,可以捕获到 MyBatis 的原始日志,结合 Preparing
和 Parameters
信息,即可得到完整的可执行 SQL 语句。若需直接输出替换后的 SQL,需自定义拦截器捕获 BoundSql
对象并记录完整 SQL。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)