码迷,mamicode.com
首页 > 其他好文 > 详细

mybatis内置insert、update和delete

时间:2019-03-04 18:48:35      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:关于   log   nrv   imei   --   实现   就是   ids   子类   

前面已经说过了怎么获取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内置insert、update和delete

标签:关于   log   nrv   imei   --   实现   就是   ids   子类   

原文地址:https://www.cnblogs.com/shenqiaqia/p/10472337.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!