Spring 整合 MyBatis + 数据库连接池

📅 2026/7/11 2:28:15 👁️ 阅读次数 📝 编程学习
Spring 整合 MyBatis + 数据库连接池

一、版本匹配前置说明

  1. Spring Boot 2.x(Spring5):使用mybatis-spring-boot-starter 2.x
  2. Spring Boot 3.x(Spring6):使用mybatis-spring-boot-starter 3.x
  3. 连接池主流:HikariCP(SpringBoot2/3 默认内置),替代旧版 Druid、Tomcat JDBC

二、核心依赖(Maven)

1. SpringBoot 父工程(统一版本)

xml

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> </parent>

2. 基础 web、jdbc、mybatis、连接池

xml

<!-- web 项目可选 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JDBC 底层,自带HikariCP连接池 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- MyBatis SpringBoot整合启动器(关键) --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- 可选:Druid连接池(替换默认Hikari) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>

依赖关系拆解

  1. spring-boot-starter-jdbc:包含spring-jdbc+HikariCP 连接池
  2. mybatis-spring-boot-starter:自动整合mybatis+mybatis-spring,无需手动导入
  3. 驱动包:提供数据库通信能力

三、核心组件原理(Spring 整合 MyBatis 底层)

1. 三大核心对象

  1. DataSource 数据源(连接池)管理数据库连接,复用连接、控制最大 / 最小连接数,避免频繁创建销毁连接。 SpringBoot 默认 HikariDataSource。
  2. SqlSessionFactoryMyBatis 核心工厂,读取 mybatis 配置、映射文件,生产 SqlSession。 Spring 整合由SqlSessionFactoryBean创建。
  3. SqlSession执行 CRUD 操作,Spring 中通过MapperScannerConfigurer自动生成 Mapper 代理对象,无需手动 getSqlSession。

2. 整合流程

配置文件数据源(连接池) → DataSource → SqlSessionFactoryBean → Mapper扫描 → Mapper代理Bean注入Service

四、application.yml 配置(Hikari 默认连接池)

yaml

# 数据库数据源 + Hikari连接池配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: root # Hikari连接池参数 hikari: # 最小空闲连接 minimum-idle: 5 # 最大连接数 maximum-pool-size: 10 # 连接超时时间,毫秒 connection-timeout: 30000 # 空闲连接超时 idle-timeout: 600000 # 连接最长生命周期 max-lifetime: 1800000 # MyBatis配置 mybatis: # mapper映射文件路径 mapper-locations: classpath:mapper/*.xml # 实体类别名包,xml中可直接写类名不用全限定名 type-aliases-package: com.nzh.springbootdemo.entity configuration: # 开启SQL日志打印 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰命名自动转换 user_name → userName map-underscore-to-camel-case: true

五、Druid 连接池替换 Hikari

yml 配置

yaml

spring: datasource: url: jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource druid: # 初始连接数 initial-size: 5 # 最小空闲 min-idle: 5 # 最大连接 max-active: 20 # 获取连接等待超时 max-wait: 60000 # 监控页面 stat-view-servlet: enabled: true login-username: admin login-password: 123456

六、代码开发步骤

1. 启动类添加 Mapper 扫描注解

java

运行

import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 扫描Mapper接口包,自动生成代理对象交给Spring管理 @MapperScan("com.nzh.springbootdemo.mapper") @SpringBootApplication public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } }

@MapperScan等价于旧版MapperScannerConfigurer,解决你报错里的 ClassPathMapperScanner 初始化逻辑。

2. 实体类 Entity

java

运行

package com.nzh.springbootdemo.entity; public class User { private Integer id; private String userName; private String password; // getter/setter }

3. Mapper 接口

java

运行

package com.nzh.springbootdemo.mapper; import com.nzh.springbootdemo.entity.User; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper { List<User> selectAll(); User selectById(@Param("id") Integer id); }

4. Mapper XML(resources/mapper/UserMapper.xml)

xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.nzh.springbootdemo.mapper.UserMapper"> <select id="selectAll" resultType="User"> select id, user_name, password from user </select> <select id="selectById" resultType="User"> select id, user_name, password from user where id = #{id} </select> </mapper>

5. Service 层使用 Mapper(自动注入)

java

运行

@Service public class UserService { // Spring自动注入Mapper代理对象 @Autowired private UserMapper userMapper; public List<User> list(){ return userMapper.selectAll(); } }

七、无 SpringBoot 原生 SSM 整合(纯 Spring,了解底层)

1. Spring 配置类,手动创建连接池、SqlSessionFactory、Mapper 扫描

java

运行

@Configuration @MapperScan("com.nzh.mapper") public class MyBatisConfig { // 1. 创建Hikari连接池数据源 @Bean public DataSource dataSource(){ HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/test_db"); config.setUsername("root"); config.setPassword("root"); config.setMinimumIdle(5); config.setMaximumPoolSize(10); return new HikariDataSource(config); } // 2. 创建SqlSessionFactory @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // 指定mapper文件路径 factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/*.xml")); // 实体类别名 factoryBean.setTypeAliasesPackage("com.nzh.entity"); return factoryBean.getObject(); } // 3. 可选:SqlSessionTemplate(手动操作sqlSession) @Bean public SqlSession sqlSession(SqlSessionFactory factory){ return new SqlSessionTemplate(factory); } }

八、连接池核心作用详解

  1. 性能提升数据库创建 TCP 连接开销大,连接池提前初始化一批连接,复用连接,大幅降低 IO 耗时。
  2. 流量削峰限制最大连接数,防止大量并发请求瞬间打满数据库,保护 MySQL。
  3. 连接自动管理自动回收空闲连接、关闭失效连接、超时检测,避免连接泄漏。
  4. 参数调优重点
  • maximum-pool-size:根据 MySQL 最大连接数配置,MySQL 默认 151,一般设 10~50
  • minimum-idle:常驻空闲连接,避免高峰期临时创建连接
  • connection-timeout:获取连接等待时长,超时抛异常,防止线程卡死

九、常见踩坑(含你之前的报错)

  1. AotDetector 类找不到mybatis-spring 版本过高(3.x)和 SpringBoot2.x 不兼容,mybatis-spring-boot-starter必须用 2.x 版本。
  2. Mapper 注入失败 No qualifying bean忘记加@MapperScan,或扫描包路径写错。
  3. XML 映射文件找不到yml 中mapper-locations路径配置错误,或 XML namespace 和 Mapper 接口全类名不一致。
  4. 连接池耗尽、获取连接超时最大连接数过小,代码存在事务未提交、连接泄漏,调大maximum-pool-size并检查代码是否有未关闭流。
  5. 驼峰命名不生效 未开启map-underscore-to-camel-case: true,数据库下划线字段无法映射实体驼峰属性。

十、整体执行流程总结

  1. 项目启动,Spring 读取 yml 数据源配置,实例化Hikari 连接池 DataSource
  2. MyBatis 自动通过 SqlSessionFactoryBean 绑定数据源,加载 XML 映射文件
  3. @MapperScan扫描所有 Mapper 接口,基于动态代理生成实现类,注册为 Spring Bean
  4. Service 中 @Autowired 注入 Mapper,调用方法时,底层从连接池取出数据库连接执行 SQL
  5. SQL 执行完毕自动归还连接至连接池,不手动关闭