MyBatisMyBatis 源码分析——动态SQL语句

至于mybatis系列笔者就记录到那里了。希望对我们有用。

MyBatis 1

经过parseDynamicTags方法分析出需要拔取的好两个SqlNode类。并规定她是否是动态SQL语句。假设是,就创设DynamicSqlSource类。而DynamicSqlSource类会存放在MappedStatement类里面。当大家要经过BoundSql类来生成StatementHandler实例的时候,就会从通过MappedStatement类拿到相应的BoundSql类。而BoundSql类的getSql方法就会我们最终的落点。

为了落实动态SQL语句的功效。mybatis设置多少个动态的节点。如if,choose
等。当然假如你们想要知道有几个的话,最好跟笔者一样子点开他有关的DTD文件。如下

有几年支付经历的程序员应该都有暗骂过原生的SQL语句吧。因为她们不可以一句就搞定一个工作,往往还要通过代码来拼接相关的SQL语句。相信大家会知晓SQL里面的永真(1=1),永假(1=2)的意义呢。所以mybatis动态SQL功用在作者看来是最引吸人的。为了更好的区分XML映射文件上的SQL语句。mybatis把SQL语句分为四类。那么这些笔者曾经在前边的章节里面讲过了。可是咱们在支付进程中时常使用的也就俩种:静态和动态。

 1  public SqlSource parseScriptNode() {
 2     List<SqlNode> contents = parseDynamicTags(context);
 3     MixedSqlNode rootSqlNode = new MixedSqlNode(contents);
 4     SqlSource sqlSource = null;
 5     if (isDynamic) {
 6       sqlSource = new DynamicSqlSource(configuration, rootSqlNode);
 7     } else {
 8       sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType);
 9     }
10     return sqlSource;
11   }
 Map<Object, OgnlClassResolver> context = Ognl.createDefaultContext(root, new OgnlClassResolver());

看看了呢,是经过分子isDynamic的值来取得相关项目标SQL语句类。DynamicSqlSource类从字面上来讲就很容易看出来是属于动态的。而上面便是静态的。关键的有些如故在parseDynamicTags方法里面。

<!ELEMENT select (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>

有关静态和动态的概念,笔者是那样子驾驭的——静态SQL语句呈现就是里面没有相关的罗辑。即是没有#if之类的语活。反之则是动态SQL语句。而笔者感兴趣是动态SQL部分。我们都领会在读取XML映射文件讯息的时候就会分析当前的SQL语句属于哪一连串型。那有的工作就是位于源码的XMLScriptBuilder类里面。

俺们可以见到include 、trim 、where 、set 、foreach 、choose 、if
、bind。各自的用法在官网上边有些详细的印证。 咱们可以去探访。相信我们看到此间心里应该有了迟早的想法。为了实现动态SQL,那么mybatis一定会遵照不同的节点来做不同的逻辑处理。这也是作者为何说——关键的有些如故在parseDynamicTags方法里面。因为parseDynamicTags方法是用来分析当前select或是delete等节点的SQL节点(即是SqlNode类)。可以说毕竟生成的SQL语句就是靠这多少个SqlNode类提供生成的。在眼前几章中大家有讲到关于BoundSql类的功用。在此间就一下子明亮了。如下图

实际上笔者的心底是有一点小失望的。我本以为mybatis会一向贯彻协调的因素处理。当然这只是作者内心的某些完美主义吧。正如官网上讲的MyBatis
拔取功效强大的遵照 OGNL
的表明式来裁撤其他因素。所以我们得以源码里面来看ognl的利用。

对于ongl笔者就不想多说了。有趣味的读者们得以自己去看一下。笔者指出仍旧去看一下呢。struts2框架之中也用到她了。

网站地图xml地图