SSM《MyBatis技术内幕揭秘》笔记

第1章 MyBatis快速入门

1.ORM简介

1.JDBC

JDBC Java 与数据库交互的统一API,实际上它分为两组 API :

  • 面向 Java 应用程序开发人员的 API :标准的 JavaAPI,独立于各个厂家的数据库实现。
  • 面向数据库驱动程序开发人员的 API :用来给数据库驱动程序开发人员用于编写数据库驱动,是前者的底层支持
2.用JDBC操作DB

用JDBC操作数据,一般步骤如下:

  1. 注册驱动:注册数据库驱动 ,明确指定数据库 URL 地址、数据库用户名、密码等连接信息。
  2. 打开连接:通过 DriverManager 打开数据库连接。
  3. 创建Statement:通过数据库连接创建 Statement 对象。
  4. 获取ResultSet:通过 Statement 对象执行 SQL 语句,得到 ResultSet 对象。
  5. 解析ResultSet:通过 ResultSet 读取数据,并将数据转换成 JavaBean 对象。
  6. 关闭连接及资源:关闭 ResultSet Statement 对象以及数据库连接,释放相关资源。

上述1-4步,以及第6步,都是重复的。可以封装起来。

3.ORM

ORM ( Object Relational Mapping ,对象关系映射),就是用来封装上述重复步骤的。

ORM封装了上述重复操作,并且通过集成缓存数据源数据库连接池等组件来进行访问优化。

第三方缓存、第三方数据源等组件的接口,一般都是业界统一的,可以根据需要灵活替换

如果不用ORM框架,那么你的DAO也会被重构成类似ORM的框架(dog

2.常见持久化框架

常见的框架有:

Hibernate:老牌的 ORM 框架, 替代了复杂 Java EE EJB 解决方案。可以实现对象模型与关系模型的映射,还可以屏蔽不同数据库产品 SQL 语句细微差异。

JPA(Java Persistence API) :EJB 3.0中持久化部分的规范,但它可以脱离 EJB 的体系单独使用。Gavin King 作为 Hibernate 创始人,同时也参与了 JPA 规范的编写,所以在 JPA 规范中可以看到很多与Hibernate 类似的概念和设计。JPA 仅仅是一个持久化的规范,它并没有提供具体的实现。其他持久化厂商会提供 JPA 规范的具体实现,例如, Hibernate。实践中少用。

Spring JDBC:仅仅是使用模板方式对原生 JDBC进行了一层非常薄的封装。直接执行原生 SQL 语句。Spring JDBC 中提供了 多种 Template 类,可以将对象中的属性映射成 SQL 语句中绑定的参数。

MyBatis:MyBatis 通过映射配置文件或相应注解将 ResultSet 映射为 Java 对象。相较于 Hibernate, MyBatis 更加轻量级。提供了动态SQL,执行原生的SQL也让我们有优化SQL的机会。也提供缓存机制。

3.MyBatis示例(略)

4.MyBatis 整体架构

MyBatis 的整体架构分为三层:

  • 基础支持层
  • 核心处理层
  • 接口层

如下图所示:

image-20210503210944250

1.基础支持层

基础支持层包含整个 MyBatis 的基础模块,用来支撑核心处理层。主要如下:

  • 反射模块:对 Java 原生的反射进行了良好的封装和优化,提供了更加简洁易用的 API ,方便上层使调用。
  • 类型转换模块:1.支持简化配置文件的别名机制。2.实现 JDBC 类型与 Java 类型之间的转换。该功能在为 SQL 语句绑定实参以及隐射查询结果集都会涉及。
  • 日志模块:主要功能是集成第三方日志框架。
  • 资源加载模块:对类加载器进行封装,确定类加载器的使用顺序。并提供了加载类文件以及其他资源文件的功能。
  • 解析器模块:1.封装XPath,用来支持MyBatis初始时解析 mybatis-config.xml 配置文件以及映射配置文件。2.为处理动态 SQL 语句中的占位符提供支持。
  • 数据源模块:MyBatis 自身提供了相应的数据源实现,也提供了与第三方数据源集成的接口。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能检测连接状态等。
  • 事务管理:对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。一般使用时是集成Spring框架,用Spring来进行事务管理。
  • 缓存模块:MyBatis 提供了一级缓存和二级缓存,底层由该模块支持。MyBatis提供的缓存和应用处于同一个JVM,量较大时,需要考虑其他缓存,如Redis。
  • Binding 模块:在调用 SqI Session 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点。为了减少错误,MyBatis 通过 Binding 模块将用户自定义的 Mapper口与映射配置文件关联起来,这样就无需手动指定。开发人员无须编写自定义 Mapper 接口的实现, MyBatis 会自动为其创建动态代理对象。在有些场景中,自定义 Mapper 接口可以完全代替映射配置文件。
2.核心处理层

核心处理层实现了 MyBatis 的核心处理流程,包括 MyBatis 的初始化以及完成一次数据库操作涉及的全部流程。包含模块如下:

  • 配置解析:主要是初始化解析配置文件:

    1. 加载 mybatis-config.xml 配置文件映射配置文件以及Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。例如:<resultMap>节点 -》ResultMap对象,<result>节点 -》ResultMapping对象。
    2. 利用该 configuration 对象创建 SqlSessionFactory 对象。
    3. MyBatis 初始化之后,可以通过初始化得到 SqlSessionFactory 创建 SqlSession 对象并完成数据库操作。
  • SOL 解析与 scripting 模块:主要是处理动态SQL。会根据用户传入的实参,解析映射文件中定义的动态 SQL节点,并形成数据库可执行的 SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参

  • SOL 执行:涉及多个组件 ,其中比较重要的是 Executor、StatementHandler、ParameterHandler、RsultSetHandler。

    • Executor:维护一级缓存和二级缓存,并提供事务管理的相关操作。它会将数据库相关操作委托给 StatementHandler 完成。

    • StatementHandler:首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过java.sql.Statement 象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回 。

      整体示意图如下:

      image-20210503213442401

  • 插件:可以通过添加用户自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也可以改变 Mybatis 默认行为,例如,我们可以拦截 SQL 语句并对其

    进行重写。编写插件前,对MyBatis核心原理要熟悉。

3.接口层

接口层相对简单,其核心是 SqlSession 接口。

SqlSession 接口中定义了 MyBatis 暴露给应用程序调用的API ,也就是上层应用与 MyBatis 交互的桥梁。

接口层在接收到 调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。

小结

提问

什么是ORM?

MyBatis整体架构?

后续补充:Mapper接口的动态代理如何实现?如何绑定到<Mapper>节点。

第2章 基础支持层(略)

第3章 核心处理层(略)

第4章 高级主题(略)


转载请注明来源