MyBatis配置数据库连接并实现交互的操作步骤
目录
- 一、最简配置:从XML开始
- 二、连接池选型:为什么推荐HikariCP?
- 三、Spring Boot下的偷懒写法
- 四、高级玩法:动态数据源切换
- 1. 定义动态数据源类:
- 2. 配置多数据源:
- 3. 使用注解切换:
- 五、常见问题排查
- 六、总结
如果你用过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="r编程客栈oot"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
这php里有几个关键点:
environment
标签定义了一套数据库环境(开发、测试、生产可以用不同配置)dataSource
的type="POOLED"
表示使用连接池(避免频繁创建销毁连接)- 如果用的是MySQL 8.0+,记得驱动类要改成
com.mysql.cj.jdbc.Driver
二、连接池选型:为什么推荐HikariCP?
MyBatis内置的连接池(POOLED)适合简单场景,但在高并发下性能一般。实际项目中更推荐用HikariCP或Druid。比如改用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 JDBCfpqEtE的性能差异,看完你就知道为什么大厂项目都在用HikariCP了!
三、Spring Boot下的偷懒写法
如果你用Spring Boot,配javascript置会更简单。直接在application.yml
里写:
spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 connection-timeout: 3000
MyBatis-Spring-Boot-Starter会自动帮你绑定配置,连XML都省了!不过要注意两个坑:
connection-timeout
单位是毫秒(默认30秒,太长了)- 如果遇到时区问题,在url后加参数:
?serverTimezone=Asia/Shanghai
四、高级玩法:动态数据源切换
有时候我们需要根据业务切换数据库(比如多租户系统)。这时候可以用AbstractRoutingDataSource
:
1. 定义动态数据源类:
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected 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!
五、常见问题排查
连接泄漏:检查是否所有操作都调用了sqlSession.close()
,或者用try-with-resources
语法:
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); // ... } // 自动关闭
慢查询:开启MyBatis日志(配置log4j.logger.org.apache.ibatis=DEBUG
)查看SQL执行时间
驱动不兼容:MySQL 5.x和8.x的驱动类不同,报ClassNotFoundException
时先检查驱动版本
六、总结
MyBatis的数据库连接配置看似简单,但细节决定性能。关键记住三点:
- 生产环境一定要用高性能连接池(HikariCP/Druid)
- Spring Boot下优先选择YAML配置
- 动态数据源通过
AbstractRoutingDataSource
+ThreadLocal实现
最后留个作业:如果让你设计一个监控数据库连接健康状态的方案,你会怎么做?欢迎在评论区交流!
到此这篇关于MyBatis配置数据库连接并实现交互的操作步骤的文章就介绍到这了,更多相关MyBatis配置数据库连接内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论