MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异

发布于:2025-04-23 ⋅ 阅读:(71) ⋅ 点赞:(0)

以下是 MyBatisMyBatis-PlusSpring 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> <!-- Spring Boot 2.3.2 适配版本 -->
</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 需自定义拦截器或日志格式 手动拼接 PreparingParameters 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(); // 自动输出完整 SQL(参数替换后)
    }
}

6. 总结建议

场景 推荐框架 理由
基础持久层操作 MyBatis 配置灵活,适合对 SQL 细节有严格控制的需求
快速开发 & 性能优化 MyBatis-Plus 提供大量便捷功能(如分页、代码生成),日志输出更友好(自动拼接参数)
完整 SQL 输出需求 MyBatis-Plus 默认支持参数替换后的完整 SQL,无需额外开发

7. 注意事项

  1. MyBatis 的完整 SQL 输出
    需通过自定义拦截器捕获 BoundSql 对象,手动拼接参数值。
  2. MyBatis-Plus 的性能
    日志拦截器可能影响性能,建议仅在开发/测试环境启用 DEBUG 级别日志。
  3. 依赖冲突
    MyBatis-Plus 已包含 MyBatis,避免重复引入 MyBatis 依赖。

如需进一步优化或解决特定问题(如日志格式、参数过滤),可提供具体需求!


网站公告

今日签到

点亮在社区的每一天
去签到