MaBatis源码分析
1.输入流的关闭
为什么读取主配置文件的输入流不需要手动关闭?
ctrl 加 鼠标左键 点进去build方法,查看其实现如下图
再跟进去 return 的那个build方法如下图
原来MyBatis已经帮我们关闭了那个输入流了。
2.sqlSession的创建
我们知道创建sqlSession只需要调用SqlSessionFactory的openSession方法,但是sqlSession是怎么被创建出来的呢?
查看openSession方法的实现类
选择DefaultSqlSessionFactory(默认使用的工厂),查看其内部实现
记住该方法最后属性传了一个false,继续跟
false属性赋值给autoCommit了,继续跟
原来sqlSession的创建最根本的只是对一个变量进行了初始化,dirty为false,表示现在数据还没有被修改,autoCommit为false意为关闭了自动提交事务。
从以上源码可以看到,午餐的openSession()方法,将事务的自动提交赋值为false,而所谓的创建SqlSession,就是加载了主配置文件,创建了一个执行器对象(将来用于执行映射文件中的SQL语句),初始化了一个DB数据被修改的标志变量dirty,关闭了食物的自动提交功能。
3.增删改的执行
对于增删改,其底层调用的全都是update方法
调用update方法后,dirty就改为true了,因为要做修改了,而且没有提交,内存中的信息和数据库中的信息不一致,产生了脏数据,所以dirty改为true,提交之后,dirty改为true,如果关闭sqlSession时dirty还为true,则回滚,所以不需要手动回滚。