以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异:
1. MyBatis 和 MyBatis-Plus 核心对比
特性 MyBatis MyBatis-Plus 定位 基础持久层框架 MyBatis 的增强版,提供代码生成、自动填充等 依赖复杂度 需手动配置数据源、SqlSessionFactory 通过 Starter 自动配置,简化配置 SQL 日志输出 需手动配置日志级别和拦截器 内置 LoggingInterceptor
自动输出 SQL 参数绑定显示 需依赖日志框架(如 SLF4J) 直接输出参数值,无需额外配置 性能优化 依赖拦截器或自定义实现 内置性能增强(如分页、批量操作)
2. Spring Boot 集成配置
2.1 MyBatis 配置
2.1.1 依赖引入
< dependency> < groupId> org.mybatis.spring.boot</ groupId> < artifactId> mybatis-spring-boot-starter</ artifactId> < version> 2.1.4</ version>
</ dependency>
< dependency> < groupId> org.springframework.boot</ groupId> < artifactId> spring-boot-starter-web</ artifactId>
</ dependency>
2.1.2 核心配置(application.properties
)
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl # 日志实现
2.1.3 日志输出配置
# 启用 SQL 日志
logging.level.org.apache.ibatis=DEBUG
2.1.4 SQL 输出示例
DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Preparing: SELECT * FROM user WHERE id = ?
DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler -
==> Parameters: 1(Integer)
2.2 MyBatis-Plus 配置
2.2.1 依赖引入
< dependency> < groupId> com.baomidou</ groupId> < artifactId> mybatis-plus-boot-starter</ artifactId> < version> 3.1.2</ version>
</ dependency>
< dependency> < groupId> org.springframework.boot</ groupId> < artifactId> spring-boot-starter-web</ artifactId>
</ dependency>
2.2.2 核心配置(application.properties
)
# 数据源配置(自动继承 Spring Boot 数据源)
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis-Plus 配置
mybatis-plus.configuration.map-underscore-to-camel-case=true
2.2.3 日志输出配置
# 启用 SQL 日志
logging.level.com.baomidou=DEBUG
2.2.4 SQL 输出示例
DEBUG com.baomidou.mybatisplus.core.override.MybatisMapperMethod -
==> Preparing: SELECT * FROM user WHERE id = ?
DEBUG com.baomidou.mybatisplus.core.override.MybatisMapperMethod -
==> Parameters: 1(Integer)
3. SQL 日志输出对比
3.1 输出 SQL 语句
框架 配置方式 输出内容 MyBatis logging.level.org.apache.ibatis=DEBUG
SQL 语句(带占位符 ?
) MyBatis-Plus logging.level.com.baomidou=DEBUG
SQL 语句(带占位符 ?
)
3.2 输出参数值列表
框架 配置方式 输出内容 MyBatis 需配置 mybatis.configuration.log-impl
Parameters: 1(Integer)
MyBatis-Plus 默认支持 Parameters: 1(Integer)
3.3 输出完整可执行的 SQL(参数替换后)
框架 配置方式 实现方式 输出内容 MyBatis 需自定义拦截器或日志格式 手动拼接 Preparing
和 Parameters
SELECT * FROM user WHERE id = 1
MyBatis-Plus 无需额外配置 内置 LoggingInterceptor
自动拼接 ==> SQL (executed): SELECT * FROM user WHERE id = 1
4. 完整配置对比表格
配置项 MyBatis MyBatis-Plus 依赖 mybatis-spring-boot-starter
mybatis-plus-boot-starter
日志框架配置 mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
无需配置,默认集成 SLF4J SQL 日志级别 logging.level.org.apache.ibatis=DEBUG
logging.level.com.baomidou=DEBUG
参数值显示 需配置 log-impl
依赖日志框架 默认支持,无需额外配置 完整 SQL 输出 需自定义拦截器或日志格式拼接参数值 内置 LoggingInterceptor
自动输出完整 SQL(如 ==> SQL (executed)
) 性能优化功能 无 分页、批量操作、自动填充、代码生成等 配置复杂度 较高(需手动配置数据源、拦截器) 低(Starter 自动配置,依赖少)
5. 关键配置代码示例
5.1 MyBatis 输出完整 SQL(需自定义拦截器)
@Intercepts ( { @Signature ( type = StatementHandler . class , method = "prepare" , args = { Connection . class , Integer . class } ) } )
public class FullSqlInterceptor implements Interceptor { @Override public Object intercept ( Invocation invocation) throws Throwable { StatementHandler handler = ( StatementHandler ) invocation. getTarget ( ) ; MetaObject metaObject = SystemMetaObject . forObject ( handler) ; MappedStatement ms = ( MappedStatement ) metaObject. getValue ( "delegate.mappedStatement" ) ; BoundSql boundSql = handler. getBoundSql ( ) ; String sql = boundSql. getSql ( ) . replaceAll ( "[\\s]+" , " " ) ; Object parameterObject = boundSql. getParameterObject ( ) ; logger. debug ( "Full SQL: {} | Parameters: {}" , sql, parameterObject) ; return invocation. proceed ( ) ; }
}
5.2 MyBatis-Plus 输出完整 SQL
@Configuration
public class MyBatisPlusConfig { @Bean publicInterceptor loggingInterceptor ( ) { return new LoggingInterceptor ( ) ; }
}
6. 总结建议
场景 推荐框架 理由 基础持久层操作 MyBatis 配置灵活,适合对 SQL 细节有严格控制的需求 快速开发 & 性能优化 MyBatis-Plus 提供大量便捷功能(如分页、代码生成),日志输出更友好(自动拼接参数) 完整 SQL 输出需求 MyBatis-Plus 默认支持参数替换后的完整 SQL,无需额外开发
7. 注意事项
MyBatis 的完整 SQL 输出 : 需通过自定义拦截器捕获 BoundSql
对象,手动拼接参数值。MyBatis-Plus 的性能 : 日志拦截器可能影响性能,建议仅在开发/测试环境启用 DEBUG
级别日志。依赖冲突 : MyBatis-Plus 已包含 MyBatis,避免重复引入 MyBatis 依赖。
如需进一步优化或解决特定问题(如日志格式、参数过滤),可提供具体需求!