SpringBoot打印指定DAO层SQL

本文介绍如何配置MyBatis仅记录指定DAO的SQL执行日志,通过调整logging配置并设置log-impl为Slf4jImpl,实现精准的日志级别控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

使用日志框架时如何只打印某DAO执行的SQL

解决方案:

logging:
  level:
    org.activiti.process: debug # 改成你的mapper文件所在包路径
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl 
 

log-impl配置不要使用org.apache.ibatis.logging.stdout.StdOutImpl,使用Sl4jImpl可以与日志框架配合输出到文件而不是仅控制台

<think>我们被要求展示Spring Boot项目中接口调用的SQL语句和参数日志,用于调试。这通常通过配置日志级别来实现。 在Spring Boot中,我们可以通过设置日志级别来显示SQL语句和参数。具体来说: 1. 对于使用Hibernate(JPA)的情况,可以设置`org.hibernate.SQL`和`org.hibernate.type.descriptor.sql`的日志级别。 2. 对于MyBatis,我们可以设置mapper接口的日志级别,或者使用MyBatis自带的日志实现。 3. 另外,Spring Boot的JDBC模块也提供了日志配置,可以显示执行的SQL。 但是,更通用的做法是配置数据源代理或使用p6spy这样的第三方库来打印完整的SQL(包括参数)。不过,在开发环境中,最简单的方式是使用日志配置。 根据引用[2]中给出的数据库连接配置,我们可以假设用户使用的是Spring Boot默认的日志系统(比如Logback或Log4j2)。 下面分别介绍几种常见的方式: 方式一:通过application.properties/application.yml配置(适用于Hibernate/JPA和MyBatis) 对于JPA(Hibernate): logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 对于MyBatis: logging.level.[你的Mapper接口所在的包]=DEBUG 方式二:使用Log4j2或Logback的配置文件进行更详细的配置。 但是,用户可能希望看到的是完整的SQL语句(即带参数的),而不仅仅是?占位符。对于MyBatis,我们可以通过配置日志实现为STDOUT_LOGGING(不推荐,因为会输出到控制台且格式固定)或者使用Log4j2等。 在Spring Boot中,如果我们使用默认的Logback,可以通过以下配置来显示带参数的SQL: 对于MyBatis,可以设置: logging.level.com.example.mapper=TRACE # 将com.example.mapper替换为你的Mapper接口所在包 注意:MyBatis的日志输出级别需要TRACE才能打印出参数,DEBUG只能打印SQL语句(带?)。 然而,有时我们可能使用其他的数据源,或者希望更通用的解决方案。Spring Boot提供了以下配置来显示SQL(但可能不带参数): spring.jpa.show-sql=true # 仅适用于JPA,且输出不带参数 为了显示带参数的SQL,我们可以使用第三方库,如p6spy,但这里我们主要介绍通过日志配置的方式。 另外,对于JDBC,我们可以通过配置数据源代理来拦截SQL,例如使用Spring提供的DataSource bean包装。下面是一个使用DataSourceProxy和log4jdbc的例子,但需要引入额外的依赖。 考虑到简单性和通用性,我们推荐在开发环境中使用日志级别配置。 具体步骤: 1. 在application.properties中配置日志级别(以MyBatis为例): # 设置MyBatis Mapper接口所在包的日志级别为TRACE logging.level.com.example.demo.mapper=TRACE # 如果你使用的是JPA(Hibernate),则配置: # logging.level.org.hibernate.SQL=DEBUG # logging.level.org.hibernate.type=TRACE # 这个会打印参数 2. 确保你的日志框架配置了控制台输出(Spring Boot默认就有)。 3. 如果你使用的是MyBatis,并且想要更美观的SQL日志输出,可以考虑使用MyBatis Plus(如果项目使用了它),它自带了SQL日志打印功能,但需要配置插件。 但是,根据引用[1]中提到的UpdateWrapper,用户可能使用的是MyBatis Plus。因此,我们也可以利用MyBatis Plus的SQL打印功能。 MyBatis Plus配置SQL打印(性能分析插件,在3.2.0版本后被移除了,所以不推荐)。在3.4.1版本后,可以使用内置的P6spy插件,或者使用日志配置。 实际上,MyBatis Plus的日志打印也是基于MyBatis的日志机制,所以配置日志级别即可。 总结:最简单的方式就是通过配置日志级别。 下面我们给出一个示例配置(application.properties): # 设置MyBatis Mapper包的日志级别为TRACE logging.level.com.example.mapper=TRACE 注意:将com.example.mapper替换为你的Mapper接口所在的包。 对于JPA(Hibernate): logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql=TRACE 这样配置后,执行SQL时就会在控制台打印出带参数的SQL语句。 另外,如果你使用的是Spring Data JPA,还可以通过配置以下属性来格式化SQLspring.jpa.properties.hibernate.format_sql=true 这样打印SQL会格式化,更易读。 但是,请注意:在生产环境中不要开启这些日志,因为会带来性能和安全问题(暴露参数)。 如果用户使用的是MyBatis Plus,并且想要更详细的日志(比如执行时间等),可以考虑使用MyBatis Plus的性能分析插件(在3.2.0之前)或者使用p6spy(需要额外依赖)。 由于我们不知道用户具体使用的是JPA还是MyBatis(或MyBatis Plus),所以我们提供两种配置。 另外,引用[3]和[4]是关于接口安全和事务的,与本问题关系不大,但提醒我们在生产环境要谨慎开启日志。 因此,我们给出一个通用的配置方法,并提醒用户注意生产环境的安全性。 步骤总结: 1. 确定你使用的持久框架(JPA/Hibernate 或 MyBatis/MyBatis Plus)。 2. 在application.properties中配置相应的日志级别。 3. 运行应用,调用接口,观察控制台输出。 示例配置(application.properties): # 对于MyBatis logging.level.com.example.dao=TRACE # 对于JPA logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE spring.jpa.properties.hibernate.format_sql=true 注意:如果同时配置了多个,可能会重复打印,所以根据实际使用选择。 如果用户使用的是MyBatis Plus,并且配置了日志级别后没有输出,可以检查是否在MyBatis配置中指定了日志实现(比如Slf4j),通常Spring Boot默认使用Slf4j+Logback,所以配置日志级别即可。 另外,如果用户使用log4j2,则需要在类路径下提供log4j2.xml或log4j2-spring.xml,并在其中配置相应包的日志级别。 最后,如果用户希望看到JDBC面的SQL(包括参数),可以考虑使用log4jdbc。但需要引入log4jdbc的依赖,并替换数据源为log4jdbc代理的数据源。 不过,鉴于问题只要求简单的方法,我们推荐使用日志级别配置。 因此,回答如下:</think>在 Spring Boot 项目中查看接口调用的 SQL 语句和参数日志,可以通过以下配置实现(按推荐顺序排序): ### 方法一:配置日志级别(推荐) **适用于 JPA/Hibernate 或 MyBatis** ```properties # application.properties # 通用配置(显示SQL执行过程) logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # 显示参数值 # MyBatis专用(显示带参数的SQL) logging.level.com.yourpackage.mapper=TRACE # 替换为你的Mapper包路径 # JDBC连接池监控(可选) logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE ``` ### 方法二:使用 P6Spy(完整SQL记录) 1. 添加依赖 ```xml <!-- pom.xml --> <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version> </dependency> ``` 2. 修改数据源配置 ```properties # 原配置 spring.datasource.url=jdbc:mysql:///test05 spring.datasource.username=root spring.datasource.password=123 # 改为P6Spy代理 spring.datasource.url=jdbc:p6spy:mysql:///test05 spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver ``` 3. 创建 `spy.properties` ```properties # src/main/resources/spy.properties module.log=com.p6spy.engine.logging.P6LogFactory appender=com.p6spy.engine.spy.appender.Slf4JLogger logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat customLogMessageFormat=%(executionTime)ms | SQL: %(sql) | Params: %(parameters) ``` ### 方法三:MyBatis Plus 专用配置 ```yaml # application.yml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印完整SQL sql-session-factory: global-config: db-config: sql-show: true # 显示SQL ``` ### 效果示例 启用后日志将显示: ```plaintext 2023-08-01 10:00:00 DEBUG 12345 --- [nio-8080-exec-1] o.h.SQL: select user0_.id, user0_.name from user user0_ where user0_.age>? 2023-08-01 10:00:00 TRACE 12345 --- [nio-8080-exec-1] o.h.t.d.s.BasicBinder: binding parameter [1] as [INTEGER] - [25] ``` ### 注意事项 1. **生产环境禁用**:这些日志会暴露敏感信息和降低性能[^3] 2. **事务问题**:自调用方法可能无法捕获SQL日志(需通过代理对象调用)[^4] 3. **参数格式化**:`TRACE` 级别才能显示具体参数值 4. **连接池兼容**:Druid 需额外配置 `filters: stat,wall,log4j` > 配置后重启应用,调用接口即可在控制台查看完整SQL日志。建议在 `application-dev.properties` 中配置,避免影响生产环境[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值