MyBatis的工作流程
首先在MyBatis启动的时候我们需要去解析配置文件,包括全局配置文件(Mybatis-config.xml)以及映射器配置文件, 这里面包含了我们怎么控制MyBatis的行为和我们要对数据库下达的指令,也就是我们的SQL的信息,我们会把这些信息解析成一个Configuration对象。
接下来就是我们操作数据库的接口,它在应用程序和数据库中间,代表我们和数据库之间的一次连接,这个就是SqlSession对象。
我们要获得一个会话,必须有一个会话工厂SqlSessionFactory,SqlSessionFactory中又必须包含我们所有的配置信息,所以MyBatis通过一个builder来创建SqlSessionFactory。
我们知道MyBatis是对JDBC的封装,也就意味着底层一定会出现JDBC的一些核心对象,比如执行SQL的Statement,结果集ResultSet。在MyBatis里面,SqlSession只是提供给应用的一个接口,还不是SQL的真正执行对象。
通过代码中可以看到,SqlSession中持有一个Executor对象,用来封装对数据库的操作。在执行器Executor执行query或者update操作的时候,我们会创建一系列的对象来处理参数,执行SQL,处理结果集。我们可以简化成一个StatementHandler对象,下面是MyBatis的主要流程图:
在MyBatis的主要工作流程里面,不同的功能是由很多不同的类协作完成的,它们分布在MyBatis Jar的不同的packagel里面。
和Spring一样,MyBatis按照功能职责的不同,所有的package可以分成不同的工作层次:
接口层: 接口层是我们打交道最多的,核心对象是SqlSession,它是上层应用和MyBatis打交道的桥梁,SqlSession上定义了很多对数据库操作的方法,接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作。
核心处理层: 跟数据库操作相关的动作都是在这一层完成的。核心处理层主要做了下面几件事:
- 把接口中传入的参数解析并映射成JDBC类型
- 解析xml文件中的SQL语句,包括插入参数和动态SQL的生成
- 执行SQL语句
- 处理结果集,并映射成Java对象
插件也属于核心处理层,这是由它的工作方式和拦截的对象决定的。
基础支持层:主要是由一些抽取出来的通用功能,用来支持核心处理层的功能。b比如数据源、缓存、日志等这些功能。