什么是持久层? JDBC 演变的 Mybatis 架构分析

简介: 什么是持久层? JDBC 演变的 Mybatis 架构分析

在这里插入图片描述

前言

ORM 持久层指的是:将业务数据存储到磁盘,也具备长期存储能力,只要磁盘不损坏,如果在断电情况下,重启系统仍然可以读取数据

01、JDBC

1.1 什么是 jdbc

JDBC(JavaDataBase Connectivity)就是 Java 数据库连接, 说的直白点就是使用 Java 语言操作数据库

本来我们是通过控制台或客户端操作的数据库, JDBC 是用 Java 语言来发送 SQL 语句

1.2 Jdbc 原理

最初 SUN 公司希望提供 一套能够适用所有数据库的 API, 但是在实际操作中却发现这是项基本不可能完成的任务

因为各个厂商所提供的 数据库差异实在太大, 所以 SUN 公司与数据库厂商讨论出的就是:由 SUN 公司提供出一套访问数据库的规范 API, 并提供相对应的连接数据库协议标准, 然后各厂商根据规范提供一套访问自家数据库的 API 接口

最终:SUN 公司提供的规范 API 称之为 JDBC, 各厂商提供的自家数据库 API 接口称之为 驱动

Jdbc 架构图

02、Mybatis

2.1 什么是 mybatis

mybatis 是一款优秀的 ORM(持久层)框架,使用 Java 语言 编写

前身是 apache 的一个开源项目 iBatis,2010 年迁移到 google code 并正式改名为 mybatis

2.2 mybatis 与 jdbc 的关系

在没有持久层框架之前, 想要代码中操作数据库都必须通过 jdbc 来操作, 接下来一个例子来说明两者之间的关系

jdbc 操作数据库

@SneakyThrows
public static void main(String[] args) {
    String driveName = "com.mysql.cj.jdbc.Driver";
    String url = "jdbc:mysql://127.0.0.1:3306/mybatis-study?serverTimezone=GMT%2B8";
    String user = "root";
    String pass = "root";

    Connection con = null;
    Statement state = null;
    ResultSet result = null;
    try {
        // 装载Mysql驱动
        Class.forName(driveName);
        // 获取连接
        con = DriverManager.getConnection(url, user, pass);
        // 创建Statement
        state = con.createStatement();
        // 构建SQL语句
        String stuQuerySqlStr = "select * from student";
        // 执行SQL返回结果
        result = state.executeQuery(stuQuerySqlStr);
        // 对SQL返回结果解析
        while (result.next()) {
            log.info("  >>> 学生姓名 :: {}", result.getString("name"));
            log.info("  >>> 学生年龄 :: {}", result.getInt("age"));
        }
    } finally {
        result.close();
        state.close();
        con.close();
    }
}

相信大家都在实际项目中使用过 mybatis, 可以联想一下, 平常我们工作中, 是否做过以下事情:

  • 是否装载过数据库驱动?
  • 是否从驱动中获取数据库连接?
  • 是否创建过执行 SQL 的 Statement?
  • 是否自行将数据库返回结果转换成 Java 对象?
  • 是否关闭过 finally 块中的三个对象?

经过上面的灵魂拷问, 可以得出 Mybatis 替我们做了什么:

Mybatis 针对 JDBC 中重复操作做了封装, 同时扩展并优化部分功能

03、 Mybatis 架构设计

3.1 架构图

Mybatis 分层架构图

3.2 基础支持层

3.2.1 反射模块

反射在 Java 中的应用可以说是相当广泛了, 同时也是一把双刃剑。 mybatis 框架本身 封装出了反射模块, 提供了比原生反射更 简洁易用的 API 接口, 以及对类的 元数据增加缓存, 提高反射的性能

3.2.2 类型转换

类型转换模块最重要的功能就是在为 SQL 语句绑定实参时, 将 Java 类型转为 JDBC 类型, 在映射结果集时再由 JDBC 类型转为 Java 类型

另外一个功能就是提供别名机制, 简化了配置文件的定义

3.2.3 日志模块

日志对于系统的作用不言而喻, 尤其是测试、生产环境上查看信息及排查错误等都非常重要。主流的日志框架包括 Log4j、Log4j2、S l f4j 等, mybatis 的 日志模块作用就是 集成这些日志框架

3.2.4 资源加载

mybatis 对类加载器进行了封装, 用来确定类加载器的使用顺序, 用来记载类文件以及其它资源文件, 感兴趣可以参考 ClassLoaderWrapper

