本文是作者原创,版权归作者所有.若要转载,请注明出处.本文以简单的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



 
 
01-23 19:20