Spring 整合 MyBatis + 数据库连接池
📅 2026/7/11 2:28:15
👁️ 阅读次数
📝 编程学习
一、版本匹配前置说明
- Spring Boot 2.x(Spring5):使用
mybatis-spring-boot-starter 2.x - Spring Boot 3.x(Spring6):使用
mybatis-spring-boot-starter 3.x - 连接池主流: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>依赖关系拆解
spring-boot-starter-jdbc:包含spring-jdbc+HikariCP 连接池mybatis-spring-boot-starter:自动整合mybatis+mybatis-spring,无需手动导入- 驱动包:提供数据库通信能力
三、核心组件原理(Spring 整合 MyBatis 底层)
1. 三大核心对象
- DataSource 数据源(连接池)管理数据库连接,复用连接、控制最大 / 最小连接数,避免频繁创建销毁连接。 SpringBoot 默认 HikariDataSource。
- SqlSessionFactoryMyBatis 核心工厂,读取 mybatis 配置、映射文件,生产 SqlSession。 Spring 整合由
SqlSessionFactoryBean创建。 - 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); } }八、连接池核心作用详解
- 性能提升数据库创建 TCP 连接开销大,连接池提前初始化一批连接,复用连接,大幅降低 IO 耗时。
- 流量削峰限制最大连接数,防止大量并发请求瞬间打满数据库,保护 MySQL。
- 连接自动管理自动回收空闲连接、关闭失效连接、超时检测,避免连接泄漏。
- 参数调优重点
maximum-pool-size:根据 MySQL 最大连接数配置,MySQL 默认 151,一般设 10~50minimum-idle:常驻空闲连接,避免高峰期临时创建连接connection-timeout:获取连接等待时长,超时抛异常,防止线程卡死
九、常见踩坑(含你之前的报错)
- AotDetector 类找不到mybatis-spring 版本过高(3.x)和 SpringBoot2.x 不兼容,
mybatis-spring-boot-starter必须用 2.x 版本。 - Mapper 注入失败 No qualifying bean忘记加
@MapperScan,或扫描包路径写错。 - XML 映射文件找不到yml 中
mapper-locations路径配置错误,或 XML namespace 和 Mapper 接口全类名不一致。 - 连接池耗尽、获取连接超时最大连接数过小,代码存在事务未提交、连接泄漏,调大
maximum-pool-size并检查代码是否有未关闭流。 - 驼峰命名不生效 未开启
map-underscore-to-camel-case: true,数据库下划线字段无法映射实体驼峰属性。
十、整体执行流程总结
- 项目启动,Spring 读取 yml 数据源配置,实例化Hikari 连接池 DataSource
- MyBatis 自动通过 SqlSessionFactoryBean 绑定数据源,加载 XML 映射文件
@MapperScan扫描所有 Mapper 接口,基于动态代理生成实现类,注册为 Spring Bean- Service 中 @Autowired 注入 Mapper,调用方法时,底层从连接池取出数据库连接执行 SQL
- SQL 执行完毕自动归还连接至连接池,不手动关闭
编程学习
技术分享
实战经验