目錄
1. 動態sql的應用
1. 動態sql的應用
使用Mybatis框架時, 對于sql數據的操作量比較大的時候, 看著會覺得很亂, 可能寫著寫著就亂了, 或者說回過頭來發現sql語句寫錯了, 很麻煩, 所以動態sql就可以讓我們用Java代碼, 替換部分sql語句
1.2 <if>
<select id="findUserByNameAndAge" resultType="User">SELECT * FROM usersWHERE 1 = 1<if test="name != null and name != ''">AND name = #{name}</if><if test="age != null">AND age = #{age}</if>
</select>
當?name?不為空字符串且不為?null?時,會在 SQL 語句中添加?AND name = #{name};當?age?不為?null?時,會添加?AND age = #{age}
所以當第一個if語句成立時, 完整的sql語句是這樣的:
SELECT * FROM users
? ? WHERE 1 = 1 AND name = #{name}
?當兩個if語句都成立時, 完整的sql語句是這樣的:
SELECT * FROM users
? ? WHERE 1 = 1 AND name = #{name} AND age = #{age}
?那么為什么要加一個 1 = 1 并且每一個if語句后面要加一個AND嗎?思考一下
如果兩個if語句同時成立,那么第一個一個if語句就不需要AND,第二個if語句需要AND連接, 如果第一個if語句不成立,第二個if語句成立呢, 那就意味著不需要AND, 這就與前者相矛盾
既然如此, 當sql語句涉及到多個判斷條件時, 可以在where后面, 加一個永遠正確的判斷, 這樣就可以很好的解決矛盾
1.2 <where>
既然前面說到了if語句和where關鍵詞有沖突, 那么當然會有一個where語句解決沖突, where語句會自動處理第一個AND,OR, 這很好的解決了前面的問題, 使得代碼完全和不使用動態sql一致.
<select id="findUserByNameAndAge" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
可以看到, 第一個判斷語句沒有了AND, 并且省去了1=1 恒正確式
1.3?<choose>、<when>、<otherwise>?標簽
這三個標簽組合使用,類似于 Java 中的?switch - case - default?語句,會從多個條件中選擇一個滿足的條件執行。
<select id="findUserByCondition" resultType="User">SELECT * FROM usersWHERE 1 = 1<choose><when test="name != null and name != ''">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 'active'</otherwise></choose>
</select>
otherwise可以當作default,? 這些標簽了解即可,盡量用簡單的方式表達
無論是大廠還是小廠,都力求簡潔, 完美主義不可取, 在你看來花了很多時間完善的一些業務的bug, 覺得甲方的功能, 頁面不好看, 就自己改, 在別人看來就是無用功, 而且還會影響項目進度
1.4 <set>
<set>?標簽用于動態更新 SQL 語句中的?SET?子句,會自動處理多余的逗號。
<update id="updateUser" parameterType="User">UPDATE users<set><if test="name != null and name != ''">name = #{name},</if><if test="age != null">age = #{age}</if></set>WHERE id = #{id}
</update>
如果?<if>?標簽中的條件都不滿足,<set>?標簽不會添加?SET?關鍵字;如果有條件滿足,<set>?標簽會自動添加?SET?關鍵字,并去掉最后一個條件后的逗號。
?這些都是常用的標簽, 簡單的sql語句可以直接寫, 切記不要把簡單復雜化