Mybatis中的動態SQL語句解析
這篇文章主要介紹了Mybatis中的動態SQL語句解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
Mybatis中配置SQL有兩種方式,一種是利用xml 方式進行配置,一種是利用註解進行配置。
Mybatis使用註解配置SQL,但是由於配置功能受限,而且對於複雜的SQL而言可讀性很差,所以很少使用。
Mybatis常用xml配置的方式,使用xml的幾個簡單的元素,便能完成動態SQL的功能,大量的判斷都可以在mybaties的對映xml裡面配置,以達到許多需要大量程式碼才能實現的功能,大大減少了程式碼量,體現了Mybatis的靈活、高度可配置性和維護性。
元素 | 作用 | 備註 |
if | 判斷語句 | 單條件分支判斷 |
choose(when,otherwise) | 相當於Java中的switch和case語句 | 多條件分支判斷 |
trim | 輔助元素,用於處理特定的SQL拼裝問題 | 用於處理SQL拼裝的問題 |
foreach | 迴圈語句 | 在in語句等列表條件常用 |
if元素
if元素是最常用的判斷語句,相當於Java中國的 if 語句,它常常與test屬性聯合使用。
<select id="findRole1" parameterType="string" resultMap="roleResultMap"> select role_no,role_name,note from t_role where 1=1 <if test="roleName != null and roleName !=''"> and role_name like concat('%',#{roleName},'%') </if> </select>
當引數roleName傳遞進對映器時,如果引數不為空,則採取構造對 roleName 的模糊查詢,否則就不要去構造這個條件。通過Mybaties的 if 元素節省了許多拼接SQL的工作,集中在 xml 裡面維護。
choose、when、otherwise元素
如果在判斷時有更多的選擇,不只是兩種選擇,也就是類似switch...case...default...功能的語句。在對映的SQL語句中,使用choose、when、otherwise元素承擔這個功能。
<select id="findRole2" parameterType="role" resultMap="roleResultMap"> select role_no,note from t_role where 1=1 <choose> <when test="roleNo != null and roleNo !=''"> AND role_no = #{roleNo} </when> <when test="roleName != null and roleName !=''"> AND role_name like concat('%','%') </when> <otherwise> AND note is not null </otherwise> </choose> </select>
上述的場景就是:
首先,如果角色編號不為空,則只用角色編號作為條件查詢。
當角色編號為空,而角色名稱不為空,則使用角色名稱作為條件進行模糊查詢。
當角色編號和角色編號都為空,則要求角色備註不為空。
trim、where、set元素
在前面的SQL語句中加入了“1=1”,這樣可以實現其功能,但是有一個更好的實現,那就是使用where。當where元素裡面的條件成立時,才會加入where這個SQL關鍵字到組裝的SQL裡面,否則不會加入。
<select id="findRole3" parameterType="role" resultMap="roleResultMap"> select role_no,note from t_role <where> <if test="roleName != null and roleName !=''"> and role_name like concat('%','%') </if> <if test="note != null and note !=''"> and note like concat('%',#{note},'%') </if> </where> </select>
有時需要去掉一些特殊的SQL語法,比如常見的and、or等。使用trim元素也可以達到預期效果。其中prefix代表的語句的字首,prefixOverrides代表的是需要去掉哪種字串。與前面的where語句是等效的。
<select id="findRole4" parameterType="string" resultMap="roleResultMap"> select role_no,note from t_role <trim prefix="where" prefixOverrides="and"> <if test="roleName != null and roleName !=''"> and role_name like concat('%','%') </if> </trim> </select>
在hibernate中如果因為更新某一個欄位而不得已傳送所有的欄位給持久化物件,這樣影響了SQL語句的執行效率。最佳的方法是把主鍵和更新欄位的值傳遞給SQL去更新。set元素就可以實現此功能。set元素遇到逗號,它會自動將對應的逗號去掉。
<update id="updateRole" parameterType="role"> update t_role <set> <if test="roleName != null and roleName !=''"> role_name = #{roleName},</if> <if test="note != null and note != ''"> note = #{note} </if> </set> where role_no = #{roleNo} </update>
foreach元素
foreach元素是一個迴圈語句,它的作用是遍歷集合,它能很好的支援陣列和List、Set介面的集合,對此提供遍歷的功能,它往往用於SQL中的in關鍵字。
<select id="findRoleByNums" resultMap="roleResultMap"> select role_no,note from t_role where role_no in <foreach item="roleNo" index="index" collection="roleNoList" open="(" separator="," close=")"> #{roleNo} </foreach> </select>
collection配置的roleNoList是傳遞進來的引數名稱,它可以是一個數組、List、Set等集合。
item配置的是迴圈中當前的元素。
index配置的是當前元素在集合的位置下標。
open和close配置的是以什麼符號將這些集合元素包裝起來。
separator是各個元素的分隔符。
用test的屬性判斷字串
test用於條件判斷語句,其作用相當於判斷真假,在大多數場景下,主要用於判斷空和非空的。
<select id="getRoleTest" parameterType="string" resultMap="roleResultMap"> select role_no,note from t_role <if test="type == 'Y'.toString()"> where 1=1 </if> </select>
如果把 type='Y'傳遞給SQL,就可以實現Mybatis加入了條件 where 1=1,所以對於字串的判斷,可以加入 toString ()的方法進行比較。
bind元素
bind元素的作用是通過OGNL表示式去定義一個上下文變數,這樣更方便使用。
例如在模糊查詢時,如果是MySQL資料庫,常常用到一個concat,它用 % 和 引數相連。然而在Oracle資料庫中則沒有,Oracle資料庫用連線符號是 “||”,這樣SQL就需要兩種形式去實現,用bind元素,就不用使用資料庫語言。
<select id="findRole5" parameterType="string" resultMap="roleResultMap"> <bind name="pattern" value="'%' + _parameter + '%'" /> SELECT role_no,note FROM t_role where role_name like #{pattern} </select>
以上就是我在學習過程中對於Mybatis中的動態SQL語句的常見知識點總結,希望大家可以一起學習進步!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。