JDBC、Druid 和 MyBatis 三者关系详解

51 阅读4分钟

JDBC、Druid 和 MyBatis 三者关系详解

在 Java 数据库访问技术栈中,JDBC、Druid 和 MyBatis 处于不同的层次,各自承担着不同的职责,共同构成了从底层到高层的完整数据库访问解决方案。下面将详细分析它们之间的关系。

一、层次关系

从底层到高层的架构关系如下:

应用程序 → MyBatis (ORM框架) → Spring JDBC (可选) → Druid (连接池) → JDBC API → 数据库驱动 → 数据库

1. JDBC - 最底层规范

JDBC (Java Database Connectivity) 是 Java 官方提供的一套数据库访问规范,定义了 Java 程序与数据库交互的标准接口。它是整个数据库访问层次结构的基础。

2. Druid - 中间层连接池

Druid 是阿里巴巴开源的数据库连接池实现,位于 JDBC 之上,为上层应用提供高效的数据库连接管理。

3. MyBatis - 高层 ORM 框架

MyBatis 是一个优秀的 ORM (对象关系映射) 框架,位于整个层次结构的上层,它封装了底层的 JDBC 操作,提供了更高级的数据库访问方式。

二、详细关系分析

1. JDBC 与 Druid 的关系

  • JDBC 是规范,Druid 是实现:JDBC 定义了 DataSource 接口,而 Druid 实现了这个接口(DruidDataSource
  • 连接池功能增强:Druid 扩展了 JDBC 的功能,提供了连接池管理、连接复用、监控、统计等高级特性
  • 替换关系:Druid 可以无缝替换 Java 内置的连接池实现,如 BasicDataSourceDriverManagerDataSource

2. JDBC 与 MyBatis 的关系

  • MyBatis 基于 JDBC 构建:MyBatis 内部使用 JDBC API 来执行实际的数据库操作
  • 封装与简化:MyBatis 封装了 JDBC 的复杂操作(如创建连接、语句、处理结果集等),提供了更简洁的 API
  • 保留灵活性:MyBatis 保留了对 SQL 的直接控制,比全自动 ORM 框架更灵活

3. Druid 与 MyBatis 的关系

  • 依赖关系:MyBatis 通常使用连接池(如 Druid)来获取数据库连接
  • 配置关系:在 MyBatis 配置中,可以指定使用 Druid 作为数据源
  • 互补关系:Druid 提供连接管理和监控,MyBatis 提供 SQL 映射和对象映射,两者互补形成完整解决方案

三、核心功能对比

技术主要职责核心组件优势
JDBC定义数据库访问标准接口Connection、Statement、ResultSet、PreparedStatement官方标准,直接控制,跨数据库兼容
Druid提供高效连接池管理DruidDataSource、Filter 机制、监控统计高性能、监控全面、功能丰富、防 SQL 注入
MyBatis提供 ORM 映射和 SQL 管理SqlSession、Mapper 接口、XML 映射文件简化开发、SQL 灵活控制、缓存机制、动态 SQL

四、实际应用中的协作方式

1. 典型架构配置

在实际应用中,三者通常按照以下方式协作:

// 1. 配置 Druid 数据源
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");

// 2. 配置 MyBatis 使用该数据源
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
SqlSessionFactory sqlSessionFactory = factoryBean.getObject();

// 3. 使用 MyBatis 进行数据库操作
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectById(1);

2. Spring Boot 中的自动配置

在 Spring Boot 中,三者的配置更加简化:

# application.yml 配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity

五、调用链路分析

当使用 MyBatis 查询数据时,完整的调用链路如下:

  1. 应用层调用:应用程序调用 MyBatis 的 Mapper 接口方法
  2. MyBatis 处理
    • SqlSession 根据 Mapper 接口和方法定位到对应的 SQL 语句
    • 处理动态 SQL、参数映射和绑定
    • 创建执行器(Executor)准备执行 SQL
  3. 连接获取
    • 通过配置的 DataSource(DruidDataSource)获取数据库连接
    • Druid 从连接池返回可用连接或创建新连接
  4. JDBC 操作
    • MyBatis 使用 JDBC API 创建 PreparedStatement
    • 设置参数,执行 SQL 语句
    • 获取 ResultSet
  5. 结果处理
    • 将 ResultSet 映射为 Java 对象
    • 应用缓存策略
  6. 资源释放
    • 关闭 ResultSet 和 Statement
    • 将连接归还到 Druid 连接池(而不是真正关闭)

六、总结

JDBC、Druid 和 MyBatis 在 Java 数据库访问中扮演着不同的角色:

  • JDBC 是基础规范,定义了 Java 程序与数据库交互的标准接口
  • Druid 是连接池实现,优化了连接的创建、管理和复用,提供了监控功能
  • MyBatis 是 ORM 框架,简化了 SQL 编写和结果映射,提高了开发效率

三者协同工作,形成了一个完整、高效、灵活的数据库访问解决方案。在实际项目中,通常会同时使用这三种技术,以获得最佳的数据库访问性能和开发体验。