3.2.5 解析器模块

解析器模块主要提供了两个功能, 一个是封装了 XPath 类, 在 mybatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供功能, 另一点就是处理动态 SQL 语句的占位符提供帮助

3.2.6 ...

3.3 核心处理层

3.3.1 配置解析

在 mybatis 初始化时, 会加载 mybatis-config.xml 文件中的配置信息, 解析后的 配置信息会转换成 Java 对象添加到 Configuration 对象

比如说在 .xml 中定义的 resultMap 标签, 会被解析为 ResultMap 对象

3.3.2 SQL 解析

大家如果手动拼写过复杂 SQL 语句, 就会明白会有多痛苦。mybatis 提供出了 动态 SQL, 加入了许多判断循环型标签, 比如 : if、where、foreach、set 等, 帮助开发者 节约了大量的 SQL 拼写时间

SQL 解析模块的作用就是将 mybatis 提供的动态 SQL 标签解析为带占位符的 SQL 语句, 并在后期将实参对占位符进行替换

3.3.3 SQL 执行

SQL 的执行过程涉及几个比较重要的对象, Executor、StatementHandler、ParameterHandler、ResultSetHandler

Executor 负责维护 一级、二级缓存以及事务提交回滚操作, 举个查询的例子, 查询请求会由 Executor 交给 StatementHandler 完成

StatementHandler 通过 ParameterHandler 完成 SQL 语句的实参绑定, 通过 java.sql.Statement 执行 SQL 语句 并拿到对应的结果集映射

最后交由 ResultSetHandler 对 结果集进行解析, 将 JDBC 类型转换为程序自定义的对象

3.3.4 插件

插件模块是 mybatis 提供的一层扩展, 可以针对 SQL 执行的四大对象进行 拦截并执行自定义插件

插件编写需要很熟悉 mybatis 运行机制, 这样才能控制编写的插件安全、高效

3.4 接口层

接口层只是 mybatis 提供给调用端的一个接口 SqlSession, 调用端在进行调用接口中方法时, 会调用 核心处理层相对应的模块来完成数据库操作

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
人工智能 API 数据安全/隐私保护
Apifox 与 Apipost 的 API 文档引擎对比:底层架构、性能与可扩展性分析
深入探索市场上两大主流API工具——Apifox和Apipost的文档能力时,发现了令人惊讶的差距。这不仅仅是功能多寡的问题,更关乎开发效率与团队协作的质变。
|
人工智能 自然语言处理 数据可视化
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
两大 智能体框架 Dify vs Langchain 的全面分析,该怎么选?资深架构师 做一个彻底的解密
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
1021 6
|
Java API 开发工具
灵码产品演示:软件工程架构分析
本演示展示灵码对复杂软件项目的架构分析与文档生成能力。通过Qwen3模型,结合PlantUML,自动生成系统架构图、微服务时序图,并提取API接口文档,实现高效、智能的代码理解与文档输出。
702 5
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
565 1
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
机器学习/深度学习 安全 算法
十大主流联邦学习框架:技术特性、架构分析与对比研究
联邦学习(FL)是保障数据隐私的分布式模型训练关键技术。业界开发了多种开源和商业框架,如TensorFlow Federated、PySyft、NVFlare、FATE、Flower等,支持模型训练、数据安全、通信协议等功能。这些框架在灵活性、易用性、安全性和扩展性方面各有特色,适用于不同应用场景。选择合适的框架需综合考虑开源与商业、数据分区支持、安全性、易用性和技术生态集成等因素。联邦学习已在医疗、金融等领域广泛应用,选择适配具体需求的框架对实现最优模型性能至关重要。
3097 79
十大主流联邦学习框架:技术特性、架构分析与对比研究
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
1179 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
|
存储 前端开发 JavaScript
如何开发设备管理系统中的经验分析报表板块 ?(附架构图+流程图+代码参考)
设备管理系统(EMS)助力企业高效管理设备生命周期,涵盖采购、维护到报废全流程。本文详解经验分析报表模块设计与开发,涵盖动态看板、点检、巡检、维修、保养及库存统计功能,提供代码示例与架构设计建议,提升设备管理效率与决策水平。
|
SQL 运维 BI
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构
浙江霖梓早期基于 Apache Doris 进行整体架构与表结构的重构,并基于湖仓一体和查询加速展开深度探索与实践,打造了 Doris + Paimon 的实时/离线一体化湖仓架构,实现查询提速 30 倍、资源成本节省 67% 等显著成效。
1160 3
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构