mybatis内置insertupdate和delete

Posted 神恰恰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis内置insertupdate和delete相关的知识,希望对你有一定的参考价值。

前面已经说过了怎么获取Connection,这次看下内置的insert和update是怎么实现的。
insert和update最后都会调用update(String statement, Object parameter)方法,如图1:
图1

Executor在DefaultSqlSession生成中已经说明过,默认生成的是CachingExecutor,在CachingExecutor中有个代理,如果不指定默认就是SimpleExecutor,如图2:
图2

那么就直接看下executor.update方法,这个是SimpleExecutor的父类BaseExecutor的方法,如图3:
图3

这里是一个模板方法,每个子类都实现了doUpdate方法,那么看下SimpleExecutor的doUpdate方法,如图4:
图4

这里能看到,通过Configuration会去实例化一个StatementHandler的实现类,如图5:
图5

那么再看下RoutingStatementHandler的构造函数,如图6:
图6

可以看到这里有三个StatementHandler的实现,是RoutingStatementHandler中的代理,默认是PreparedStatementHandler,在初始化解析的时候,如果不指定,那就是PreparedStatementHandler,如图7:
图7

那继续往下看,在初始化PreparedStatementHandler的时候是直接使用了父类的构造函数,如图8:
图8

可以看到主要是赋值一些参数,主要看下getBoundSql方法,如图9:
图9

这里就是解析sql的地方,关键还是要看sqlSource.getBoundSql方法,在这里还需要看初始化解析的时候,如果是静态sql,就是没有<if>和${},就会直接把#{}编译成?,然后返回一个RawSqlSource,但是其中内部有个sqlSource的属性,是StaticSqlSource类型,那StaticSqlSource就是预编译好以后的sql。如果是动态sql就回去解析<if>标签和使用OGNL表达式解析${},关于这块解析,我们下次在讨论。总之这里就是把sql解析了出来。
那么接下来就是获取连接,执行sql了,如图10:
图10

前面获取连接已经讲过了,直接看下是怎么执行update的吧,如图11:
图11

整个update和insert的过程就结束了。
那么下次我们来看下内置的select吧。
 
如果有不对请提出,共同提高,谢谢!!

以上是关于mybatis内置insertupdate和delete的主要内容,如果未能解决你的问题,请参考以下文章

使用insertupdate和delete报错注入

DocumentListener 没有调用 insertUpdate 方法

使用 laravel moltin 购物车时的 LaravelSession::insertUpdate() 问题

Python_021(内置方法讲解二)

类的内置方法:__del__

内置函数补充,__str__方法__del__方法 和 __call__方法和元祖