MyBatis 动态SQL

MyBatis 动态SQL

简介

动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作动态 。SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似

应用

if/where/trim

通过表达式拼接SQL
:添加where关键字,同时去掉多余and

prefix:在操作的SQL语句前加入某些内容
suffix:在操作的SQL语句后加入某些内容
prefixOverrides:把操作的SQL语句前的某些内容去掉
suffixOverrides:把操作的SQL语句后的某些内容去掉

<select id="getEmpsListByMoreTJ" resultType="<u>Emp</u>">

          select <u>eid</u>,<u>ename</u>,age,sex,did from <u>emp</u> 

          where 1=1

          <if test="<u>eid</u> != null">

              and <u>eid</u> = #{<u>eid</u>}

          </if>

          <if test="<u>ename</u> != null and <u>ename</u> != ''">

              and <u>ename</u> = #{<u>ename</u>}

          </if>

          <if test="age != null">

              and age = #{age}

          </if>

          <if test="sex == '男' or sex == '女'">

              and sex = #{sex}

          </if>

     </select>


<select id="getEmpsListByMoreTJ" resultType="Emp">

          <!-- select <u>eid</u>,<u>ename</u>,age,sex,did from <u>emp</u> --> 

          <include refid="empColumns"></include>

          <trim prefix="where" suffixOverrides="and|or"> 

              <if test="eid != null">

                   <u>eid</u> = #{<u>eid</u>} and

              </if>

              <if test="ename != null and ename != ''">

                   <u>ename</u> = #{<u>ename</u>} and

              </if>

              <if test="age != null">

                   age = #{age} or

              </if>

              <if test="sex == 1 or sex == 0">

                   sex = #{sex}

              </if>

          </trim>

     </select>


choose

:选择某一个when或otherwise拼接SQL
:通过test表达式拼接SQL
:当when都不符合条件,就会选择otherwise拼接SQL

<select id="getEmpsListByChoose" resultType="Emp">

          select <u>eid</u>,<u>ename</u>,age,sex from <u>emp</u> 

          where

          <choose>

              <when test="eid != null">

                   <u>eid</u> = #{<u>eid</u>}

              </when>

              <when test="ename != null and ename != ''">

                   <u>ename</u> = #{<u>ename</u>}

              </when>

              <when test="age != null">

                   age = #{age}

              </when>

              <otherwise>

                   sex = #{sex}

              </otherwise>

          </choose>

     </select>


foreach


对一个数组或集合进行遍历
collection:指定要遍历的集合或数组
item:设置别名
close:设置循环体的结束内容
open:设置循环体的开始内容
separator:设置每一次循环之间的分隔符
index:若遍历的是list,index代表下标;若遍历的是map,index代表键

<delete id="deleteByList">

          delete from <u>emp</u> where <u>eid</u> in

          <foreach collection="list" item="eid" 
separator="," open="(" close=")">

              #{<u>eid</u>}

          </foreach>

     </delete>


set

主要是用于解决修改操作中SQL语句中可能多出逗号的问题

<update id="updateEmpByConditionSet">

                   update  tbl_employee  

                   <set>

                            <if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">

                                      last_name = #{lastName},

                            </if>

                            <if test="email!=null and email.trim()!=''">

                                      email = #{email} ,

                            </if>

                            <if test="&quot;m&quot;.equals(gender) or &quot;f&quot;.equals(gender)">

                                     gender = #{gender} 

                            </if>

                   </set>

                    where id =#{id}

         </update>


设置公共sql

:设置一段SQL片段,即公共SQL,可以被当前映射文件中所有的SQL语句所访问
<include refid="empColumns">:访问某个SQL片段

<sql id="empColumns">select <u>eid</u>,<u>ename</u>,age,sex,did from 
<u>emp</u> </sql>

     <select id="getEmpByEid" 
resultType="com.atguigu.bean.Emp">

          <include refid="empColumns"></include> where <u>eid</u> 
= #{<u>eid</u>}

     </select>


原文地址:https://www.cnblogs.com/suit000001/p/13334672.html