标签:关于 log nrv imei -- 实现 就是 ids 子类
前面已经说过了怎么获取Connection,这次看下内置的insert和update是怎么实现的。
insert和update最后都会调用update(String statement, Object parameter)方法,如图1:
图1
![技术图片](http://image.mamicode.com/info/201903/20190304184835797667.png)
Executor在DefaultSqlSession生成中已经说明过,默认生成的是CachingExecutor,在CachingExecutor中有个代理,如果不指定默认就是SimpleExecutor,如图2:
图2
![技术图片](http://image.mamicode.com/info/201903/20190304184836255692.png)
那么就直接看下executor.update方法,这个是SimpleExecutor的父类BaseExecutor的方法,如图3:
图3
![技术图片](http://image.mamicode.com/info/201903/20190304184836498866.png)
这里是一个模板方法,每个子类都实现了doUpdate方法,那么看下SimpleExecutor的doUpdate方法,如图4:
图4
![技术图片](http://image.mamicode.com/info/201903/20190304184836773290.png)
这里能看到,通过Configuration会去实例化一个StatementHandler的实现类,如图5:
图5
![技术图片](http://image.mamicode.com/info/201903/20190304184837006698.png)
那么再看下RoutingStatementHandler的构造函数,如图6:
图6
![技术图片](http://image.mamicode.com/info/201903/20190304184837231316.png)
可以看到这里有三个StatementHandler的实现,是RoutingStatementHandler中的代理,默认是PreparedStatementHandler,在初始化解析的时候,如果不指定,那就是PreparedStatementHandler,如图7:
图7
![技术图片](http://image.mamicode.com/info/201903/20190304184837799697.png)
那继续往下看,在初始化PreparedStatementHandler的时候是直接使用了父类的构造函数,如图8:
图8
![技术图片](http://image.mamicode.com/info/201903/20190304184838853448.png)
可以看到主要是赋值一些参数,主要看下getBoundSql方法,如图9:
图9
![技术图片](http://image.mamicode.com/info/201903/20190304184839609337.png)
这里就是解析sql的地方,关键还是要看sqlSource.getBoundSql方法,在这里还需要看初始化解析的时候,如果是静态sql,就是没有<if>和${},就会直接把#{}编译成?,然后返回一个RawSqlSource,但是其中内部有个sqlSource的属性,是StaticSqlSource类型,那StaticSqlSource就是预编译好以后的sql。如果是动态sql就回去解析<if>标签和使用OGNL表达式解析${},关于这块解析,我们下次在讨论。总之这里就是把sql解析了出来。
那么接下来就是获取连接,执行sql了,如图10:
图10
![技术图片](http://image.mamicode.com/info/201903/20190304184839889621.png)
前面获取连接已经讲过了,直接看下是怎么执行update的吧,如图11:
图11
![技术图片](http://image.mamicode.com/info/201903/20190304184840190414.png)
整个update和insert的过程就结束了。
那么下次我们来看下内置的select吧。
如果有不对请提出,共同提高,谢谢!!
mybatis内置insert、update和delete
标签:关于 log nrv imei -- 实现 就是 ids 子类
原文地址:https://www.cnblogs.com/shenqiaqia/p/10472337.html