这篇文章给大家介绍怎么在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解析。为了模拟这个场景,我们将上面的查询改成多个身份证查询,有两种查询方式: