MyBatis-Plus(MP)本身是 MyBatis 的增强工具,不包含数据源实现。在生产环境中,我们通常会将 MP 与高性能的第三方数据库连接池(如 Druid 或 HikariCP)集成,以提升数据库访问性能、监控能力与稳定性。

一、核心概念

1. 什么是数据源(DataSource)?

  • 数据源是应用程序与数据库之间的桥梁,负责管理数据库连接(Connection)的创建、复用、释放。
  • 它是 JDBC 规范的一部分,javax.sql.DataSource 是其核心接口。

2. 常见第三方数据源对比

特性 Druid(阿里开源) HikariCP(Spring Boot 默认)
性能 高 极高(目前最快)
监控能力 强大(内置监控页面、SQL 统计) 简单(需集成 Micrometer)
配置复杂度 中等 简单
SQL 防火墙 支持(可防御 SQL 注入) 不支持
扩展性 高(支持插件机制) 低
默认集成 Spring Boot 需手动引入 Spring Boot 2.0+ 默认

✅ 选择建议:

  • 追求极致性能:选 HikariCP
  • 需要监控、审计、防火墙:选 Druid

二、操作步骤(非常详细)

步骤 1:创建 Spring Boot 项目

确保 pom.xml 中包含以下依赖:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatis-Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.6</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Lombok(可选) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

方案一:集成 HikariCP(Spring Boot 默认)

HikariCP 是 Spring Boot 的默认连接池,无需额外引入依赖,开箱即用。

步骤 2.1:配置 application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cjkj.cjkjfastapi.cjkjfastapi_1_0_0.driver.jdbc.Driver

    # HikariCP 专属配置(可选)
    hikari:
      # 连接池名称
      pool-name: HikariPool-1
      # 最小空闲连接数
      minimum-idle: 5
      # 最大连接数
      maximum-pool-size: 20
      # 连接超时(毫秒)
      connection-timeout: 30000
      # 空闲连接超时(默认10分钟)
      idle-timeout: 600000
      # 连接最大存活时间(默认30分钟)
      max-lifetime: 1800000
      # 测试查询(可选)
      connection-test-query: SELECT 1

步骤 2.2:MyBatis-Plus 配置(可选)

mybatis-plus:
  configuration:
    # 开启自动驼峰映射
    map-underscore-to-camel-case: true
  # 指定 Mapper XML 文件位置
  mapper-locations: classpath:mapper/*.xml
  # 实体扫描包
  type-aliases-package: com.example.entity

步骤 2.3:启动类或配置类(无需额外配置)

HikariCP 会自动被 Spring Boot 加载,MyBatis-Plus 会自动注入 DataSource。


方案二:集成 Druid(推荐用于监控场景)

步骤 3.1:添加 Druid 依赖

<!-- Druid Spring Boot Starter -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.20</version>
</dependency>

⚠️ 注意:不要引入 druid-core,应使用 druid-spring-boot-starter 以获得自动配置支持。

步骤 3.2:配置 application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cjkj.cjkjfastapi.cjkjfastapi_1_0_0.driver.jdbc.Driver

    # 指定使用 Druid 数据源
    type: com.alibaba.druid.pool.DruidDataSource

    # Druid 专属配置
    druid:
      # 连接池配置
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false

      # 扩展插件(监控、防火墙等)
      filters: stat,wall,log4j # 常用:stat(监控)、wall(防火墙)
      
      # SQL 监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      
      # 监控页面配置
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: admin123
        allow: 127.0.0.1
        deny: 

步骤 3.3:创建 Druid 配置类(可选,用于自定义)

@Configuration
@EnableTransactionManagement
@MapperScan("com.example.mapper")
public class DruidConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.druid")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 配置 Druid 的 StatFilter(SQL 监控)
     */
    @Bean
    public FilterRegistrationBean<WebStatFilter> webStatFilter() {
        FilterRegistrationBean<WebStatFilter> filterRegistration = new FilterRegistrationBean<>();
        filterRegistration.setFilter(new WebStatFilter());
        filterRegistration.addUrlPatterns("/*");
        filterRegistration.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistration;
    }

    /**
     * 配置监控页面 Servlet
     */
    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        ServletRegistrationBean<StatViewServlet> servletRegistration = new ServletRegistrationBean<>();
        servletRegistration.setServlet(new StatViewServlet());
        servletRegistration.addUrlMappings("/druid/*");
        servletRegistration.addInitParameter("resetEnable", "false");
        servletRegistration.addInitParameter("loginUsername", "admin");
        servletRegistration.addInitParameter("loginPassword", "admin123");
        return servletRegistration;
    }
}

