🥂(❁´◡`❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞
💖📕🎉🔥 支持我:点赞👍+收藏⭐️+留言📝欢迎留言讨论
🔥🔥🔥(源码 + 调试运行 + 问题答疑)🔥🔥🔥 有兴趣可以联系我
🔥🔥🔥 文末有往期免费源码,直接领取获取(无删减,无套路)
深入骨髓学MyBatis:手写框架开篇 - 从JDBC痛点到项目骨架搭建
手写MyBatis | 启航:解剖JDBC之痛与搭建核心骨架
引言: 想真正吃透一个框架,没有比亲手实现它更深刻的方式了。本系列将带你一步步手写一个简化版MyBatis,深入ORM框架的核心肌理。首篇聚焦项目初始化、Git管理,并深刻反思我们为何需要MyBatis——从原生JDBC的泥潭说起。
一、 项目初始化:骨架搭稳,核心包规划
-
目标达成:
-
使用 Maven/Gradle 初始化项目。
-
引入唯一的核心依赖:
JDBC驱动(如mysql-connector-java或h2database)。这是最纯净的起点。
-
-
核心包规划 (预见未来):
com.mymini.mybatis ├── session # 核心入口:SqlSession, SqlSessionFactory ├── binding # 接口与Mapper的绑定 ├── mapping # SQL映射 (参数映射、结果映射) ├── executor # SQL执行器 (核心!处理JDBC交互) ├── datasource # 数据源管理 (连接池集成点) ├── transaction # 事务管理 ├── cache # 缓存机制 (一级/二级缓存) ├── plugin # 插件/拦截器 (扩展点) └── parsing # SQL解析 (动态SQL处理基础) -
为何只需JDBC驱动? MyBatis的核心本质是一个增强的JDBC包装器和映射器。它不提供数据库连接(依赖JDBC Driver),也不管理事务的具体实现(依赖JDBC或其它事务管理器)。它的核心价值在于简化JDBC操作、解耦SQL与代码、自动化结果映射。从JDBC开始,才能清晰地看到MyBatis每一步解决的问题。
-
思考:ORM框架的核心模块
-
会话管理 (
session):用户操作入口,生命周期控制。 -
SQL执行 (
executor):核心引擎,负责调用JDBC、处理参数、结果转换。 -
SQL映射 (
mapping):将Java方法、参数、对象与SQL语句及结果集绑定。 -
数据源/事务 (
datasource,transaction):资源管理与一致性保障。 -
缓存 (
cache):性能优化利器。 -
(可选但重要) 插件 (
plugin):提供强大的扩展能力。 它们的关系是:Session调用Executor,Executor依赖DataSource获取连接,使用Transaction管理事务,通过MappedStatement(在mapping包中定义) 获取要执行的SQL和映射规则,执行后可能利用Cache,Plugin可以在执行链路的各个环节进行拦截增强。
-
二、 Git仓库管理:小步快跑,掌控版本
-
目标达成:
-
初始化 Git 仓库 (
git init)。 -
习惯养成:小步提交 (Atomic Commits)。每个提交只做一件事且确保项目可编译/运行。提交信息清晰 (如:
feat: Initialize project with Maven and JDBC dependency,fix: Correct typo in package name)。
-
-
核心点:
-
重要性: 框架开发周期长、逻辑复杂、涉及多人协作。版本控制是回溯、协作、问题定位、特性管理的生命线。想象调试一个复杂Bug时能精准定位到引入问题的提交!
-
分支策略:
-
main/master: 稳定分支,存放可发布版本。 -
develop: 主要开发分支,集成各特性分支。 -
feature/xxx: 功能开发分支 (如feature/executor-basic)。 -
fix/xxx: Bug修复分支。 开发完成后,通过 Pull Request (PR) 合并到develop,经过测试再合并到main。
-
-
-
思考:MyBatis团队的源码管理 庞大项目如MyBatis必然采用:
-
严格的分支模型 (类似 Git Flow 或简化版)。
-
详尽的 Issue Tracking & PR 流程 (如 GitHub Issues/Projects)。
-
持续集成 (CI):自动化构建、测试、代码质量检查。
-
清晰的贡献指南 (CONTRIBUTING.md)。
-
版本标签 (Semantic Versioning)。 通过精细化的分支管理和自动化流程,保证庞大代码库的健壮性和协作效率。
-
三、 回顾原生JDBC:痛点的根源
-
目标达成: 重温“经典”JDBC查询代码:
// 1. 加载驱动 (Class.forName 通常可省略于较新JDBC)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接 (硬编码URL! 硬编码用户名密码! 资源需关闭!)
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "user", "password")) {
// 3. 创建Statement (SQL硬编码! 资源需关闭!)
try (Statement stmt = conn.createStatement()) {
// 4. 执行SQL (SQL拼接易错、易注入! 参数硬编码!)
String sql = "SELECT id, name, email FROM users WHERE id = " + userId; // ❌ 拼接SQL,危险!
try (ResultSet rs = stmt.executeQuery(sql)) {
// 5. 遍历结果集 (列名硬编码! 类型转换繁琐! 易出错!)
while (rs.next()) {
int id = rs.getInt("id"); // 列名硬编码
String name = rs.getString("name"); // 列名硬编码
String email = rs.getString("email"); // 列名硬编码
User user = new User(id, name, email); // 手动组装对象
// ... 使用 user
}
}
}
} catch (SQLException | ClassNotFoundException e) { // 6. 异常处理通常不友好
e.printStackTrace(); // 实际项目需更精细处理
}
-
核心点展示痛点:
-
样板代码多: 加载驱动、获取连接、创建语句、关闭资源等步骤重复且固定。
-
硬编码严重: SQL字符串、连接参数、结果集列名/类型转换硬编码在Java代码中,难以维护。
-
资源管理繁琐易错: 必须手动关闭
Connection,Statement,ResultSet,否则导致资源泄露。try-with-resources缓解了但未根除。 -
SQL拼接危险: 如示例中直接拼接
userId,极易引发 SQL注入攻击。 -
结果集映射痛苦: 手动从
ResultSet读取每一列数据并塞入Java对象属性,枯燥易错。 -
异常处理繁琐:
SQLException是检查异常,需要到处捕获处理,且信息粒度不够。
-
-
思考:MyBatis的首要解决目标 MyBatis 首要解决的是 SQL与Java代码的解耦 和 结果集到Java对象的自动化映射。它让开发者专注于SQL本身(写在XML或注解里)和Java对象设计,而将繁琐的JDBC样板代码、参数设置、结果集遍历转换等脏活累活交给框架处理。
四、 原生JDBC的“七宗罪”与MyBatis的救赎
-
目标达成: 系统总结JDBC缺陷:
-
硬编码地狱: SQL、参数、结果列名/类型映射统统硬编码在Java代码中。👉 MyBatis方案:SQL外部化 (XML/注解),参数/结果映射配置化。
-
资源管理负担: 手动开/关
Connection,Statement,ResultSet极易遗漏导致泄露。👉 MyBatis方案:SqlSession生命周期管理,内部自动处理资源获取与释放。 -
异常处理不友好: 冗长的
try-catch和SQLException封装信息不足。👉 MyBatis方案:封装成更清晰的PersistenceException(unchecked)。 -
缺乏类型安全:
ResultSet.getXXX()方法调用基于字符串列名,编译期无法检查。👉 MyBatis方案:通过映射配置或方法签名 (Mapper接口) 提供一定程度类型安全。 -
扩展性差: 添加连接池、缓存、监控等需要侵入性修改大量JDBC代码。👉 MyBatis方案:插件机制 (
Interceptor)、可插拔的数据源/事务管理器/缓存实现。 -
重复代码多: 每个查询/更新操作都需要重复上述JDBC步骤。👉 MyBatis方案:模板方法模式封装核心流程,用户只需定义SQL和映射。
-
性能优化难: 手动实现高效连接池、一级/二级缓存、批处理等复杂度高。👉 MyBatis方案:内置支持连接池集成、一级缓存(SqlSession级别)、可配置二级缓存(Mapper级别)、批处理执行器。
-
-
思考:ORM框架的核心价值 ORM框架的核心价值在于提升开发效率、降低维护成本、增强代码可读性与安全性。它通过:
-
自动化映射: 消除手写结果集转换的繁琐与错误。
-
解耦SQL与代码: 使SQL更易于维护、复用和DBA评审。
-
抽象底层细节: 封装JDBC样板代码、资源管理、基础事务。
-
提供扩展点: 支持插件、缓存、连接池等高级特性集成。
-
提升安全性: 内建参数绑定机制防止SQL注入。 MyBatis 作为 半自动ORM,在提供强大映射和自动化的同时,保留了开发者对SQL的精细控制权,这是其独特优势。
-
结语: 通过解剖JDBC的痛点,我们深刻理解了MyBatis诞生的必然性。项目骨架的搭建和Git规范的建立,为后续深度开发奠定了坚实基础。下一篇,我们将着手实现MyBatis的核心引擎——Executor,看看它是如何优雅地封装JDBC,迈出摆脱“JDBC炼狱”的第一步!你期待先实现哪个模块?欢迎留言讨论!
关键词: #手写MyBatis #ORM框架原理 #JDBC痛点 #项目初始化 #Git管理 #Java持久层 #框架设计
往期免费源码 (无删减,无套路):🔥🔥🔥
https://pan.baidu.com/s/1sjAr08PU9Xe7MQf1gjGM5w?pwd=6666
「在线考试系统源码(含搭建教程)」 (无删减,无套路):🔥🔥🔥
链接:https://pan.quark.cn/s/96c4f00fdb43 提取码:WR6M
往期免费源码对应视频:
免费获取--SpringBoot+Vue宠物商城网站系统
🥂(❁´◡`❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞
💖📕🎉🔥 支持我:点赞👍+收藏⭐️+留言📝欢迎留言讨论
🔥🔥🔥(源码 + 调试运行 + 问题答疑)
🔥🔥🔥 有兴趣可以联系我
6419

被折叠的 条评论
为什么被折叠?



