JDBC、Druid连接池、MyBatis、MyBatis+Druid 使用方式总结
一、层级演进
原始 JDBC(DriverManager)
↓
JDBC 2.0 引入 DataSource 接口 → 连接池出现
↓
Druid / HikariCP 等实现 DataSource → 专业连接池
↓
MyBatis 封装底层,用 SqlSession 替代 Connection
↓
MyBatis + Druid → 生产环境标准方案
二、四种方式对比
1. 原始 JDBC(无连接池)
// 每次请求:创建连接 → 执行SQL → 销毁连接
Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from users");
// ... 处理结果 ...
rs.close();
stmt.close();
conn.close(); // 物理关闭,连接被销毁
| 特点 |
说明 |
| 获取连接 |
DriverManager.getConnection() |
| 连接复用 |
❌ 每次新建 |
| 关闭行为 |
物理销毁连接 |
| 性能 |
差,频繁创建/销毁 |
| 适用场景 |
学习、测试 |
2. Druid 连接池
// 全局唯一的连接池
private static DruidDataSource dataSource;
static {
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/db");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setInitialSize(5); // 初始化连接数
dataSource.setMaxActive(20); // 最大连接数
}
// 使用:从池子拿,用完归还
Connection conn = dataSource.getConnection();
// ... 执行SQL ...
conn.close(); // 归还给池子,不销毁!
| 特点 |
说明 |
| 获取连接 |
dataSource.getConnection() |
| 连接复用 |
✅ 从池中取,用完归还 |
| 关闭行为 |
归还池子,可复用 |
| 性能 |
好 |
| 额外能力 |
SQL监控、慢查询分析、防火墙 |
3. MyBatis(内置 POOLED 连接池)
// SqlMapConfig.xml 中配置
// <dataSource type="POOLED">
// <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
// <property name="url" value="jdbc:mysql://localhost:3306/db"/>
// ...
// </dataSource>
// Java 代码
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession(); // 内部从 POOLED 拿连接
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUsers();
session.close(); // 归还连接 + 清理资源
| 特点 |
说明 |
| 获取连接 |
factory.openSession() 自动获取 |
| 连接池 |
MyBatis 内置的 PooledDataSource(简单) |
| 操作方式 |
通过 Mapper 接口,不直接操作 Connection |
| 适用场景 |
小型项目、学习 |
4. MyBatis + Druid(生产环境标准)
方式一:XML 配置(最简单)
<!-- SqlMapConfig.xml -->
<environment id="development">
<transactionManager type="JDBC"/>
<!-- type 直接写 Druid 全限定类名 -->
<dataSource type="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
</dataSource>
</environment>
方式二:代码构建
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/db");
dataSource.setUsername("root");
dataSource.setPassword("123456");
Environment env = new Environment("dev",
new JdbcTransactionFactory(), dataSource);
Configuration config = new Configuration(env);
config.addMapper(UserMapper.class);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
SqlSession session = factory.openSession();
// ... 使用 ...
session.close();
| 特点 |
说明 |
| 连接池 |
Druid(功能强大) |
| SQL 映射 |
MyBatis(方便灵活) |
| 监控能力 |
Druid 提供 SQL 监控、慢查询 |
| 适用场景 |
生产环境标准方案 |
三、核心概念对应关系
┌──────────────────────────────────────────────────────────────┐
│ DataSource │
│ (连接池,全局唯一) │
│ 管理着一堆 Connection,用完归还 │
└────────────────────────┬─────────────────────────────────────┘
│
┌──────────────┴──────────────┐
↓ ↓
原始 JDBC 用法 MyBatis 用法
dataSource.getConnection() SqlSessionFactory(持有 DataSource)
↓ ↓
Connection openSession()
↓ ↓
Statement / ResultSet SqlSession(包装了 Connection)
↓ ↓
conn.close() → 归还池子 session.getMapper().xxx()
session.close() → 归还连接
| 原始 JDBC |
MyBatis |
说明 |
DataSource |
DataSource(藏在 SqlSessionFactory 底层) |
连接池 |
Connection |
SqlSession |
一次数据库会话 |
Statement |
Mapper 方法 |
执行 SQL |
conn.close() |
session.close() |
归还连接 |
四、关键理解点
- DataSource 是 JDBC 2.0 引入的接口,专门为连接池而生,替代 DriverManager
- 连接池必须是单例,整个应用只有一个 DataSource 实例
- 第一次 getConnection() 时才初始化连接池(懒加载),
setInitialSize(5) 只是配置,不会立即创建连接
- close() 在连接池中不是物理关闭,而是归还连接到池子,供下次复用
- SqlSessionFactory 持有 DataSource,openSession() 就是拿连接 → 包装成 SqlSession
- MyBatis 内置的 POOLED 连接池功能简陋,生产环境建议用 Druid 或 HikariCP 替换
- MyBatis + Druid:Druid 管连接池,MyBatis 管 SQL 映射,各司其职
五、选型建议
| 场景 |
推荐方案 |
| 学习 JDBC 基础 |
原始 JDBC |
| 小型/个人项目 |
MyBatis + POOLED |
| 生产环境 |
MyBatis + Druid 或 MyBatis + HikariCP |
| 需要 SQL 监控 |
MyBatis + Druid(Druid 自带监控) |