怎么在MyBatis中实现动态sql

  介绍

这篇文章给大家介绍怎么在MyBatis中实现动态sql,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强> 1。动态sql

动态sql是mybatis中的一个核心,什么是动态sql ?

动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接,组装。

mybatis的强大特性之一便是它的动态sql。如果你有使用JDBC或其他类似框架的经验,你就能体会到根据不同条件拼接sql语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。有些时候,sql语句,条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用甲骨文的序列,mySQL的函数生成Id。这时我们可以使用动态sql。利用动态sql这一特性可以彻底摆脱这种痛苦。通常使用动态sql不可能是独立的一部分,mybatis当然使用一种强大的动态sql语言来改进这种情形,这种语言可以被用在任意的sql映射语句中。动态sql元素和使用JSTL或其他类似基于XML的文本处理器相似.MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。

<强> mybatis中用于实现动态sql的元素主要有:

1,如果和

2,选择(当,否则)

3,修剪

4,设置

5, foreach

就拿上一篇博文中对用户的综合查询一例来说:

select  *,得到user  where  user.sex =, # {user.sex},以及user.username  like  & # 39; % $ {user.username} % & # 39;

假如这个用户是零咋整?或者user.sex或用户者。用户为空呢?所以更严谨的做法应该是在执行这个语句之前要先进行判断才对,确保都不为空,那么我再去查询。这就涉及到了mybatis中的动态sql了。

在mybatis中,动态sql可以使用标签来表示,这很类似于jstl表达式,我们可以将上面的sql语句改成动态sql,如下:

& lt; select  id=癴indUserList", parameterType=癿ybatis.po.UserQueryVo", resultType=癿ybatis.po.User"比;   ,select  *,得到user  & lt; !,,,可以自动去掉条件中的第一个以及——比;   ,& lt; where>   ,& lt; if 测试=坝没?=null"比;   ,& lt; if 测试=皍ser.sex !=null 以及user.sex !=& # 39; & # 39;“比;   时间=user.sex 害;# {user.sex}, & lt;/if>   ,& lt; if 测试=皍ser.username !=null 以及user.username !=& # 39; & # 39;“比;   user.username 害;like  & # 39; % $ {user.username} % & # 39;, & lt;/if>   ,& lt;/if>   ,& lt;/where>   & lt;/select>

上面的代码很好理解,主要就是加了一些判断,条件不为空,才进行查询条件的拼接,让mybatis动态的去执行。那么在测试代码中,我们可以故意的将user.sex不赋初值,就可以看到查询的结果是不一样的。

<强> 2。sql片段

那么现在还有个问题,如果好几个语句都需要这样做,而且动态sql部分都一样,这就会导致一些代码的重复,所以如果遇到这种情况,我们就应该抽取,动态sql也可以抽取,我们可以将动态的这部分sql抽取成sql片段,然后在具体的声明中引用进来即可。如下:

& lt; sql  id=皅uery_user_where"比;   ,& lt; if 测试=坝没?=null"比;   ,& lt; if 测试=皍ser.sex !=null 以及user.sex !=& # 39; & # 39;“比;   时间=user.sex 害;# {user.sex}, & lt;/if>   ,& lt; if 测试=皍ser.username !=null 以及user.username !=& # 39; & # 39;“比;   user.username 害;like  & # 39; % $ {user.username} % & # 39;, & lt;/if>   ,& lt;/if>   & lt;/完成

id是给该sql片段起个名字而已,内部就是上面的地方动态部分,然后我们将上面原来的动态部分改成对这个sql片段的引用,如下:

& lt; select  id=癴indUserList", parameterType=癿ybatis.po.UserQueryVo", resultType=癿ybatis.po.User"比;   ,select  *,得到user  & lt; where>   ,& lt; !——,引用sql片段的id,如果refid指定的id不在本mapper文件中,需要在前面加上namespace ——比;   ,& lt; include  refid=皅uery_user_where"祝辞& lt;/include>   ,& lt; !——,还可以引用其他sql片段,——比;   ,& lt;/where>   & lt;/select>

<强> 3。foreach

还有个问题:如果我们要向sql传递数组或列表该咋整呢? mybatis使用的是foreach解析。为了模拟这个场景,我们将上面的查询改成多个身份证查询,有两种查询方式:

怎么在MyBatis中实现动态sql