Mybatis中动态SQL多条件查询

时间:2022-03-19 22:30:16

Mybatis中动态SQL多条件查询

mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件。

 

choosewhen otherwise)相当于Java中的switch语句,通常whenotherwise一起使用。

 

where:简化SQL语句中的where条件。

 

set 解决SQL语句中跟新语句

 

我们课已通过几个例子来看一下这几个元素的运用场景:

 

if:

 

<select id="queryEmp"  resultType="cn.test.entity.Emp">

          select * from emp where 1=1

          <if test="deptNo!=null">

          and deptno=#{deptNO}

          </if>

          <if test="deptName!=null">

          and deptno=#{deptName}

          </if>

          </select>

注:<if test="deptNo!=null">中 的deptNo是指实体类中的属性或字段;

 

choose

 

<select id="queryEmp"  resultType="cn.test.entity.Emp">

          select * from emp where 1=1

          <choose>

          <when test="deptNo!=null">

          and deptno=#{deptNo}

          </when>

          <when test="deptName!=null">

          and deptname=#{deptName}

          </when>

          <otherwise>

          and personnum>#{personNum}

          </otherwise>

          </choose>

          </select>

注:上面也说了,choose相当于Java中的switch语句;当第一个when满足时;就只执行第一个when中的条件。当when中的条件都不满足时;就会执行默认的的;也就是otherwise中的语句。

 

where

 

<select id="queryEmp"  resultType="cn.test.entity.Emp">

          select * from emp

          <where>

          <if test="deptNo!=null">

          and deptno=#{deptNO}

          </if>

          <if test="deptName!=null">

          and deptno=#{deptName}

          </if>

          </where>

          </select>

 

注: where下面第一个if语句中以and开头,也可以省略第一个and ,如果第一个if语句中有andmybatis会将第一个and忽略。

 

 

 

set

 

 

<update id="updateEmp" parameterType="cn.test.entity.Emp" flushCache="true">

          update emp

          <set>

          <if test="empName!=null">empname=#{empName},</if>

          <if test="job!=null">job=#{job}</if>

          </set>

          where empno=#{empNo}

          </update>

 

 

 

注:  在mybatis中的SQL语句结尾不能加“;”,这样会导致mybatis无法识别字符;导致SQL语句的语法错误;出现 java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符的错误。的异常。

动态SQL语句***

1<if> 习惯按null来判断

2where a. WHERE 1=1 b<where>去掉开头的and或者or

3set,去掉最后的逗号,没有就不管

4foreach 遍历,collection数组类型,item当前循环的实例,open开头的字符串,close结尾的字符串,separator分隔符。最常用用在in子查询串

<foreach collection="array" item="id" open="(" close=")" separator=",">