システムアーキテクチャの概要をmybatis-

1.概要

本論文では、MyBatisのシェアのプロジェクト構造。

プロジェクト構造

2.統計コード

ここでちょっとしたトリックを共有することができます。私はそれがアイテムのコードを理解することが初めてとなる、ソースコードの先頭に学びます。

使用した最初の方法、  IDEA統計  プラグインは、コード統計の全体量を。

統計統計的符号量

私たちは、およそ21441行のコードの合計額を見ることができます。または許容範囲内。

使用して、第2の方法は、  シェルスクリプトコマンド・バイ・モジュールのMavenの統計情報を  。

通常の状況下では、著者が使用します  find . -name "*.java"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l 。このコマンドは、ノートの一部をフィルタリングし、比較した  IDEAの統計では  、通常よりも高くなります。

次はナイナイある  cd 次の各パケットに、スクリプトの統計情報の実装のその後の結果:

統計統計的符号量

3.全体的なアーキテクチャ

旧ナイナイ:このセクションの内容は、作者はに基づいて行われます  「MyBatisの技術インサイダー」  の  「1.4 MyBatisの全体的な枠組み」  書くためのセクション。

この本は、灰色がしばしば大きな助け著者サイケソース非常に良いです。

MyBatisの全体的なアーキテクチャは3層に分かれています。

  1. ベース支持層
  2. コア処理層
  3. 界面層

全体的なアーキテクチャ

3.1ベース支持層

コア処理機能層のための良好なサポートを提供するMyBatisのベースモジュールの全体を含むベース支持層、。

3.1.1反射モジュール

対応する  reflection パケット。

Javaリフレクション強力な、しかし、ほとんどの開発者のために、高品質なコードを書いたり、特定の難しさを反映しているが。それは、APIを入れて、よりシンプルかつ簡単に、特に反射モジュールに設けられたJavaネイティブを反映したモジュールは良いパッケージを持っていたMyBatisの反射を最適化するために、上を容易にするために呼び出し、一連の動作を行い、例えばキャッシュクラスメタデータは、反射操作のパフォーマンスを向上させること。

3.1.2型モジュール

対応する  type パケット。

① MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。

② 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及:

  • 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。
  • 而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。

3.1.3 日志模块

对应 logging 包。

无论在开发测试环境中,还是在线上生产环境中,日志在整个系统中的地位都是非常重要的。良好的日志功能可以帮助开发人员和测试人员快速定位 Bug 代码,也可以帮助运维人员快速定位性能瓶颈等问题。目前的 Java 世界中存在很多优秀的日志框架,例如 Log4j、 Log4j2、Slf4j 等。

MyBatis 作为一个设计优良的框架,除了提供详细的日志输出信息,还要能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。

3.1.4 IO 模块

对应 io 包。

资源加载模块,主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能 。

3.1.5 解析器模块

对应 parsing 包。

解析器模块,主要提供了两个功能:

  • 一个功能,是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。
  • 另一个功能,是为处理动态 SQL 语句中的占位符提供支持。

3.1.6 数据源模块

对应 datasource 包。

数据源是实际开发中常用的组件之一。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等,选择性能优秀的数据源组件对于提升 ORM 框架乃至整个应用的性能都是非常重要的。

MyBatis 自身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。

3.1.7 事务模块

对应 transaction 包。

MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。

在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务。

3.1.8 缓存模块

对应 cache 包。

在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。

MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓 存模块实现的。这里需要读者注意的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时,优先考虑使用 Redis、Memcache 等缓存产品。

3.1.9 Binding 模块

对应 binding 包。

在调用 SqlSession 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点,如果出现拼写错误,我们只能在运行时才能发现相应的异常。为了尽早发现这种错误,MyBatis 通过 Binding 模块,将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作,从而避免上述问题。

值得读者注意的是,开发人员无须编写自定义 Mapper 接口的实现,MyBatis 会自动为其创建动态代理对象。在有些场景中,自定义 Mapper 接口可以完全代替映射配置文件,但有的映射规则和 SQL 语句的定义还是写在映射配置文件中比较方便,例如动态 SQL 语句的定义。

