Mybatis技术内幕(1)Mybatis架构设计

1 Mybatis架构

1.1 为什么要有ORM框架

在传统的JDBC编程中,操作数据库时一般会经过以下步骤:

  • 1)注册数据库驱动类,指定数据库连接信息
  • 2)通过DriverManager打开数据库连接
  • 3)通过数据库连接创建Statement对象
  • 4)通过Statement对象执行SQL,得到ResultSet对象
  • 5)通过ResultSet读取数据,并将其转换成Java对象
  • 6)关闭数据库连接,释放资源

以上通过JDBC操作数据库有以下缺点:

  • 有大量的重复代码,虽然可以提取工具类(刚学JDBC时就是这么干的)
  • 每次执行SQL都需要创建连接对象,然后释放资源,这就好比没有线程池时,每次创建线程,执行任务,释放线程一样,有线程池当然也有数据库连接池来解决这个问题。

在我们的开发中,我们希望只关注与SQL本身,而不想去写大量代码处理数据源、数据库连接池等操作。所以ORM框架应运而生。

很多ORM框架集成了第三方缓存、第三方数据源等组件,开发人员可以简单的通过配置指定使用什么第三方组件,大大提升开发效率。

Mybatis

相比较于Hibernate,Mybatis更加轻量级,可控性更高,我们可以通过配置文件或注解编写原生的SQL语句,更有优化空间。

1.2 Mybatis整体架构

Mybatis由三层架构组成:基础支持层、核心处理层、接口层。

Mybatis技术内幕(1)Mybatis架构设计

基础支持层

1)反射模块:对Java原生的反射进行封装,提供更加简洁的API,并实现了一些优化。

2)类型转换模块:提供别名机制。

3)资源加载模块:对类加载器进行封装,确定类加载器使用顺序。

4)缓存模块:Mybatis提供一级缓存和二级缓存,Mybatis中自带的这两级缓存与整个应用程序运行在同一个JVM中,共享同一块堆内存,当缓存较大时,可能影响其他功能的运行。

5)Binding模块:Mybatis通过Binding模块将用户自定义的Mapper接口与映射配置文件关联起来。如此开发人员无需自定义Mapper接口实现类,Mybatis会自动为其创建动态代理对象。

核心处理类

核心处理类中实现了Mybatis的核心处理流程,其中包括Mybatis的初始化以及完成数据库操作的全部流程。

1)配置解析

  • Mybatis初始化过程中,会加载mybatis的配置文件、映射配置文件和Mapper接口中的注解。
  • 解析完成后的配置信息会形成Configuration对象。
  • 然后利用Configuration对象创建SqlSessionFactory对象
  • Mybatis初始化完成之后,开发人员即可通过SqlSessionFactory对象创建SqlSession对象
  • 利用SqlSession对象即可完成数据库的操作

2)SQL解析

  • 处理SQL语句中的占位符,绑定用户传入的实参,以及动态SQL等功能

3)SQL执行

SQL的执行涉及到多个组件:Executor/StatementHandler/ParamenterHandler/ResultSetHandler

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

Mybatis技术内幕(1)Mybatis架构设计

接口层

接口层即暴露给应用程序调用的组件或者说是API,我们有时不需要去关心Mybatis底层如何实现,只需要使用SqlSession接口去实现我们的接口即可。