在开发中,经常会遇到动态的查询语句,比如虽然有姓名 年龄 性别三个查询条件,但是用户仅使用了姓名,这个时候就需要用到动态查询。此时我们可使用mybatis中的xml映射中的<if test="> </if>语句来实现。
举个例子
<select id="list" resultType="com.hyper.demo2.pojo.Emp">
select *
from emp
<where>
<if test="name !=null">
name like concat('%', #{name}, '%')
</if>
<if test="gender !=null">
and gender = #{gender}
</if>
<if test="begin !=null and end !=null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
这段代码实现了一个动态查询的功能。
值得注意的是,在代码中我们使用到了<where> </where>标签 这个标签的作用是自动的增添条件语句中的and
譬如 当我们不使用<where></where>标签的情况下 仅使用到了查询gender 则mybatis为我们生成的mysql语句则为
select * from emp name where and gender = 1 order by update_time desc
这显然是不符合mysql语法的,所以会导致报错。
同时我们也不能简单的删除其中的“and” 因为这样会导致后面的语句无法拼接,仍然产生语法错误。
类似的,在update操作中也有着类似的问题,我们即可使用<set> </set>来避免。
<update id="update2">
update emp
<set>
<if test="username !=null" > username=#{username}, </if>
<if test="name !=null" > name=#{name},</if>
<if test="gender !=null" > gender=#{gender},</if>
<if test="image !=null" > image=#{image},</if>
<if test="job !=null" > job=#{job},</if>
<if test="entrydate !=null" > entrydate=#{entrydate},</if>
<if test="deptId !=null" > dept_id=#{deptId},</if>
<if test="updateTime !=null" > update_time=#{updateTime} </if>
</set>
where id = #{id}
</update>
而在这里 <set> </set>的作用就是自动的修饰条件语句中的","