貝索斯談太空中的“上帝視角”:那次經歷的衝擊遠超預期
一、<if>元素
<if>元素:判斷語句,用於單條件分支判斷。
test屬性:對POJO物件的屬性進行非空判斷,如果傳入的查詢條件非空,就進行動態SQL組裝。
<select id="selectEmployee" resultType="employee" parameterType="employee"> select * from employee where 1=1 <if test="id != null and id != ''"> and id = #{id}</if> <if test="name != null and name != ''"> and name = #{name} </if> <if test="salary != null and salary != ''"> and salary = #{salary} </if> </select>
二、<choose>、<when>、<otherwise>元素
<choose>元素:從多個選擇中選擇一個
<when>元素:屬性test,判斷傳入的屬性是否非空
<otherwise>元素:
注意:<choose>、<when>、<otherwise>元素相當於switch...case....default
<select id="selectEmployee2" resultType="employee" parameterType="employee"> select * from employee where 1=1 <choose> <when test="id != null and id != ''"> and id = #{id} </when> <when test="name != null and name != ''"> and name like concat('%',#{name},'%') </when> <otherwise> and salary > #{salary} </otherwise> </choose> </select>
三、<where>、<trim>元素
替換掉動態SQL查詢時“where 1=1”的條件,衍生出來的<where>、<trim>元素,作用一致
<where>元素:替代“where 1=1”,相當於where,會自動去除where之後多於的AND和OR
<select id="selectEmployee3" resultType="employee" parameterType="employee"> select * from employee <where> <if test="id != null and id != ''"> and id = #{id} </if> <if test="name != null and name != ''"> and name like concat('%',#{name},'%') </if> <if test="salary != null"> and salary > #{salary} </if> </where> </select>
<trim>元素:替代“where 1= 1”,方式區別稍區別於<where>元素
prefix元素:代表語句的字首,用where連線
prefixOverrides元素:去除那些多餘特殊的字串,比如and和or
<select id="selectEmployee4" resultType="employee" parameterType="employee"> select * from employee <trim prefix="where" prefixOverrides="AND"> <if test="id != null and id != ''"> and id = #{id} </if> <if test="name != null and name != ''"> and name like concat('%',#{name},'%') </if> <if test="salary != null"> and salary > #{salary} </if> </trim> </select>
四、<set>元素
概述:進行動態的SQL語句更新操作,讓程式更新需要更新的欄位
主要作用:在動態的SQL語句前面輸出set關鍵字,並將SQL語句中最後一個多餘的逗號去除
注意:如果<set>元素內包含的內容都為空,就會出現語法錯誤。所以在使用<set>元素進行欄位的資訊更新時,要確保傳入的更新欄位不能都為空
<update id="updateEmployee" parameterType="employee"> update employee <set> <if test="name != null and name != ''"> name = #{name}, </if> <if test="salary != null"> salary = #{salary}, </if> </set> <where> id = #{id} </where> </update>
五、<foreach>元素
<foreach>元素:通常在構建IN條件語句時使用,對傳入的集合或陣列進行遍歷以及動態的SQL組裝。
collection屬性:集合為list(或collection)、陣列為array
item屬性:需要遍歷的項
index屬性:當前元素的下標
open、close屬性:配置以什麼符號將這些元素包裝起來
separator屬性:配置各個元素之間的分隔符
<select id="selectEmployee5" resultType="employee" parameterType="List"> select * from employee where id in <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> <select id="selectEmployee6" resultType="employee" parameterType="int[]"> select * from employee where id in <foreach collection="array" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>
六、<bind>元素
<bind>元素:覺接模糊查詢${}帶來的注入問題,concat()函式只使用於MySQL資料庫的問題
name屬性:定義變數,直接引用該變數就可以進行動態的組裝
value屬性:進行拼接查詢的字串
<select id="selectEmployee7" resultType="employee" parameterType="employee"> <bind name="p_name" value="'%'+_parameter.getName()+'%'"/> select * from employee where name like ${p_name} </select>