跳转至

动态SQL

动态 SQL_MyBatis中文网

if

  • 通过test属性中的表达式判断标签中的内容是否有效
    • 有效则自动拼接至sql语句
      <select id="getEmpByCondition" resultMap="getEmpByConditionMap" >  
          select * from t_emp where
          <if test="empName != null and empName != ''">  
              emp_name = #{empName}  
          </if>  
          <if test="age != null and age != ''">  
              and age = #{age}  
          </if>  
          <if test="gender != null and gender != ''">  
              and gender = #{gender}  
          </if> 
      </select>
      

where

where和if一般结合使用

  • 如果where中的if条件都不满足,则where标签没有任何功能,也不会添加where关键字
  • 如果where中的if条件满足,则where标签会自动添加where关键字,并去除多余的and
    <select id="getEmpByCondition" resultMap="getEmpByConditionMap" >  
        select * from t_emp  
        <where>  
            <if test="empName != null and empName != ''">  
                emp_name = #{empName}  
            </if>  
            <if test="age != null and age != ''">  
                and age = #{age}  
            </if>  
            <if test="gender != null and gender != ''">  
                and gender = #{gender}  
            </if>  
        </where>  
    </select>
    

trim

  • trim用于去掉或添加标签中的内容
  • 属性:
    • prefix:在trim标签中的内容前添加某些内容
    • prefixOverrides:在trim标签的内容前去掉某些内容
    • suffix:在trim标签中的内容后添加某些内容
    • suffixOverrides:在trim标签内容后区队某些内容
      <select id="getEmpByCondition" resultMap="getEmpByConditionMap" >  
          select * from t_emp  
          <trim prefix="where" suffixOverrides="and">  
              <if test="empName != null and empName != ''">  
                  emp_name = #{empName}  
              </if>  
              <if test="age != null and age != ''">  
                  age = #{age}  
              </if>  
              <if test="gender != null and gender != ''">  
                  gender = #{gender}  
              </if>  
          </trim>  
      </select>
      

choose、when、otherwise

类似于java中的switch语句

<select id="getByChoose" resultMap="getEmpByConditionMap">  
    select * from t_emp  
    <where>  
        <choose>  
            <when test="empName != null and empName != ''">  
                emp_name = #{empName}  
            </when>  
            <when test="age != null and age != ''">  
                age = #{age}  
            </when>  
            <when test="gender != null and gender != ''">  
                gender = #{gender}  
            </when>  
        </choose>  
    </where>  
</select>

foreach

  • 对集合进行遍历
    • 声明可以在元素体内使用的集合项item和索引index变量
    • 指定开头与结尾的字符串以及集合迭代项之间的分隔符
      <insert id="insertMoreEmp">  
          insert into t_emp values  
          <foreach collection="emps" item="emp" separator=",">  
              (null, #{emp.empName}, #{emp.age}, #{emp.gender}, null)  
          </foreach>  
      </insert>
      

      [!提示] 可以将任何可迭代对象、Map对象或者数组对象作为集合参数传递给foreach