9、mybatis中动态sql的使用
對于初學者,如何進行mybatis的學習呢?我總結了幾點,會慢慢的更新出來。首先大家需要了解mybatis是什么、用mybatis來做什么、為什么要用mybatis、有什么優缺點;當知道了為什么的時候就開始了解如何用的問題,如何使用mybatis、有幾種使用方式、各種方式的優缺點,在這個階段也會學習mybatis涉及到的一些標簽的用法;當知道了基礎用法之后,就開始接觸一些高級的用法,例如動態sql的使用、mybatis的緩存使用等;至此,在實戰項目中使用mybatis進行開發已經沒有問題了。
接下來就開始深入的研究一下mybatis這個持久層的框架,在純技術的方面進行研究,提高自己的能力。首先,大家需要了解一下mybatis的整體技術架構和工作原理;接下來,就開始了解一下mybatis各大核心組件的具體功能及其工作原理。至此,算是對mybatis的原理簡單的了解一下了,由于博主的能力有限,因此對于mybatis的框架技術研究也就到這里算結束了。
最后會了解一些其他的東西,例如:mybatis的逆向工程使用、如何開發一個mybatis插件,在這里會介紹一下mybatis的分頁實現等。
至此,mybatis也算是入門了,出去就可以和別人說,你稍微了解mybatis框架,對其也多少有一點自己的理解和看法了。
目錄
1、動態sql 如何理解?
1、1 什么是動態sql
1、2 OGNL 表達式? ? ? ??
2、動態sql 如何使用?
2、1 if 、where、set 標簽
2、2 choose (when、otherwise)標簽
2、3 trim 標簽
2、4 foreach 標簽
之前的?文章中?已經描述了mybatis進行增、刪、改、查基本操作的處理方法,還有如何使用輸入映射和輸出映射。mybatis 為了提高易用性和靈活性,還提供了動態sql的功能。
1、動態sql 如何理解?
1、1 什么是動態sql
簡單一句話,mybatis 可以根據特定的條件實現映射文件中 sql語句的動態拼接,這就是動態sql。
想一種場景,將User 傳入到sql映射文件,根據user_name 或者 age 進行數據的查詢,如果user_name 或者 age 為空時,則不需要添加這個條件,如何實現呢?帶著這個問題繼續往下看。
1、2 OGNL 表達式? ? ? ??
mybatis 中動態sql的實現使用的是一系列的標簽和屬性,這些是基于OGNL 表達式。那么什么是OGNL 表達式呢?
我沒有研究過OGNL表達式,這里對此就不做具體描述了,看一下百度百科的介紹:OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。這樣可以更好的取得數據。
OGNL 通過鏈式風格訪問對象及其屬性。
2、動態sql 如何使用?
mybatis 中動態sql的實現依賴的是一系列的標簽,包括:if、choose、when、otherwise、trim、where、set、foreach 等,具體介紹和使用說明如下。
2、1 if 、where、set 標簽
if 標簽,同java 中的if,進行條件判斷,在sql 映射文件中的基本用法如下:
<select id="getUsers" resultType="map">select * from user where<if test="id != null">id = #{id}</if><!-- ognl會自動將數字和字符串進行轉換 --><if test="age == 0">and age = #{age}</if> </select>例如:上邊這個寫法,如果id == null,就會到sql 錯誤,針對于這種情況,有兩種處理方式:?
第一種就是流行最廣泛的,直接使用萬能語句“where 1=1”;
第二種是使用where標簽,具體用法如下:
<!-- 此時 and 要寫在前邊 --> <where><if test="id != null">and id = #{id}</if><if test="age == 0">and age = #{age}</if> </where>?第三種是使用trim 自定義標簽規則實現,具體用法在 2、3 展示。
set 標簽一般用在進行數據修改sql 的拼接上,具體使用如下:
<update id="updateStudent">update student<!-- 會自動添加set ,并去掉無用的 逗號,類似于 where 標簽 --><set><if test="name != null">name = #{name}, </if><if test="age != null">age = #{age}, </if><if test="sex != null">sex = #{sex}, </if></set>where id = #{id} </update>2、2 choose (when、otherwise)標簽
選擇標簽,類似于java中的 switch,具體使用如下:
<select id="selectUsers" resultType="map"><where><choose><!-- 注意:每次只會進入一個分支 --><when test="id != null">id=#{id}</when><when test="name != null">name = #{name}</when><otherwise>age = #{age}</otherwise></choose></where> </select>2、3 trim 標簽
trim 標簽可以用來自定義拼接的規則(或者是指定sql 語句拼接時截取的規則),trim 中返回的內容是整個字符串拼接后的結果使用,接下倆使用trim 標簽繼續實現 2、1 中的需求,具體如下:
<!-- prefix: 給拼接后的字符串添加一個前綴 where --> <!-- prefixOverrides:去掉整個字符串前面為and的字符串--> <!-- suffix:給拼接后的字符串添加一個后綴 and--> <!-- suffixOverrides:去掉整個字符串后面為 and的字符串--><select id="selectUsers" resultType="map"><trim prefix="where" suffix="and" suffixOverrides="and"><if test="id != null">id = #{id}</if><if test="age == 0">age = #{age}</if></trim> </select>因為 trim 是自定義拼接的規則,所以,使用trim 也可以實現set 標簽的功能,大家可以自己嘗試寫一下,發到評論區,大家一起看一下,在這里就不寫了。?
2、4 foreach 標簽
循環拼接時用到的標簽,一般用于批量數據添加,對傳進來的 list 進行循環拼接查詢語句,具體使用方式如下:
<!-- 批量添加記錄的寫法使用 foreach 進行批量添加語句的拼接,其中collection 是接受的數據類型,item 是迭代的每一個元素separator 是連接符 --> <insert id="insertUserList" useGeneratedKeys="true" keyProperty="id">insert into oa_user (id, loginName, name) values<foreach collection="list" item="user" separator=",">(#{user.id}, #{user.loginName}, #{user.name})</foreach> </insert>好了,如果同學從?第一篇?一直看到這個地方,對于mybatis 的使用應該是有一定的了解了,在實際開發中應該沒有問題了。之后,編寫的文章中,更多的是對于一些原理性的底層性的知識介紹,有興趣的同學可以繼續。
總結
以上是生活随笔為你收集整理的9、mybatis中动态sql的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线路由器怎样连接你好我想问问路由器是怎
- 下一篇: 电商不得以拆封为由拒绝七天无理由退货电商