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

一、核心概念

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 添加 statfilters
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:追求“稳+控”,适合需要监控与安全的生产系统。

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