前言

00、持久层

持久层指的是:将业务数据存储到磁盘,也具备长期存储能力,只要磁盘不损坏,如果在断电情况下,重启系统仍然可以读取数据。
持久是相对于瞬时来说的,其实就是可以把数据固化在硬盘或者磁带一类可以保存很长时间的设备上,不像放在内存中一样断电就消失了。企业应用中数据很重要(各种订单数据、客户数据、库存数据之类的),比应用程序本身更重要,所以需要把数据持久化。持久化可以通过很多方式,写文件和数据库都可以。只是现在企业一般都会选择把数据持久化到数据库中,因为可以很方便的查询统计分析,但数据库的数据最终还是会写到磁盘上的。Java 程序员为了操作数据库,最开始是使用JDBC来进行的,但是这种方式开发效率低,要写一堆重复代码,加上关系数据库和对象本身存在所谓的阻抗不匹配情况,所以为了提高开发效率,有人发明了 ORM 即 对象关系映射框架(Hibernate是其中的佼佼者),对于 Java 程序员来说,就可以通过操纵对象来操纵数据库了。

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(对象关系映射(Object Relational Mapping,简称ORM))框架,使用 Java 语言 编写

前身是 apache 的一个开源项目 iBatis,2010 年迁移到 google code 并正式改名为 mybatis。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
Mybatis其实是对jdbc的操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
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, 调用端在进行调用接口中方法时, 会调用 核心处理层相对应的模块来完成数据库操作

04、SSM

SSM是一个框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。

什么是持久层? 什么是JDBC ?什么又是 Mybatis?什么是SSM?相关推荐

  1. MiniDao (轻量级JAVA持久层,Hibernate完美助手)

    MiniDao (轻量级JAVA持久层,Hibernate完美助手) 当前最新版本: 1.6.4 (发布日期:20180604) MiniDao产生的初衷? 采用Hibernate的J2EE项目都有一 ...

  2. mybatis plus关联查询_Mybatis 和 Hibernate 持久层框架之间的区别是啥?

    首先,Mybatis 和 Hibernate 都是 ORM 持久层框架,不同点在于,MyBatis 是半自动的,它需要开发人员自己手动编写 SQL 语句. 一.Mybatis MyBatis 支持通过 ...

  3. hibernate 根据用户名获取用户对象_Mybatis 和 Hibernate 持久层框架之间的区别是啥?...

    首先,Mybatis 和 Hibernate 都是 ORM 持久层框架,不同点在于,MyBatis 是半自动的,它需要开发人员自己手动编写 SQL 语句. 一.Mybatis MyBatis 支持通过 ...

  4. sqlaction 更新至 v0.2.1.0,自动生成 JDBC 代码的数据库持久层工具

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   0.2.1.0        2019-04-17        calvin             * 新增拦截器"@@STA ...

  5. 持久层和数据访问层_什么是持久层? JDBC 演变的 Mybatis 架构分析

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

  6. SpringBoot配置Druid数据源,持久层分别 mybatis,jdbc

    Druid与mybatis整合: application.yaml 配置参数文件 spring:datasource:#driver-class-name: com.mysql.jdbc.Driver ...

  7. mybatis和spring jdbc持久层框架事务支持分析

    mybatis和spring jdbc持久层框架事务支持分析 ​ 持久层框架中的事务支持指的是持久层框架如何支持数据库事务,我们先梳理出原生数据库事务操作的主线脉络,它是通过java.sql 包下的C ...

  8. Java数据库持久层框架基础:jdbc原理和使用综述

    Java数据库持久层框架基础:jdbc原理和使用综述 前言 jdbc基础架构 jbdc的使用 jdbc的主要接口 驱动 连接 连接池 会话Statement 结果集ResultSet 前言 目前jav ...

  9. Spring基础专题——第七章(持久层整合)

    前言:去年到现在一直没有很好的时间完成这个spring基础+源码的博客目标,去年一年比较懒吧,所以今年我希望我的知识可以分享给正在奋斗中的互联网开发人员,以及未来想往架构师上走的道友们我们一起进步,从 ...

最新文章

  1. 她92年的,27岁,当上浙大博导。
  2. 如何修复“ android.os.NetworkOnMainThreadException”?
  3. CGI与Servlet的区别和联系
  4. python入门简介
  5. 游戏引擎和编程语言的关系
  6. 如何使用git上传本地文件到码云上【详细步骤】
  7. poi实现Excel导入导出依赖
  8. adb 抓取日志到指定文件,文件命名为当前电脑时间
  9. android 保活方案_Android 后台保活手段总结 (上篇)
  10. 微信养猫小程序源码搭建教程
  11. oracle恢复RAC到单机
  12. matplotlib柱状图_Python可视化很简单,一文学会绘制柱状图、条形图和直方图
  13. 举例 微积分 拉格朗日方程_Euler-Lagrange Equation (欧拉-拉格朗日方程)推导
  14. retrofit框架学习(二)----retrofit封装
  15. 钓鱼网站新花招 福彩赌球成噱头
  16. PDF单位尺寸与像素转换
  17. 简单易懂读《重构》 - Refused Bequest (拒绝继承的遗赠)
  18. 删除硬盘文件夹失败解决方法
  19. 分区字段VALUES LESS THAN时间格式及转换
  20. 在Windows Server 2008和Vista中增加恢复菜单WinRE

热门文章

  1. (幻彩)贪吃蛇游戏设计源码
  2. redis基础:8、主从复制
  3. windows上ubuntu双系统安装+ROS配置全过程+小海龟+RVIZ
  4. JBOSS EAP实战(1)
  5. [Python嗯~机器学习]---机器学习推荐系统简述
  6. c语言的5种常用排序方法
  7. php 函数 全局变量,PHP函数内访问全局变量
  8. android短信和电话拦截
  9. 【论文笔记04】Model-driven approach for the design of multi-chainsmart contracts—用于设计多链智能合约的模型驱动方法
  10. 关于卫片美化卫星图美化卫星图色差化问题的解决方案