MyBatis架构图

MyBatis架构

MyBatis依赖的jar不多,而且代码行数也没多少,其中使用了大量的设计模式,值得好好学习。下图是MyBatis的一张架构图,来自Java框架篇—Mybatis 入门

Mybatis的功能架构分为三层:

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

MyBatis整个项目的包结构如下:

.
└── org
    └── apache
        └── ibatis
            ├── annotations
            ├── binding
            ├── builder
            ├── cache
            ├── cursor
            ├── datasource
            ├── exceptions
            ├── executor
            ├── io
            ├── jdbc
            ├── logging
            ├── mapping
            ├── parsing
            ├── plugin
            ├── reflection
            ├── scripting
            ├── session
            ├── transaction
            └── type
 

1.兵马未动,日志先行

org.apache.ibatis.logging

org.apache.ibatis.logging.commons

org.apache.ibatis.logging.jdbc

org.apache.ibatis.logging.jdk14

org.apache.ibatis.logging.log4j

org.apache.ibatis.logging.log4j2

org.apache.ibatis.logging.nologging

org.apache.ibatis.logging.slf4j

org.apache.ibatis.logging.stdout

2.异常

org.apache.ibatis.exceptions

3.缓存

org.apache.ibatis.cache

org.apache.ibatis.cache.decorators

org.apache.ibatis.cache.impl

4.解析

org.apache.ibatis.parsing

xml解析,${} 格式的字符串解析

源码分析可以参考http://www.cnblogs.com/sunzhenchao/p/3161093.html

5.类型处理器

org.apache.ibatis.type

实现java和jdbc中的类型之间转换

源码分析可以参考http://www.cnblogs.com/sunzhenchao/archive/2013/04/09/3009431.html

6.IO

org.apache.ibatis.io

通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类

7.反射

org.apache.ibatis.reflection

org.apache.ibatis.reflection.factory

org.apache.ibatis.reflection.invoker

org.apache.ibatis.reflection.property

org.apache.ibatis.reflection.wrapper

可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类


8.数据源

org.apache.ibatis.datasource

org.apache.ibatis.datasource.jndi

org.apache.ibatis.datasource.pooled

org.apache.ibatis.datasource.unpooled

9.事务

org.apache.ibatis.transaction

org.apache.ibatis.transaction.jdbc

org.apache.ibatis.transaction.managed

10.会话

org.apache.ibatis.session

org.apache.ibatis.session.defaults

11.jdbc单元测试工具

org.apache.ibatis.jdbc

12.构建

org.apache.ibatis.builder

org.apache.ibatis.builder.annotation

org.apache.ibatis.builder.xml

13.映射

org.apache.ibatis.mapping

14.脚本

org.apache.ibatis.scripting

org.apache.ibatis.scripting.defaults

org.apache.ibatis.scripting.xmltags

15.注解

org.apache.ibatis.annotations

16.绑定

org.apache.ibatis.binding

17.执行器

org.apache.ibatis.executor

org.apache.ibatis.executor.keygen

org.apache.ibatis.executor.loader

org.apache.ibatis.executor.loader.cglib

org.apache.ibatis.executor.loader.javassist

org.apache.ibatis.executor.parameter

org.apache.ibatis.executor.result

org.apache.ibatis.executor.resultset

org.apache.ibatis.executor.statement

18.插件

org.apache.ibatis.plugin



image002

注释①

mybatis通过SqlSessionFactoryBuilder作为入口,通过传入配置文件,使用了BaseBuilder实现类进行配置文件解析,具体实现类是XMLConfigBuilder,在这里mybatis对配置的项进行了全面解析,只不过不是所有的解析都放在了XMLConfigBuilder,XMLConfigBuilder解析了二级节点,并作为一个总入口,还有另外几个类继承了BaseBuilder,用于解析不同的配置。而解析到的配置项信息,基本都保存在了Configuration这个类,可以看到多处地方依赖到它。

之后通过配置获取到SqlSessionFactory,可以看到SqlSessionFactoryBuilder提供了一个build方法,就是返回SqlSessionFactory的。

注释②

而SqlSessionFactory只是一个接口,默认实现有DeaultSqlSessionFactory。通过SqlSessionFactory.openSession的几个多态方法,可以获取到SqlSession。

注释③

而SqlSession也只是一个接口,怎么理解SqlSession呢,其实Session即是一次会话,假如我们把某次请求与数据库连接Connection的交互,看成是一次会话,那就可以理解SqlSession了。SqlSession是请求与数据库的一次交互,交互完成之后,Session则结束,但Session结束不代表数据库连接也关闭,只是这次会话终止了,但是数据库连接依旧是返回给连接池。

