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