当前位置: 首页 > news >正文

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 执行完毕自动归还连接至连接池,不手动关闭
http://www.jsqmd.com/news/1164608/

相关文章:

  • 工业级负载控制方案:TPD2015FN与PIC18F86K22应用
  • EasyOCR 1.7.1 GPU加速配置:CUDA 11.8 + PyTorch 2.0 环境搭建 3 步指南
  • 数据库的“大脑中枢”:深度解析Oracle控制文件的作用与保护策略
  • 用 OpenClaw 做网页调研:搜索、打开网页、提取信息和生成报告
  • 非标机柜加工厂家满足哪些行业定制需求?
  • Spring Boot 3.x 项目实践:4 个场景应用迪米特法则降低耦合度
  • Krea 2身份保留功能:AI绘画角色一致性技术解析与实践
  • 非技术岗位考什么证书更实用?别盲目跟风
  • BQ25887锂电平衡充电方案与PIC18LF4553实现
  • 网络安全/信息安全(白帽黑客)自学经历
  • UABEA性能优化解析:Unity资源提取效率提升1200%的底层原理与实践
  • 考研数学、力扣算法 与 大模型底层研究、SCI公式、模型自研的核心关联
  • 3分钟搞定B站缓存视频:m4s-converter无损转换技术详解
  • UE4垃圾回收机制深度解析:从GUObjectArray到异步Purge的性能优化实践
  • 【世界杯中的AI】(2026-07-10)2-0!法兰西完胜摩洛哥,“AI神预测”抢镜,首届AI世界杯惊现裁判第一视角!
  • Excel 365/2021 动态数组函数实战:FILTER、XLOOKUP、UNIQUE 组合解决 5 类数据清洗难题
  • 伊苏X 北境历险|中字-国语|-磐石怒吼-破天战歌+全DLC+预购特典|解压即撸|
  • LV3296与PIC18F45K80在工业数据采集中的协同应用
  • 全国用电负荷创历史新高,国家能源局部署迎峰度夏电力保供工作
  • AI算力评估:从硬件指标到行业格局的深度解析
  • 基于 Go 微服务的智能快递柜系统全栈开发实践
  • (毕业必看)实测好用的AI论文写作软件,毕业生收藏备用
  • Hikyuu Quant Framework 2.8.1 版本更新:新增多项特性,优化算法并修复诸多缺陷
  • Agent 工具注册与发现机制:从硬编码到插件式动态加载的架构演进
  • 《HarmonyOS技术精讲-蓝牙》综合实战:构建智能家居控制应用
  • ISO 15765-2 CAN-TP 帧格式解析:SF/FF/CF/FC 4种帧的3个核心差异点
  • 网络安全竞赛研究论文写作指南:从选题到发表的全流程解析
  • 基于PIC18F8520与PAM8904的智能音频警报系统设计
  • 知识图谱+FAB工艺推荐系统
  • 没有实拍素材怎么做信息流带货视频?