Mybatis运行原理

先是简要的文字说明,后面放上图。如有叙述错误,感谢指正哈。

一、根据配置文件创建SQLSessionFactory

首先将配置文件转化为流,创建SqlSessionFactoryBuilder对象,通过SqlSessionFactoryBuilder的build() 方法对流进行创建SQLSessionFactory的实例。

build() 的简易过程为:创建解析器parser对流进行配置文件中的每个标签进行解析,将解析后的结果保存在Configration中,最后通过build()返回一个DefaultSqlSession对象,即SQLSessionFactory的实例。

二、返回SqlSession的实现类DefaultSqlSession对象

在第一步获取到包含了Configration的DefaultSqlSession对象后,调用它的openSession() 方法,实际上是调用openSessionFromDataSource() 方法,在这个方法中获取环境信息,创建事务并使用newExecutor()获得executor对象。最后创建出包含Configration和executor的DefaultSqlSession对象。

newExecutor()的简易过程:首先根据全局配置创建出SimpleExecutor/ReuseExecutor/BatchExecutor中的一种(对executor进行包装)。然后如果开启了二级缓存则创建CachingExecutor(对executor进行包装)。最后使用每一种拦截器对executor进行包装并返回。

三、getMapper()返回接口的代理对象

SqlSession.getMapper()—>Configuration.getMapper()—>mapperRegistry.getMapper()。然后根据接口类型获得MapperProxyFactory。再通过mapperProxyFactory.newInstance(sqlSession)创建MapperProxy。而MapperProxy是实现了InvocationHandler接口,所以MapperProxy是一个代理对象。最后层层返回得到代理对象。

四、通过代理对象调用增删改查方法

这一步比较麻烦,简易说明一下:代理对象通过invoke()方法判断用户是用增删改查的哪个方法,然后再调用sqlSession的增删改查方法。

在调用sqlSession的增删改查方法中会调用executor对应的增删改查方法获取到BoundSql,BoundSql里包含了sql语句的详细信息。executor再创建StatementHandler,在创建StatementHandler的同时也创建了ParameterHandler与ResultSetHandler。StatementHandler通过ParameterHandler设置参数、通过ResultSetHandler处理结果。而ParameterHandler和ResultSetHandler都依赖于TypeHandler进行数据库类型和JavaBean类型的映射。TypeHandler的底层使用的是JDBC。

一、根据配置文件创建SQLSessionFactory

二、返回SqlSession的实现类DefaultSqlSession对象

三、getMapper()返回接口的代理对象

四、通过代理对象调用增删改查方法

以上图片转载自尚硅谷