3.1.10 注解模块

对应 annotations 包。

随着 Java 注解的慢慢流行,MyBatis 提供了注解的方式,使得我们方便的在 Mapper 接口上编写简单的数据库 SQL 操作代码,而无需像之前一样,必须编写 SQL 在 XML 格式的 Mapper 文件中。虽然说,实际场景下,大家还是喜欢在 XML 格式的 Mapper 文件中编写响应的 SQL 操作。

3.1.11 异常模块

对应 exceptions 包。

定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。

3.2 核心处理层

在核心处理层中,实现了 MyBatis 的核心处理流程,其中包括 MyBatis 的初始化以及完成一次数据库操作的涉及的全部流程 。

3.2.1 配置解析

对应 builder 和 mapping 模块。前者为配置解析过程,后者主要为 SQL 操作解析后的映射。

在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。例如:

  • <resultMap>节点(即 ResultSet 的映射规则) 会被解析成 ResultMap 对象。
  • <result> 节点(即属性映射)会被解析成 ResultMapping 对象。

之后,利用该 Configuration 对象创建 SqlSessionFactory对象。待 MyBatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 创建 SqlSession 对象并完成数据库操作。

3.2.2 SQL 解析

对应 scripting 模块。

拼凑 SQL 语句是一件烦琐且易出错的过程,为了将开发人员从这项枯燥无趣的工作中 解脱出来,MyBatis 实现动态 SQL 语句的功能,提供了多种动态 SQL语句对应的节点。例如<where> 节点、<if> 节点、<foreach> 节点等 。通过这些节点的组合使用, 开发人 员可以写出几乎满足所有需求的动态 SQL 语句。

MyBatis 中的 scripting 模块,会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。

3.2.3 SQL 执行

对应 executor 和 cursor 模块。前者对应执行器,后者对应执行结果的游标。

SQL 语句的执行涉及多个组件 ,其中比较重要的是 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler 。

  • Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler完成。
  • StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过 java.sql.Statement 对象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回。

整体过程如下图:

全体のプロセス

3.2.4 插件层

对应 plugin 模块。

MyBatisの独自機能、パワフルながら、そうではありません完全にスーツのすべてのアプリケーションシナリオを行い、MyBatisのプラグインインタフェースを提供しますので、我々はMyBatisの上のプラグインは、ユーザーを追加することによって拡張することが方法をカスタマイズすることができます。カスタムプラグインもMyBatisのは、例えば、我々はSQL文を傍受し、それらを書き換えることができるデフォルトの動作を変更することができます。

カスタムプラグインは、前にカスタムプラグインを使用して、MyBatisのコアの動作に影響しますので、開発者は、安全で効率的なプラグインを作成するために、内部MyBatisの原理を理解する必要があります。

3.3インタフェースレイヤ

対応する  session モジュール。

界面層は比較的簡単で、アプリケーションに露出MyBatisのを規定するコアであるSQLSESSIONインターフェースは、上位アプリケーションはMyBatisのブリッジと相互作用しているAPIを呼び出します。界面層の呼び出し要求を受信すると、コア処理モジュールは、特定のデータベース操作を実行するために対応する層を呼び出します。

3.4他の層

これは、厳密に言えば、層と呼ぶことができません。

3.4.1 JDBCモジュール

対応する  jdbc パケット。

JDBCユニットテストツール。

3.4.2ラングモジュール

対応する  lang パケット。

3.4概要

全体的に、MyBatisのコードは、それを理解することは非常に簡単です。そして、パッケージ名を見て、基本的な目的は、一般的に推測しています。あなたはシュシュ、ネットワーク上の要約チャートを探します:

FROM  「全体的なアーキテクチャのMyBatisの分析のソースコード解析」

ブロック図

おすすめ

転載: www.cnblogs.com/siye1989/p/11619197.html