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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
简介: 什么是持久层? 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, 调用端在进行调用接口中方法时, 会调用 核心处理层相对应的模块来完成数据库操作

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
17天前
|
消息中间件 运维 Kubernetes
探索微服务架构的演变与实践
在软件开发的长河中,微服务架构如同一股清流,它改变了我们构建和部署应用的方式。本文将深入探讨微服务架构从诞生到成熟的发展历程,分析其核心价值与面临的挑战,并分享实践中的经验教训。通过具体案例,我们将揭示如何在不断变化的技术生态中有效运用微服务架构,以及如何克服实施过程中的障碍。
|
1月前
|
边缘计算 人工智能 Cloud Native
云原生架构的演变与未来展望
在数字化转型的浪潮中,云原生技术成为企业IT战略的核心。本文深入探讨了云原生架构从起步到成熟的发展脉络,分析了容器化、微服务和持续交付等关键技术如何推动应用现代化,并预测了云原生技术的未来趋势,如边缘计算、AI增强和多云管理。同时,文章也对云原生实践过程中可能遇到的安全挑战、技术复杂性以及人才缺口问题提出了见解,旨在为读者提供一份全面的云原生技术指南。
|
5天前
|
消息中间件 存储 大数据
大数据-数据仓库-实时数仓架构分析
大数据-数据仓库-实时数仓架构分析
20 1
|
9天前
|
运维 监控 持续交付
探索微服务架构的演变与实践
在数字化浪潮推动下,微服务架构如同细胞分裂般不断演化,孕育出更灵活、高效的系统设计哲学。本文将带你穿梭于微服务的发展历程,解锁其背后的技术密码,并分享构建和部署微服务的实践智慧。从理论到实战,我们将一同见证微服务如何重塑现代应用开发的面貌。
18 2
|
14天前
|
运维 负载均衡 数据管理
探索微服务架构的演变与实践
本文将深入探讨微服务架构的概念、发展及其在现代软件开发中的应用。通过分析微服务架构的核心优势和面临的挑战,结合实际案例,揭示如何有效实施微服务以提升系统性能和可维护性。文章旨在为读者提供一套清晰的微服务采用指南,帮助团队做出更明智的技术选择。
|
14天前
|
机器学习/深度学习 敏捷开发 运维
探索后端架构的演变与未来趋势
【8月更文挑战第5天】在数字化时代的浪潮下,后端架构作为支撑现代网络应用的骨架,经历了从单体应用到微服务、再到无服务器计算的转变。每一次技术的跃进不仅提升了开发效率,也带来了新的挑战和思考。本文将深入探讨后端架构的演变路径,分析当前面临的主要问题,并展望未来可能的发展方向。
|
19天前
|
运维 Cloud Native Devops
云原生架构的演变与实践
【7月更文挑战第31天】本文将深入探讨云原生技术如何从概念走向成熟,并分析其对企业IT架构的影响。我们将从云原生的基本概念出发,逐步剖析其在现代软件开发和运维中的关键作用,以及如何通过实践案例来理解云原生架构的优势和挑战。文章旨在为读者提供一套实用的云原生应用指南,帮助他们在数字化转型的浪潮中乘风破浪。
26 4
|
24天前
|
运维 Cloud Native 持续交付
探索云原生架构的演变与实践
随着企业数字化转型的步伐加快,云原生技术成为推动这一进程的核心动力。本文将深入探讨云原生架构的发展历程,解析其核心技术组件,并通过实际案例展现云原生在现代IT架构中的应用与挑战。从容器化、微服务到自动化运维,我们将一窥云原生如何重塑软件开发与运维模式,并预见其对未来技术生态的影响。
|
3天前
|
边缘计算 安全 物联网
未来互联网架构的演变
【8月更文挑战第16天】随着科技的不断进步,互联网作为现代社会不可或缺的基础设施,其架构也在不断地发展与演变。本文将探讨未来互联网架构可能的变化方向,包括边缘计算、软件定义网络(SDN)、网络功能虚拟化(NFV)等技术趋势,以及这些技术如何影响互联网的稳定性、安全性和效率。同时,文章还将讨论这些变革对用户隐私保护和数据治理的潜在影响,并展望互联网架构的未来发展趋势。
|
26天前
|
供应链 负载均衡 数据库
软件架构一致性问题之分析代码修改的 Scalability如何解决
软件架构一致性问题之分析代码修改的 Scalability如何解决
28 1