1、Resource获取加载全局配置文件
Resources是ibatis.io包下面的类,也就是一个io流,用于读写文件,通过getResourceAsStream把xml文件加载进来,把配置文件解析为一个流。 
2、实例化SQLSessionBuild构造器
我们首先new了一个SqlSessionFactoryBuilder对象,他是SqlSessionFactory的构建者。 
3、解析配置文件流XMLConfigBuilder
我们调用了他的build()方法。在utils类中调用了build方法,让我们细查源码进去查看到底长什么样子?  再向下查看,发现在进行xmlConfigBuild 
4、Configuration所有的配置信息
通过调用parse()方法解析mybatis配置文件 
然后,我们发现parse()解析完成后,他返回了一个configuration对象,它是用来存放mybatis核心配置文件解析完成后的结果。这个configuration又返回给谁了呢?继续看源码: 
5、SqlSessionfactory实例化
通过上面一步DefaultSqlSessionFactory()才真正获取到了一个SQLSessionFactory对象,将对象返回到了我们所编写的Utils工具类中的代码 
6、Transaction事务管理
接着我们调用openSession获取SQLSession对象,我们来看看openSession方法里有什么?   看源码先看到返回值是sqlSession,再看看里面有些什么:
Transaction,这很明显是一个事务,我们都知道sql执行时都要涉及到事务操作的,提交或回滚什么的。而这个transaction产生需要什么参数呢,看源码知道里面有个environment(xml中配置的),而且是从configuration中获得的(之前做的总算没有白费),通过这些参数transactionFactory就帮我们产生了transaction。
7、创建executor执行器
继续剖析源码观察发现,接着又创建了一个executor执行器,executor执行器在mybatis中发挥着十分重要的作用。executor,这个名字一看就知道是一个执行器,是个接口(一般用SimpleExecutor来执行,实现类),他是mybatis的核心执行器,相当于jdbc中的statement,发送sql语句并执行。
有了这些我们就能得到最后的sqlSession了。 
8、创建SQLSession
 
9、jdk动态代理生成mapper接口的代理对象
主要通过DefaultSqlSession的getMapper()来生成。
首先看一看test类中的方法,通过调用了一个getmapper的方法
细查代码首先到达的是SqlSession.class文件下的一个接口类
接着查看他的DefaultSqlSession.class接口实现类发现,也是调用了一个getMapper的方法,然后返回了一个对象。让我们接着向下查看
接着发现到了Configuration.class的文件下

接着就到了MapperRegistry.class下,可以发现其实是通过mapperRegistry的对象,它里面是一个knownMappers的HashMap,用于存储配置文件中的mappers标签的每个mapper接口
 这里通过JDK动态代理,帮mapper接口生成代理实现类  
10、Mapper对象调用执行用户方法
 Mapper对象调用方法执行其实走的是MapperProxy的invoke方法 
11、在执行增删改查成功的前提下,提交事务,未成功,则需要回滚事务
12、关闭SQLSession
其实在方法执行的时候还应该有更为详细的步骤,还要注意缓存的的存在,一级缓存会自动开启,二级缓存需要手动开启,在执行方法时首先要查看二级缓存中是否有对应的结果,然后查看一级缓存后,没有则再进行数据库访问,接着关闭数据库连接,返回到数据库池中,然后取到了结果就需要执行最后一步关闭SqlSession。
|