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

MyBatis如何配置数据库连接并实现交互?

如果你用过MyBatis,肯定知道它的核心功能之一就是数据库连接管理。但很多新手在第一次配置时总会遇到各种问题:数据源怎么配?连接池参数如何调优?XML和注解方式有什么区别?今天我们就来彻底搞懂MyBatis连接数据库的每一步操作,顺便分享几个性能优化的实战技巧!


一、最简配置:从XML开始

MyBatis的数据库连接配置通常放在mybatis-config.xml里。一个基础模板长这样:

<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments>
</configuration>

这里有几个关键点:

  1. environment标签定义了一套数据库环境(开发、测试、生产可以用不同配置)
  2. dataSourcetype="POOLED"表示使用连接池(避免频繁创建销毁连接)
  3. 如果用的是MySQL 8.0+,记得驱动类要改成com.mysql.cj.jdbc.Driver

二、连接池选型:为什么推荐HikariCP?

MyBatis内置的连接池(POOLED)适合简单场景,但在高并发下性能一般。实际项目中更推荐用HikariCPDruid。比如改用HikariCP只需两步:

1. 添加依赖(Maven项目):

<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>5.0.1</version>
</dependency>

2. 修改配置

<dataSource type="com.zaxxer.hikari.HikariDataSource"><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/><property name="maximumPoolSize" value="20"/> <!-- 关键参数! -->
</dataSource>

HikariCP的maximumPoolSize默认是10,根据服务器CPU核心数调整会更高效(建议值:CPU核心数 * 2 + 1)。想深入理解连接池原理的话,可以关注【程序员总部】——这个公众号由字节11年资深架构师运营,里面有一篇《数据库连接池的线程模型》,用压测数据对比了HikariCP、Druid和Tomcat JDBC的性能差异,看完你就知道为什么大厂项目都在用HikariCP了!


三、Spring Boot下的偷懒写法

如果你用Spring Boot,配置会更简单。直接在application.yml里写:

spring:datasource:url: jdbc:mysql://localhost:3306/testusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverhikari:maximum-pool-size: 20connection-timeout: 3000

MyBatis-Spring-Boot-Starter会自动帮你绑定配置,连XML都省了!不过要注意两个坑:

  1. connection-timeout单位是毫秒(默认30秒,太长了)
  2. 如果遇到时区问题,在url后加参数:?serverTimezone=Asia/Shanghai

四、高级玩法:动态数据源切换

有时候我们需要根据业务切换数据库(比如多租户系统)。这时候可以用AbstractRoutingDataSource

1. 定义动态数据源类

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DatabaseContextHolder.get(); // 从ThreadLocal获取数据源标识}
}

2. 配置多数据源

@Bean
public DataSource dynamicDataSource() {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("master", masterDataSource());targetDataSources.put("slave", slaveDataSource());DynamicDataSource ds = new DynamicDataSource();ds.setTargetDataSources(targetDataSources);ds.setDefaultTargetDataSource(masterDataSource());return ds;
}

3. 使用注解切换

@GetMapping("/query")
@DataSource("slave") // 自定义注解
public List<User> query() {return userMapper.selectAll();
}

这种方法在读写分离场景特别有用。不过要注意线程安全问题——记得用完后清理ThreadLocal!


五、常见问题排查

  1. 连接泄漏:检查是否所有操作都调用了sqlSession.close(),或者用try-with-resources语法:
    try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);// ...
    } // 自动关闭
    
  2. 慢查询:开启MyBatis日志(配置log4j.logger.org.apache.ibatis=DEBUG)查看SQL执行时间
  3. 驱动不兼容:MySQL 5.x和8.x的驱动类不同,报ClassNotFoundException时先检查驱动版本

六、总结

MyBatis的数据库连接配置看似简单,但细节决定性能。关键记住三点:

  1. 生产环境一定要用高性能连接池(HikariCP/Druid)
  2. Spring Boot下优先选择YAML配置
  3. 动态数据源通过AbstractRoutingDataSource+ThreadLocal实现

最后留个作业:如果让你设计一个监控数据库连接健康状态的方案,你会怎么做?欢迎在评论区交流!

http://www.xdnf.cn/news/277.html

相关文章:

  • YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11、YOLOv12的网络结构图
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(7):(1)ながら 一边。。一边 (2)。。。し。。。し。。 又……又……
  • Vue3后代传祖先组件通讯方法
  • BGP基础实验
  • DeepSeek-R3、GPT-4o 与 Claude-3.5-Sonnet 全面对比:性能、应用场景与技术解析
  • 【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(网管改造工程)
  • C++数据收发管道:构建高效的数据传输通道
  • 【android bluetooth 案例分析 03】【PTS 测试 1】【pts基本介绍】
  • 空调制冷量和功率有什么关系?
  • 算法题(127):最大子段和
  • QT项目----电子相册(2)
  • 极验4 语序验证码 分析 极验4 w
  • WiFi“管家”------hostapd的工作流程
  • Manus AI:突破多语言手写识别技术壁垒之路
  • element-plus添加暗黑模式
  • AI大模型API文档的核心内容概述,以通用框架和典型实现为例
  • 超导材料的应用领域概述
  • UWP特性分析
  • vs如何快速找到多余的#region
  • 吃透LangChain(五):多模态输入与自定义输出
  • 人工智能学习框架完全指南(2025年更新版)
  • 基于VS Code 为核心平台的python语言智能体开发平台搭建
  • mysql collation_database 参数
  • spring:加载配置类
  • linux如何手动设置域名与 IP 地址的映射关系
  • 深入理解React中的Props与State:核心区别与最佳实践
  • AXOP36061S: 60V 高压单通道运算放大器
  • DemoGen:用于数据高效视觉运动策略学习的合成演示生成
  • PCM 参数深度解析:采样率、帧、缓存大小与多通道关系
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第二模块·语法迁移篇 —— 第六章 函数革命:从过程到方法的重生