mybatis源码专题(2)--------一起来看下使用mybatis框架的insert语句的源码执行流程吧
mybatis源码专题(2)——–一起来看下使用mybatis框架的insert语句的源码执行流程吧
本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的insert语句为例
1.mybatis的底层是jdbc操作,我们先来回顾一下insert语句的执行流程,如下
执行完后,我们看下数据库结果
OK,语句生效了.
2.贴一下我用mybatis框架写的demo,贴一下主要代码,依次是写sql的xml,以及该xml所对应的接口,还有个是测试的代码
执行完后,我们看下数据库结果
OK,语句生效了.
3.现在是开始阅读源码环节,我在源码上加了自己的理解,这就是我上篇文章编译mybatis源码的好处,否则就只能干看了
从读取配置文件下面一行代码开始
一层一层看下:内层
我们看下解析完的Configuration对象都有哪些属性,首先是jdbc配置参数
然后是这个不知道干啥的,混个眼熟,name的值是SIMPLE
然后是这个
,
点开看一下
我们可以看到有sql的xml信息和接口信息.
好,回到这里,继续下一层
点进去
好了,这里我们知道其实返回了DefaultSqlSessionFactory对象.继续看下去
这里帮我们关闭了读取流inputStream,我们不用再手动关闭了,继续看下去
返回的DefaultSqlSessionFactory就是SqlSessionFactory接口的实现类,
这个类只有一个属性,就是Configuration对象,Configuration对象用来存放读取xml配置的信息
继续下一行,点进去
刚刚我们看到过这个属性,不知道干啥的,很眼熟,name的值是SIMPLE,继续往下看
看下tx这个对象,其他的不仔细看了
(猜测:有个属性autoCommit默认是false,不自动提交,这里就对应了上面,我们手动提交事务了,继续往下看DefaultSqlSession)
我们发现和上文一样,也是SqlSession接口的实现类
现在,可以走出去了
返回的DefaultSqlSession是SqlSession接口的实现类,它应该是与数据库打交道的对象,
对象中有上面传来的Configuration对象,还有executor处理器对象,executor处理器有一个dirty属性,默认为false,如下图
现在进入sqlSession的insert方法看下
继续点进去看下
我们看下ms有哪些属性
ms对象有两个重要属性:sqlSource是用来存sql语句的,id是DemoMapper接口的.insertDept方法名
继续往下看,下面那个方法应该就是执行的方法了,一层一层点进去
这里判断参数是什么类型,我们是string类型,直接原样返回,其他集合类型,数组类型有是专门的处理,继续点下去
我们点进那个执行方法
继续点进那个执行方法
我们看下handler对象,它是Statement对象的处理器,看看它有哪些属性,如下
我们可以看到,里面有一条完整的可执行语句,我猜下面就是jdbc操作了,点进去看下
真是失望,看源码就是封装的太多了,看着看着就晕了,继续点进去看
终于看到PreparedStatement预编译对象了,
我们可以看下返回rows那行代码,点进去发现如下
执行了ClientPreparedStatement对象的方法,这个对象好像没见过啊
别着急,我们在idea内点击右键,选择 Diagrams,查看类的继承关系图
好了,我们知道这个对象本质也是PreparedStatement对象,在那个方法里返回了受影响的行数,其他的目前不必深究
到这里我们就要结束了,最后看下这个commit方法吧,点进去
注意,这里有个dirty属性为true,我猜是脏数据,不会写入数据库,我们让他继续执行
变成false了,哈哈,现在不是脏数据了,肯定可以写入数据库了.最后看下数据库
,这些数据是我debug好几次写入的数据,不管它们,我们把commit方法注释掉,再执行一次
我们把注释放开,继续执行一次
所以insert语句德华要commit,手动执行提交事件,将数据提交到数据库中,才真正成功插入到数据库中,否则会回滚,数据库看不到数据
好了,这篇文章到这里就结束了.谢谢大家的观看,大家有空的话就帮我点个赞吧
文章中若有错误和疏漏之处,还请各位大佬不吝指出
若要下载我的源代码和注释,这里是我的GitHub地址:https://github.com/lusaisai1019/mybatis-master