0%

MyBatis 数据源(DataSource)深度解析:从原理到实践(Unpooled/Pooled 与第三方连接池)

MyBatis 的数据源(DataSource)是连接数据库的核心组件,负责管理数据库连接的创建、复用与销毁,直接影响系统的性能与稳定性。系统梳理 MyBatis 内置数据源的实现原理、连接池机制,以及生产环境中主流第三方连接池(HikariCP、Druid)的整合方案,帮助你理解 “连接管理” 的本质并选择合适的数据源。

数据源核心概念与接口规范

在深入 MyBatis 实现前,需先明确数据源的通用规范 —— 所有数据源都遵循 JDBC 标准接口 javax.sql.DataSource,该接口定义了获取数据库连接的核心方法:

1
2
3
4
5
6
7
8
9
10
11
12
public interface DataSource {
// 获取数据库连接
Connection getConnection() throws SQLException;
// 带用户名/密码的连接获取
Connection getConnection(String username, String password) throws SQLException;
// 获取连接池配置(可选)
PrintWriter getLogWriter() throws SQLException;
void setLogWriter(PrintWriter out) throws SQLException;
// 连接超时时间
int getLoginTimeout() throws SQLException;
void setLoginTimeout(int seconds) throws SQLException;
}

MyBatis 对数据源的封装遵循 “工厂模式”:通过 DataSourceFactory 接口创建不同类型的 DataSource,核心实现如下:

组件 作用 MyBatis 内置实现
DataSource 管理数据库连接 UnpooledDataSource(无池)、PooledDataSource(有池)
DataSourceFactory 创建 DataSource 的工厂接口 UnpooledDataSourceFactoryPooledDataSourceFactory

MyBatis 内置数据源:UnpooledDataSource(无池实现)

UnpooledDataSource 是 MyBatis 最简单的数据源实现,每次获取连接都会创建新的 Connection 对象,不进行连接复用,适合简单测试场景,不推荐生产环境使用。

阅读全文 »

MyBatis 架构与核心组件全解析:从三层架构到 SQL 执行链路

MyBatis 的架构设计清晰且模块化,通过 基础支持层、核心处理层、接口层 三层结构实现 “配置驱动、插件可扩展、低侵入” 的特性。本文深入拆解每一层的核心组件、职责及协作关系,并结合 SQL 执行全链路,帮你理解 MyBatis 如何将 “配置” 转化为 “数据库操作”,构建完整的技术认知。

MyBatis 三层架构总览

MyBatis 的三层架构并非物理隔离,而是按 “职责划分” 的逻辑分层,各层组件协同工作,形成从 “接口调用” 到 “数据库响应” 的闭环。三层的核心职责与组件对应关系如下:

架构分层 核心职责 关键组件
接口层 提供对外 API,简化开发者调用 SqlSessionMapperProxy(动态代理)
核心处理层 实现 SQL 执行与结果映射的核心逻辑 Executor(执行器)、StatementHandler(SQL 处理器)、ParameterHandler(参数处理器)、ResultSetHandler(结果处理器)、Configuration(配置中心)
基础支持层 为核心层提供通用支撑能力,保证框架稳定性 数据源、事务管理、日志、类型转换(TypeHandler)、缓存、XML/OGNL 解析器

分层详解:组件职责与协作

1. 基础支持层:框架的 “地基”

基础支持层是 MyBatis 的 “工具集”,为核心处理层提供通用能力,不直接参与 SQL 执行,但决定了框架的扩展性、稳定性和性能。

(1)核心组件与职责
阅读全文 »

Java Stream 操作详解:从基础到实战

Java Stream(流)是 Java 8 引入的核心特性,基于函数式编程思想,为集合数据处理提供了简洁、高效的链式操作。Stream 不存储数据,也不修改源集合,而是通过一系列中间操作(惰性求值)和终止操作(触发执行),实现对数据的过滤、转换、聚合等处理。本文将全面解析 Stream 的核心概念、操作方法及最佳实践。

Stream 核心概念

什么是 Stream?

Stream 是 “数据流” 的抽象,可将集合(如 ListSet)转换为流,通过链式操作对元素进行处理。其核心特点:

  • 不存储数据:流只是数据的 “视图”,操作不会改变源集合。
  • 惰性求值:中间操作仅描述处理逻辑,不实际执行,直到终止操作被调用才一次性执行。
  • 一次性使用:流只能被消费一次,执行终止操作后即失效,再次使用需重新创建。

Stream 操作流程

Stream 处理分为三个阶段,形成 “流水线”:

1
数据源(集合、数组等)→ 中间操作(过滤、转换等)→ 终止操作(聚合、收集等)
  • 数据源:可是 Collection(通过 stream()parallelStream())、数组(Arrays.stream())、生成器(Stream.generate())等。
  • 中间操作:对数据进行处理(如筛选、排序),返回新的流,可链式调用。
  • 终止操作:触发流的执行,返回非流结果(如集合、数值、布尔值等)。

Stream 的创建(生成流)

从集合创建

所有 Collection 接口的实现类(如 ListSet)均可通过 stream()parallelStream() 生成流:

1
2
3
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 顺序流(单线程处理)
Stream<String> parallelStream = list.parallelStream(); // 并行流(多线程处理)

从数组创建

通过 Arrays.stream() 从数组生成流:

阅读全文 »