以下是 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 依賴。
如需進一步優化或解決特定問題(如日志格式、參數過濾),可提供具體需求!