其他分享
首页 > 其他分享> > mybatis内置insert、update和delete

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

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

标签:insert,看下,update,sql,mybatis,如图,解析
来源: https://www.cnblogs.com/shenqiaqia/p/10472337.html