MyBatis的工作流程分析
- 解析配置文件
首先MyBatis启动的时候需要去解析配置文件,包括全局配置文件和映射器配置文件,里面包含了我们是如何控制MyBatis的行为和对数据库下达的指令,也就是我们编写的sql信息。它们将会被解析成一个Congifuration对象。
- 提供操作接口
接下来就是操作数据库的接口,它在应用程序和数据库之间,代表我们跟数据库之间的一次连接:而这个就是SqlSession对象。
而我们获得一个会话,就必须有一个会话工厂SqlSessionFactory;SqlSessionFactory里面包含了我们的所有的配置信息,而SqlSessionFactory会通过SqlSessionFactoryBuilder的build()方法创建。
MyBatis是对JDBC的封装,也就说明了底层一定还是会有JDBC的核心对象,如执行SQL的Statement,结果集ResultSet。在MyBatis里,SqlSession只是提供给应用一个借口,还不是SQL的真正执行对象。 - 执行SQL语句
SqlSession持有一个Executor对象,用来封装对数据库的操作。执行器Executor执行query或者update操作的时候会创建一系列对象,来处理参数、执行SQL、处理结果集,所以MyBatis将这些操作简化成一个对象里:StatementHandler,可以说它是Statement的封装。
MyBatis只要的工作流程图:
MyBatis的模块划分
在MyBatis的主要工作流程里面,不同的功能是由很多不同的类协作完成的,它们分布在MyBatis jar包里。
包结构:
按照职责的功能不同,所有的package可以分成不同的工作层次。
接口层
首先接口层是我们打交道最多的。核心对象是SqlSession,它是上层应用和MyBatis打交道的桥梁,SqlSession上定义了非常多的对数据库的操作方法,接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。
核心处理层
核心处理层,也就是跟数据库操作相关的动作都会在这一层完成。
核心处理层主要做的事情:
- 把接口传入的参数解析并且映射成JDBC类型
- 解析xml文件中的SQL语句,包括插入参数和动态SQL的生成
- 执行SQL语句
- 处理结果集并且映射成java对象。
插件也属于核心层,因为它的工作原理和拦截的对象决定了的。
基础支持层
最后一个就是基础支持层,主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能,如数据源、缓存、日志、xml解析、反射、IO、事务等等。