这里的SqlSession即是对一次交互信息的封装,请求可以通过SqlSession的方法(如图:CRUD )进行操作,而数据库连接,依旧由SqlSessionFactory注入。

注释②

如图我们可以看到SqlSessionFactory获取到TransactionFactory,一个事务的工厂类接口,而通过这个工厂具体实现类可以产生多个事务Transaction(具体参考ManagedTransactionFactory),Transaction抽象了一个方法getConnection,通过这个方法我们可以获取到不同事务级别的connection。mybatis的代码是这样的:

ManagedTransaction.java

protected void openConnection() throws SQLException {
if (log.isDebugEnabled()) {
log.debug(“Opening JDBC Connection”);
}
this.connection = this.dataSource.getConnection();
if (this.level != null) {
this.connection.setTransactionIsolation(this.level.getLevel());
}
}

注释④

这个时候可能大家觉得万事俱备了,SqlSession都定义好了CRUD 方法了,那它也会帮忙将语句扔给Connection操作,其实不然。这里mybatis还抽象了接口Execute。

Execute才是真正将sql与Connection打交道的地方。

图中我们可以看到Execute有四个实现类,通过名称我们不难发现它们各自的用途,例如CachingExecutor.java,mybatis默认是有缓存的,就是通过这个类实现的。

还有一个点,每个Execute实现类中,都可以发现有这样一个定义和构造方法

private Executor delegate;

public CachingExecutor(Executor delegate) {
this.delegate = delegate;
delegate.setExecutorWrapper(this);
}

所以这里我们也可以看到,其实Executor有个链结构,一步一步往下执行,所以在真正执行查询时,外面是嵌套了一层CachingExecutor,证据在这里。

  1. public Executor newExecutor(Transaction transaction, ExecutorType executorType, boolean autoCommit) {
  2.   executorType = executorType == null ? defaultExecutorType : executorType;
  3.   executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
  4.   Executor executor;
  5.   if (ExecutorType.BATCH == executorType) {
  6.     executor = new BatchExecutor(this, transaction);
  7.   } else if (ExecutorType.REUSE == executorType) {
  8.     executor = new ReuseExecutor(this, transaction);
  9.   } else {
  10.     executor = new SimpleExecutor(this, transaction);
  11.   }
  12.   if (cacheEnabled) {
  13.     executor = new CachingExecutor(executor, autoCommit);
  14.   }
  15.   executor = (Executor) interceptorChain.pluginAll(executor);
  16.   return executor;
  17. }

在Execute中,还有更深层的执行逻辑,这个后面文章继续分析。

转载请注明出处:http://sukerz.scse.cn/index.php/2016/02/01/mybatis-framework/

 

Spring Boot MyBatis架构图主要包括以下几个主要组件: 1. Spring Boot:Spring Boot是一个用于快速构建Spring应用程序的开发框架。它简化了Spring应用程序的配置和部署过程,并提供了许多开箱即用的功能。 2. MyBatisMyBatis是一个持久层框架,用于将Java对象映射到关系型数据库中的数据。它提供了一种简单而强大的方式来进行数据库操作,使得开发人员可以轻松地执行CRUD操作。 3. 数据库数据库是存储和管理数据的地方。在Spring Boot MyBatis架构图中,数据库用于存储应用程序的数据。 4. MyBatis配置文件:MyBatis配置文件是配置MyBatis框架的地方。它指定了数据库连接信息、映射文件的位置等重要配置。 5. 映射文件:映射文件是将Java对象映射到数据库表的地方。它定义了对象属性和数据库列之间的映射关系,以及操作数据库的SQL语句。 6. Mapper接口:Mapper接口是定义数据库操作方法的地方。它通常与映射文件相对应,提供了与数据库交互的方法。 7. Service层:Service层是应用程序的业务逻辑层。它负责处理业务逻辑,将请求转发给Mapper接口进行数据库操作。 8. Controller层:Controller层是应用程序的控制器层。它接收客户端的请求,调用Service层处理业务逻辑,并返回响应给客户端。 9. 数据库连接池:数据库连接池是用于管理数据库连接的工具。它提供了一种复用数据库连接的机制,提高了数据库访问性能。 总之,Spring Boot MyBatis架构图展示了Spring Boot与MyBatis框架的整合过程,包括数据库、配置文件、映射文件、Mapper接口、Service层和Controller层等组件。它们共同协作,实现了从客户端请求到数据库操作的完整流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值