✅ 启动后访问:http://localhost:8080/druid 查看监控页面。


三、常见错误与解决方案

错误现象 原因 解决方案
ClassNotFoundException: DruidDataSource 未引入 druid-spring-boot-starter 检查依赖是否正确
监控页面打不开 stat-view-servlet.enabled=false 或路径错误 检查 YAML 配置
连接池耗尽 max-active 设置过小或连接未释放 增大连接数,检查代码是否关闭资源
SQL 监控不显示 filters 未包含 stat 添加 stat 到 filters
Hikari 报连接超时 connection-timeout 过短 调整超时时间

四、注意事项

  1. 不要同时引入 Druid 和 HikariCP:

    • Spring Boot 会自动选择一个,可能导致配置混乱。
    • 明确选择一个连接池。
  2. Druid 的 filters 配置:

    • stat:启用监控
    • wall:SQL 防火墙(可防御注入)
    • log4j:日志输出(需引入日志依赖)
  3. 生产环境关闭 reset-enable:

    reset-enable: false
    
  4. 合理设置连接池参数:

    • max-active 一般设为 CPU 核心数 × 2 ~ 4
    • 避免设置过大导致数据库连接数耗尽

五、使用技巧

1. 动态切换数据源(多数据源场景)

使用 AbstractRoutingDataSource + @DS 注解(MP 提供)实现多数据源。

@Service
@DS("slave") // 指定数据源
public class UserService {
    // 查询走从库
}

2. 监控 SQL 性能瓶颈

  • Druid 监控页面可查看:
    • SQL 执行次数、耗时、并发
    • 慢 SQL 统计(可设置 slow-sql-millis)
    • 连接池状态

3. HikariCP 性能调优技巧

spring:
  datasource:
    hikari:
      # 使用高性能驱动(如 MySQL 8+)
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 启用连接池日志
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true

六、最佳实践与性能优化

实践 说明
✅ 生产环境必用连接池 禁用默认 HikariCP 或使用 Druid
✅ Druid 用于需要监控的系统 如金融、电商等关键业务
✅ HikariCP 用于追求极致性能的系统 如高并发 API 服务
✅ 合理设置连接池大小 避免过小(性能差)或过大(压垮 DB)
✅ 开启连接测试 test-while-idle: true 防止连接失效
✅ 慢 SQL 告警 Druid 可配置慢 SQL 日志,结合 ELK 告警

⚡ 性能优化建议

  1. 预编译语句缓存(HikariCP):

    spring.datasource.hikari.data-source-properties.cachePrepStmts: true
    
  2. Druid 开启 PSCache:

    spring.datasource.druid.connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    
  3. 连接池健康检查:

    • 定期检查 DataSource 状态(如通过 Actuator)。
  4. 数据库连接数匹配:

    • 连接池最大连接数 ≤ 数据库 max_connections。

七、总结对比

场景 推荐数据源 理由
快速开发、API 服务 HikariCP 性能最好,配置简单
金融、电商、需监控 Druid 监控强大,防火墙安全
多数据源、读写分离 Druid 支持更丰富扩展
微服务、云原生 HikariCP 轻量、启动快

八、验证集成是否成功

  1. 启动应用,查看日志:

    [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
    

    或

    [INFO] com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
    
  2. 访问 /actuator/health 查看数据源状态。

  3. 对于 Druid,访问 /druid 查看监控页面。


结语

MyBatis-Plus 本身不提供数据源,必须与第三方连接池(Druid/HikariCP)集成才能发挥最大效能。

  • HikariCP:追求“快”,适合性能敏感型应用。
  • Druid:追求“稳+控”,适合需要监控与安全的生产系统。

合理配置连接池参数、开启监控、避免连接泄漏,是保障系统稳定的关键。掌握两者集成方式,你就能在不同业务场景下做出最优选择。