Mybatis(八)动态Sql的实现原理

一、动态Sql的使用

顾名思义,动态sql值得是事先无法预知具体条件,需要在运行时根据具体的情况动态生成Sql语句。例如:

 
      id,create_time, name, password, phone, nick_name
    

    

上面的代码中,当我们不确定是否有查询条件时,可以使用等标签,通过OGNL表达式判断参数内容是否为空,如果表达式结果为true,mybatis则会自动拼接标签内的sql内容,否则会忽略相应内容。标签是保证至少有一个查询条件时则会在sql语句中追加where关键字,同时还能剔除后面紧跟着的or或者and关键字。

除了上面的几个标签外,mybatis的动态标签还有下面几个:

这几个标签是搭配使用的,类似于java中的switch语法:

Mybatis(八)动态Sql的实现原理_第1张图片

这组标签和java中的switch类似,when和otherwise条件都是互斥的 ,当任一when标签符合则其他标签不会走。

:该标签用于对集合参数进行遍历,通常用于构建in或者批量操作等语句,例如:

标签:这两个标签和标签类似,用于避免多余的and、or关键字,自居中多余的逗号问题等:

例如:

Mybatis(八)动态Sql的实现原理_第2张图片

这种情况可以用标签解决,也可以用标签解决:

Mybatis(八)动态Sql的实现原理_第3张图片

标签和标签类似,主要用来避免set语句中出现多余的逗号。

二、SqlSource 与 BoundSql详解

SqlSource用于描述sql资源,前面说过mybatis可以通过两种方式配置sql信息,一种通过注解(@Select等注解),一种通过xml(