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由三层架构组成:基础支持层、核心处理层、接口层。
基础支持层
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
:完成结果集的映射。
接口层
接口层即暴露给应用程序调用的组件或者说是API,我们有时不需要去关心Mybatis底层如何实现,只需要使用SqlSession接口去实现我们的接口即可。