JDBC、Druid连接池、MyBatis、MyBatis+Druid 使用方式总结

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() 归还连接

四、关键理解点

  1. DataSource 是 JDBC 2.0 引入的接口,专门为连接池而生,替代 DriverManager
  2. 连接池必须是单例,整个应用只有一个 DataSource 实例
  3. 第一次 getConnection() 时才初始化连接池(懒加载),setInitialSize(5) 只是配置,不会立即创建连接
  4. close() 在连接池中不是物理关闭,而是归还连接到池子,供下次复用
  5. SqlSessionFactory 持有 DataSource,openSession() 就是拿连接 → 包装成 SqlSession
  6. MyBatis 内置的 POOLED 连接池功能简陋,生产环境建议用 Druid 或 HikariCP 替换
  7. MyBatis + Druid:Druid 管连接池,MyBatis 管 SQL 映射,各司其职

五、选型建议

场景 推荐方案
学习 JDBC 基础 原始 JDBC
小型/个人项目 MyBatis + POOLED
生产环境 MyBatis + DruidMyBatis + HikariCP
需要 SQL 监控 MyBatis + Druid(Druid 自带监控)
posted @ 2026-06-23 15:54  deyang  阅读(4)  评论(0)    收藏  举报