Mybatis的动态MySQL

在开发中,经常会遇到动态的查询语句,比如虽然有姓名 年龄 性别三个查询条件,但是用户仅使用了姓名,这个时候就需要用到动态查询。此时我们可使用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>的作用就是自动的修饰条件语句中的","

Comment