1. 程式人生 > 實用技巧 >MyBatis 動態SQL

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>