MyBatis探究-----动态SQL详解

Posted fengfuwanliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis探究-----动态SQL详解相关的知识,希望对你有一定的参考价值。

   1.if标签

     接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);

            XML中:where 1=1必不可少

<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
        select * from t_employee where 1=1
        <if test="empId!=null">
            and empId=#{empId}
        </if>
        <if test="empName!=null &amp;&amp; empName.trim()!=&quot;&quot;">
            and empName like #{empName}
        </if>        
        <if test="empSex==0 or empSex==1">
            and empSex=#{empSex}
        </if>
        <if test="empAge!=null">
            and empAge=#{empAge}
        </if>
</select>

   2.where标签

     接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);

            XML中:

<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
        select * from t_employee
        <where>
            <if test="empId!=null">
                empId=#{empId}
            </if>
            <if test="empName!=null &amp;&amp; empName.trim()!=&quot;&quot;">
                and empName like #{empName}
            </if>
            <if test="empSex==0 or empSex==1">
                and empSex=#{empSex}
            </if>
            <if test="empAge!=null">
                and empAge=#{empAge}
            </if>
        </where>
</select>

   3.set标签

     接口中方法:public Integer updateEmp(Employee emp);

            XML中:

<update id="updateEmp">
        <!-- Set标签的使用  推荐 -->
        <!-- update t_employee
        <set>
            <if test="empName!=null">
                empName=#{empName},
            </if>
            <if test="empSex==0 or empSex==1">
                empSex=#{empSex},
            </if>
            <if test="empAge!=null">
                empAge=#{empAge}
            </if>
        </set>
        where empId=#{empId} -->
        
        <!-- Trim:更新拼串 -->
        update t_employee 
        <trim prefix="set" suffixOverrides=",">
            <if test="empName!=null">
                empName=#{empName},
            </if>
            <if test="empSex==0 or empSex==1">
                empSex=#{empSex},
            </if>
            <if test="empAge!=null">
                empAge=#{empAge}
            </if>
        </trim>
        where empId=#{empId} 
</update>

   4.trim标签

     接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee);

            XML中:

<select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee">
         select * from t_employee
         <!-- 后面多出的and或者or where标签不能解决 
         prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
                 prefix给拼串后的整个字符串加一个前缀 
         prefixOverrides="":
                 前缀覆盖: 去掉整个字符串前面多余的字符
         suffix="":后缀
                 suffix给拼串后的整个字符串加一个后缀 
         suffixOverrides=""
                 后缀覆盖:去掉整个字符串后面多余的字符
                 
         -->
         <!-- 自定义字符串的截取规则 -->
         <trim prefix="where" suffixOverrides="and">
             <if test="empId!=null">
                 empId=#{empId} and
             </if>
             <if test="empName!=null &amp;&amp; empName!=&quot;&quot;">
                 empName like #{empName} and
             </if>
             <if test="empSex==0 or empSex==1">
                and empSex=#{empSex}
            </if>
            <if test="empAge!=null">
                and empAge=#{empAge}
            </if>
         </trim>
</select>                 

   5.foreach标签

5.1 批量查询

    接口中方法:public List<Employee> getEmpsByempIdList(@Param("empIdList")List<String> empIdList);

           XML中:

<select id="getEmpsByempIdList" resultType="com.mybatis.entity.Employee">
        select * from t_employee
        <!-- collection:指定要遍历的集合 
             item:将当前遍历出的元素赋值给指定的变量 
             separator:每个元素之间的分隔符 
             open:遍历出所有结果拼接一个开始的字符 
             close:遍历出所有结果拼接一个结束的字符 
         -->
        <foreach collection="empIdList" item="empId" separator=","
            open="where empId in(" close=")">
            #{empId}
        </foreach>
</select>

5.2 批量插入

    接口中方法:public Integer addEmployees(@Param("emps")List<Employee> emps);

           XML中:

<insert id="addEmployees">
        <!-- 第一种方式:推荐 -->
        insert into
        t_employee(empId,empName,empSex,empAge)
        values
        <foreach collection="emps" item="emp" separator=",">
            (#{emp.empId},#{emp.empName},#{emp.empSex},#{emp.empAge})
        </foreach>

        <!-- 第二种方式:不推荐 需要数据库连接属性allowMultiQueries=true -->
        <!-- 
           <foreach collection="emps" item="emp" separator=";"> 
              insert into t_employee(empId,empName,empSex,empAge) 
              values(#{emp.empId},#{emp.empName},#{emp.empSex},#{emp.empAge}) 
           </foreach> 
        -->
</insert>

5.3 批量删除

    接口中方法:public Integer deleteEmpsByempIdList(@Param("empIdList")List<String> empIdList);

           XML中:

<delete id="deleteEmpsByempIdList">
       delete from t_employee
       <foreach collection="empIdList" item="empId" separator="," 
            open="where empId in(" close=")">
            #{empId}
       </foreach>
</delete>

   6.choose标签

     接口中方法:public List<Employee> getEmpsByChooseCondition(Employee emp);

            XML中:

<select id="getEmpsByChooseCondition" resultType="com.mybatis.entity.Employee">
       select * from t_employee
       <where>
          <!-- 如果带了empId就用empId查,如果带了empName就用empName查;只会进入其中一个 -->
          <choose>
             <when test="empId!=null">
                     empId=#{empId}
                 </when>
                 <when test="empName!=null">
                     empName like #{empName}
                 </when>
                 <otherwise>
                     empSex = 0
                 </otherwise>
          </choose>
       </where>
</select>

总结:mybatis 的动态sql语句是基于OGNL表达式的,主要有以下几类(可以随机组合)

  •   if  简单的条件判断
  •   choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
  •   trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
  •   where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
  •   set (主要用于更新时)
  •   foreach (在实现 mybatis in 语句查询时特别有用)

以上是关于MyBatis探究-----动态SQL详解的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 详解------动态SQL

Mybatis复杂查询动态sql及缓存详解

MyBatis动态SQL标签用法

mybatis学习(39):动态sql片段

超全MyBatis动态SQL详解!( 看完SQL爽多了)

MyBatis的动态SQL详解