• 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中:

                mybatis就会将where标签中拼装的sql,多出来的and或者or去掉,只会去掉第一个多出来的and或者or

    <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 concat('%',#{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 语句查询时特别有用)
  • 相关阅读:
    利用Flask中的werkzeug.security模块加密
    logging
    python后端架构(转)
    访问一个网页的全过程
    微服务优缺点
    HTTP协议通信原理 与常见报错信息
    SSH与ansible 部署方法与核心模块简介
    linux 普通用户批量创建账户与密码
    三次握手与4次挥手简单说明
    sed 命令简介
  • 原文地址:https://www.cnblogs.com/fengfuwanliu/p/10596925.html
Copyright © 2020-2023  润新知