前言

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 接口称之为 驱动

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);// 创建Statementstate = 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 架构图

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, 调用端在进行调用接口中方法时, 会调用 核心处理层相对应的模块来完成数据库操作

持久层和数据访问层_什么是持久层? JDBC 演变的 Mybatis 架构分析相关推荐

  1. 神经网络隐藏层个数怎么确定_含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业)...

    含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业): ''' 题目: 建立只有一个隐藏层的神经网络, 对于给定的一个类似于花朵的图案数据, 里面有红色(y=0)和 ...

  2. 持久层是什么意思_软件项目实训及课程设计指导—如何在数据持久层中应用DAO模式...

    软件项目实训及课程设计指导--如何在J2EE应用系统数据持久层中应用DAO模式 1.为什么要在软件应用系统中提供数据持久层 软件应用系统中的数据持久层主要为整个软件应用系统提供数据访问功能服务,从而可 ...

  3. 基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改

    基于51单片机的多层电梯(1-16层)运行系统仿真设计_层数可改 仿真图proteus 8.9 程序编译器:keil 4/5 编程语言:C语言 设计编号:S0027 视频演示 基于51单片机的多层电梯 ...

  4. 数据仓库ods层是啥意思_数据仓库和数据分层

    数据仓库,Data Warehouse,可简写为DW或DWH.是面向主题的.集成的(非简单的数据堆积).相对稳定的.反应历史变化的数据集合,数仓中的数据是有组织有结构的存储数据集合,用于对管理决策过程 ...

  5. SpringBoot - 实践阿里巴巴【Manager 层_通用业务处理层】

    文章目录 规范 对比传统MVC 小栗子 V1.0 传统写法 V2.0 引入Manager层 源码 规范 对比传统MVC 说几个弊端 Service层代码臃肿 Service层易出现大事务,事务嵌套,易 ...

  6. cnn池化层输入通道数_(pytorch-深度学习系列)CNN中的池化层-学习笔记

    CNN中的池化层 首先,池化(pooling)层的提出是为了缓解卷积层对位置的过度敏感性. 什么意思? 比如在图像边缘检测问题中,实际图像里,我们的目标物体不会总出现在固定位置,即使我们连续拍摄同一个 ...

  7. 层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...

    点击上方"蓝字",关注我们吧! 目标检测是计算机视觉领域的一项重要任务, 是 生活中如实例分割[1] , 面部分析[2] , 汽车自动驾驶[3].视 频分析[4] 等各种视觉应用的 ...

  8. dao层如何调用对象_以k8s集群管理为例,大牛教你如何设计优秀项目架构

    架构设计一直是技术人的关注热点,如何设计一个更优的架构对于实际的业务来说至关重要.本文腾讯云专家将从自身从事的一个k8s集群管理项目为例,重点剖析在项目开发过程中的三次架构演进历程,即针对项目最早版本 ...

  9. div显示在上层_将某个div层显示在最上面(总结)

    今天遇到的这个问题,挺奇葩的.客户要求又联想输入(一台服务器支持).昨天已经做好一部分,今天要做的有些困难,因为现在这个联想列表是弹出来的一层. 大概是这样的,用户点击某个按钮,弹出一个层.然后在这里 ...

最新文章

  1. java excel 导出_java导出Excel通用方法实例
  2. phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置
  3. NOIP2015 D1 解题报告
  4. hadoop 单节点安装
  5. 树——通用树到二叉树的转换
  6. 编码-京东实习笔试编程题-生日礼物-动态规划
  7. SqlServer修改sa的密码
  8. python 字典排序成绩_原来python中dict()的高级用法可以这样实现!真是让我长了见识...
  9. 计算平均指令时间_欧姆龙PLC指令应用案例(问答解析)
  10. STM32+华为云IOT设计的动态密码锁
  11. seacms海洋cms漏洞
  12. 哔咔漫画怎样切换横屏?
  13. 蓝桥杯 算法提高 9-2 文本加密(c语言版详细注释)
  14. 亿级流量电商详情页系统的大型高并发与高可用缓存架构实战
  15. CreateJS-SoundJS翻译
  16. 使用wordpress建立企业或博客网站新手教程
  17. 简单工厂SimpleFactory
  18. 增值税发票二维码内容字段解析
  19. 拼多多破1000亿美金,黄峥逆袭成中国第3富豪,他自述:我的人生经历和创业理念...
  20. 半路出家,5年Java经验,五面阿里艰苦经历(定薪45K),回馈一波心得体会

热门文章

  1. Android知识总结——Path常用方法解析
  2. 《深入理解并行编程》中文版
  3. Maven自动压缩脚本 和 样式文件配置
  4. 【SSH网上商城】struts搭建及实例
  5. 强制卸载Lync Server脱机的CMS并在新位置重建
  6. Latex写分段函数
  7. linux lamp实验报告,新手学Linux--构建lamp
  8. 有linux服务器用来干什么用的,linux集群能干什么
  9. python多进程运行死机_python多进程假死
  10. 数值范围_量比指标怎么看?量比数值的意义