MaBatis源码分析

                                                                            1.输入流的关闭

为什么读取主配置文件的输入流不需要手动关闭?

MaBatis源码分析

ctrl 加 鼠标左键 点进去build方法,查看其实现如下图

MaBatis源码分析

再跟进去 return 的那个build方法如下图

MaBatis源码分析

原来MyBatis已经帮我们关闭了那个输入流了。

                                                                    2.sqlSession的创建

我们知道创建sqlSession只需要调用SqlSessionFactory的openSession方法,但是sqlSession是怎么被创建出来的呢?

查看openSession方法的实现类

MaBatis源码分析

选择DefaultSqlSessionFactory(默认使用的工厂),查看其内部实现

MaBatis源码分析

记住该方法最后属性传了一个false,继续跟

MaBatis源码分析

false属性赋值给autoCommit了,继续跟

MaBatis源码分析

原来sqlSession的创建最根本的只是对一个变量进行了初始化,dirty为false,表示现在数据还没有被修改,autoCommit为false意为关闭了自动提交事务。

从以上源码可以看到,午餐的openSession()方法,将事务的自动提交赋值为false,而所谓的创建SqlSession,就是加载了主配置文件,创建了一个执行器对象(将来用于执行映射文件中的SQL语句),初始化了一个DB数据被修改的标志变量dirty,关闭了食物的自动提交功能。

                                                                                        3.增删改的执行


对于增删改,其底层调用的全都是update方法

MaBatis源码分析

MaBatis源码分析

MaBatis源码分析

调用update方法后,dirty就改为true了,因为要做修改了,而且没有提交,内存中的信息和数据库中的信息不一致,产生了脏数据,所以dirty改为true,提交之后,dirty改为true,如果关闭sqlSession时dirty还为true,则回滚,所以不需要手动回滚。