mybatis内置insert、update和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

扫描二维码关注公众号,回复: 5413155 查看本文章

可以看到这里有三个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吧。
 
如果有不对请提出,共同提高,谢谢!!

猜你喜欢

转载自www.cnblogs.com/shenqiaqia/p/10472337.html