目录
什么是动态 sql
我们之前在映射文件中,配置 sql
的时候,其实都是静态的 ;
<!--复杂查询-->
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen" >
SELECT * from user where sex = #{userStrengthen.sex} and name like '%${userStrengthen.name}%'
</select>
比如这样的 sql
,我们只能根据条件进行查询了;
但是有时候,我们总要查询满足其中 部分条件
的结果,这时候,难道需要我们再次配置新的 sql
吗?
mybatis
没有那么傻,它有个 动态sql
技术 ;(动态sql
用法跟我们之前学的 jstl
差不多);
我们使用 动态sql
改写上面的映射关系文件 :
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen" >
SELECT * from user
<!-- where 标签会自动的删除第一个条件前面的 and -->
<where>
<if test="userStrengthen != null">
<if test="userStrengthen.sex != null and userStrengthen.sex != '' ">
AND sex = #{userStrengthen.sex}
</if>
<if test="userStrengthen.name != null and userStrengthen.name != '' ">
and name like '%${userStrengthen.name}%'
</if>
</if>
</where>
</select>
sql 片段
向上面的查询条件,我们可能会在其他地方也使用,我们总不能每次都复制粘贴一次吧,那样重复代码太多了,mybatis
有一个 sql片段
技术 ;
就是为一段 sql
一句,起个名字,放在那,在使用的时候,直接进行引用 ;
创建 sql片段
代码
<!--定义 sql片段 -->
<!--
一点经验:
1、在定义sql片段的时候,不要将 where 标签定义进来,不然 就无法做到条件的拼接了
2、定义 sql片段,只在单表中进行定义,这样复用性更强
-->
<sql id="query_user_name_sex">
<if test="userStrengthen != null">
<if test="userStrengthen.sex != null and userStrengthen.sex != '' ">
AND sex = #{userStrengthen.sex}
</if>
<if test="userStrengthen.name != null and userStrengthen.name != '' ">
and name like '%${userStrengthen.name}%'
</if>
</if>
</sql>
在需要的地方,引用我们定义的 sql片段
:
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen">
SELECT * from user
<!-- where 标签会自动的删除第一个条件前面的 and -->
<where>
<!-- 引用 sql 片段-->
<include refid="query_user_name_sex"></include>
</where>
</select>
foreach 标签
有些时候,我们传入的条件是一个集合,这样,我们就可以用 foreach
标签进行迭代 ;
比如,拼接下面一个 sql
and id in(1,11,22)
使用 foreach
遍历 :
<sql id="query_user_ids">
<if test="ids != null">
<!--
collection : 集合引用的名字
item : 为每次从集合中迭代出来的对象,取个名字
open :sql 条件语句开始的部分
close : sql 条件语句结束的部分
separator : 迭代对象进行拼接中间的部分
-->
<foreach collection="ids" item="id" open="and id in(" close=")" separator=",">
#{id}
</foreach>
</if>
</sql>