版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
動(dòng)態(tài)SQL語(yǔ)句主要元素使用動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)多條件查詢使用動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)更新使用<foreach>元素實(shí)現(xiàn)復(fù)雜查詢使用<bind>元素實(shí)現(xiàn)SQL語(yǔ)句拼接第3章
動(dòng)態(tài)SQL語(yǔ)句2024/1/29回顧與作業(yè)點(diǎn)評(píng)2MyBatis基本要素核心對(duì)象SqlSessionFactoryBuilderSqlSessionFactorySqlSession通過(guò)SqlSession實(shí)例直接運(yùn)行映射的SQL語(yǔ)句基于mapper接口的方式執(zhí)行SQL語(yǔ)句系統(tǒng)核心配置文件propertiestypeAliasesenvironmentsmappersSQL映射文件核心對(duì)象最佳生命周期最佳作用域SqlSessionFactoryBuilder方法體內(nèi)方法體內(nèi)(局部變量)SqlSessionFactory從應(yīng)用服務(wù)啟動(dòng)開始一直到應(yīng)用服務(wù)停止—application整個(gè)應(yīng)用內(nèi)SqlSession一次請(qǐng)求的有效期一次請(qǐng)求的有效期內(nèi)回顧作業(yè)點(diǎn)評(píng)點(diǎn)評(píng)作業(yè)的提交情況和共性問(wèn)題學(xué)習(xí)目標(biāo)/Target3
了解動(dòng)態(tài)SQL語(yǔ)句中的主要元素及其說(shuō)明掌握動(dòng)態(tài)SQL語(yǔ)句中主要元素的使用方法
熟練掌握動(dòng)態(tài)SQL語(yǔ)句的運(yùn)用章節(jié)概述/Summary4在實(shí)際項(xiàng)目的開發(fā)中,開發(fā)人員在使用JDBC或其他持久層框架進(jìn)行開發(fā)時(shí),經(jīng)常需要根據(jù)不同的條件拼接SQL語(yǔ)句,拼接SQL語(yǔ)句時(shí)還要確保不能遺漏必要的空格、標(biāo)點(diǎn)符號(hào)等,這種編程方式給開發(fā)人員帶來(lái)了非常大的不便,而MyBatis提供的SQL語(yǔ)句動(dòng)態(tài)組裝功能,恰能很好的解決這一問(wèn)題。本章將對(duì)MyBatis框架的動(dòng)態(tài)SQL進(jìn)行詳細(xì)講解。
目錄/CONTENTS動(dòng)態(tài)SQL語(yǔ)句主要元素使用<foreach>元素實(shí)現(xiàn)復(fù)雜查詢使用動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)更新使用動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)多條件查詢5使用<bind>元素實(shí)現(xiàn)SQL語(yǔ)句拼接14325動(dòng)態(tài)SQL語(yǔ)句
主要元素01第3章動(dòng)態(tài)SQL語(yǔ)句動(dòng)態(tài)SQL有什么作用?動(dòng)態(tài)SQL中的元素7
開發(fā)人員在使用JDBC或其他類似的框架進(jìn)行數(shù)據(jù)庫(kù)開發(fā)時(shí),通常都要根據(jù)需求去手動(dòng)拼裝SQL,這是一個(gè)非常麻煩且痛苦的工作,而MyBatis提供的對(duì)SQL語(yǔ)句動(dòng)態(tài)組裝的功能,恰能很好的解決這一麻煩工作。STEP01
動(dòng)態(tài)SQL是MyBatis的強(qiáng)大特性之一,MyBatis采用了功能強(qiáng)大的基于OGNL(ObjectGraphNavigationLanguage)的表達(dá)式來(lái)完成動(dòng)態(tài)SQL。在MyBatis的映射文件中,開發(fā)人員可通過(guò)動(dòng)態(tài)SQL元素靈活組裝SQL語(yǔ)句,這在很大程度上避免了單一SQL語(yǔ)句的反復(fù)堆砌,提高了SQL語(yǔ)句的復(fù)用性。STEP03使用動(dòng)態(tài)SQL的好處動(dòng)態(tài)SQL中的元素8動(dòng)態(tài)SQL中的元素9
動(dòng)態(tài)SQL是MyBatis的強(qiáng)大特性之一,MyBatis3采用了功能強(qiáng)大的基于OGNL的表達(dá)式來(lái)完成動(dòng)態(tài)SQL。動(dòng)態(tài)SQL主要元素如下表所示:SQL元素說(shuō)明<if>判斷語(yǔ)句,用于單條件分支判斷<choose>(<when>、<otherwise>)相當(dāng)于Java中的switch...case...default語(yǔ)句,用于多條件分支判斷<where>簡(jiǎn)化SQL語(yǔ)句中where的條件判斷。<trim>可以靈活地去除多余的關(guān)鍵字。<set>解決動(dòng)態(tài)更新語(yǔ)句。<foreach>循環(huán)語(yǔ)句,常用于in語(yǔ)句等列舉條件中<bind>從OGNL表達(dá)式中創(chuàng)建一個(gè)變量,并將其綁定到上下文,常用于模糊查詢的sql中動(dòng)態(tài)SQL10基于OGNL表達(dá)式完成多條件查詢等邏輯實(shí)現(xiàn)用于實(shí)現(xiàn)動(dòng)態(tài)SQL的元素主要有iftrimwheresetchoose(when、otherwise)foreach使用動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)多條件查詢02第3章動(dòng)態(tài)SQL語(yǔ)句STEP01
在MyBatis中,<if>元素是最常用的判斷元素,它類似于Java中的if語(yǔ)句,主要用于實(shí)現(xiàn)某些簡(jiǎn)單的條件判斷。在實(shí)際應(yīng)用中,我們可能會(huì)通過(guò)某個(gè)條件查詢某個(gè)數(shù)據(jù)。例如,要查找某個(gè)客戶的信息,可以通過(guò)姓名或者年齡來(lái)查找客戶,也可以不填寫年齡直接通過(guò)姓名來(lái)查找客戶,還可以都不填寫而查詢出所有客戶,此時(shí)姓名和年齡就是非必須條件。類似于這種情況,在MyBatis中就可以通過(guò)<if>元素來(lái)實(shí)現(xiàn)。STEP03<if>元素的應(yīng)用<if>元素12<if>元素13
在MyBatis中,<if>元素是最常用的判斷語(yǔ)句,它類似于Java中的if語(yǔ)句,主要用于實(shí)現(xiàn)某些簡(jiǎn)單的條件選擇。其基本使用示例如下:select*fromtb_userwhere1=1<iftest="username!=nullandusername!=''"> andusernamelikeconcat('%',#{username},'%')</if><iftest="jobs!=nullandjobs!=''"> andjobs=#{jobs}</if>使用<if>元素對(duì)username和jobs進(jìn)行非空判斷,并動(dòng)態(tài)組裝SQL<if>元素14需求說(shuō)明改造查詢用戶信息列表的演示示例,增加查詢條件用戶角色(根據(jù)角色id查詢)用戶名稱(模糊查詢)演示示例:改造用戶表的查詢操作-多條件查詢<if>元素15當(dāng)傳入用戶角色參數(shù)為空的時(shí)候,檢索結(jié)果為空?正確結(jié)果所有用戶角色下的用戶數(shù)據(jù)原因如何處理if(判斷參數(shù)):實(shí)現(xiàn)簡(jiǎn)單的條件判斷問(wèn)題分析select*fromtb_useru,tb_roler whereu.userRole=r.idandu.userNamelikeCONCAT(‘%’,‘’,‘%’) andu.userRole=null;演示示例
:改造用戶表的查詢操作-if<where>元素16當(dāng)只傳入?yún)?shù):用戶角色,而不傳入?yún)?shù):用戶名稱的時(shí)候,控制臺(tái)報(bào)SQL異常錯(cuò)誤?正確結(jié)果指定用戶角色下的所有用戶數(shù)據(jù)原因如何處理where問(wèn)題分析select*fromtb_userwhereanduserRole=?<where>元素17where簡(jiǎn)化SQL語(yǔ)句中where條件判斷智能處理and和or演示示例:改造用戶表的查詢操作-if+where改造訂單表查詢(if)18需求說(shuō)明改造訂單表的查詢功能,使用動(dòng)態(tài)SQL完善此功能查詢條件商品名稱(模糊查詢)供應(yīng)商id是否付款查詢結(jié)果列列表訂單id、訂單編碼、商品名稱、供應(yīng)商id、供應(yīng)商名稱、訂單金額、是否付款、創(chuàng)建時(shí)間修改SQL語(yǔ)句–使用if完成時(shí)間:15分鐘練習(xí)指導(dǎo)改造供應(yīng)商表查詢(if+where)19需求說(shuō)明改造供應(yīng)商表的查詢功能,使用動(dòng)態(tài)SQL完善此功能查詢條件供應(yīng)商編碼(模糊查詢)供應(yīng)商名稱(模糊查詢)查詢結(jié)果列列表供應(yīng)商id、供應(yīng)商編碼、供應(yīng)商名稱、聯(lián)系人、聯(lián)系電話、傳真、創(chuàng)建時(shí)間修改SQL語(yǔ)句–使用if+where組合完成時(shí)間:15分鐘練習(xí)指導(dǎo)共性問(wèn)題集中講解20常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解
<trim>元素用于刪除多余的關(guān)鍵字,它可以直接實(shí)現(xiàn)<where>元素的功能。<trim>元素包含4個(gè)屬性。
<trim>元素
21屬性說(shuō)明prefix
指定給SQL語(yǔ)句增加的前綴prefixOverrides
指定SQL語(yǔ)句中要去掉的前綴字符串suffix
指定給SQL語(yǔ)句增加的后綴suffixOverrides
指定SQL語(yǔ)句中要去掉的后綴字符串<trim>元素22trim屬性prefixsuffixprefixOverridessuffixOverrides更靈活地去除多余關(guān)鍵字替代where和set<selectid="getUserList5"resultType="User"> select*fromtb_user
<trimprefix="where"prefixOverrides="and|or"> <iftest="userName!=nullanduserName!=''"> anduserNamelikeCONCAT('%',#{userName},'%') </if> <iftest="userRole!=null"> anduserRole=#{userRole} </if> </trim></select>
上述配置代碼中,<trim>元素的作用是去除一些多余的前綴字符串,它的prefix屬性代表的是語(yǔ)句的前綴(where),而prefixOverrides屬性代表的是需要去除的前綴字符串(SQL中的“AND”或“OR”)。
<where>、<trim>元素23
在前兩個(gè)小節(jié)的案例中,映射文件中編寫的SQL后面都加入了“where1=1”的條件,那么到底為什么要這么寫呢?如果將where后“1=1”的條件去掉,那么MyBatis所拼接出來(lái)的SQL將會(huì)如下所示:select*fromtb_userwhereandusernamelikeconcat('%',?,'%')
可以看出上面SQL語(yǔ)句明顯存在SQL語(yǔ)法錯(cuò)誤,而加入了條件“1=1”后,既保證了where后面的條件成立,又避免了where后面第一個(gè)詞是and或者or之類的關(guān)鍵詞。不過(guò)“where1=1”這種寫法對(duì)于初學(xué)者來(lái)將不容易理解,并且也不夠雅觀。<where>、<trim>元素24select*fromt_customerwhere1=1<choose><whentest="username!=nullandusername!=''">andusernamelikeconcat('%',#{username},'%')</when><whentest="jobs!=nullandjobs!=''">andjobs=#{jobs}</when><otherwise>andphoneisnotnull</otherwise></choose>
針對(duì)上述情況中“where1=1”,在MyBatis的SQL中就可以使用<where>或<trim>元素進(jìn)行動(dòng)態(tài)處理。<where>會(huì)自動(dòng)判斷SQL語(yǔ)句,只有<where>內(nèi)的條件成立時(shí),才會(huì)在拼接SQL中加入where關(guān)鍵字,否則將不會(huì)添加;還會(huì)去除多余的“AND”或“OR”。<where>元素處理<trim>元素處理<trim>的作用是去除特殊的字符串,它的prefix屬性代表語(yǔ)句的前綴,prefixOverrides屬性代表需要去除的哪些特殊字符串,功能和<where>基本是等效的。動(dòng)態(tài)SQL處理“where1=1”select*fromtb_user<where><iftest="username!=nullandusername!=''">andusernamelikeconcat('%',#{username},'%')</if><iftest="jobs!=nullandjobs!=''">andjobs=#{jobs}</if></where>select*fromtb_user<trimprefix="where"prefixOverrides="and"><iftest="username!=nullandusername!=''">andusernamelikeconcat('%',#{username},'%')</if><iftest="jobs!=nullandjobs!=''">andjobs=#{jobs}</if></trim>STEP01
在使用<if>元素時(shí),只要test屬性中的表達(dá)式為true,就會(huì)執(zhí)行元素中的條件語(yǔ)句,但是在實(shí)際應(yīng)用中,有時(shí)只需要從多個(gè)選項(xiàng)中選擇一個(gè)去執(zhí)行。
例如下面的場(chǎng)景:“當(dāng)客戶名稱不為空,則只根據(jù)客戶名稱進(jìn)行客戶篩選;當(dāng)客戶名稱為空,而客戶職業(yè)不為空,則只根據(jù)客戶職業(yè)進(jìn)行客戶篩選。當(dāng)客戶名稱和客戶職業(yè)都為空,則要求查詢出所有電話不為空的客戶信息?!?/p>
針對(duì)上面情況,使用<if>元素進(jìn)行處理是不合適的。MyBatis提供了<choose>、<when>、<otherwise>元素進(jìn)行處理,這三個(gè)元素往往組合在一起使用,作用相當(dāng)于Java語(yǔ)言中的if…elseif…else。STEP03<choose><when>otherwise>使用場(chǎng)景<choose>、<when>、<otherwise>元素25<choose>、<when>、<otherwise>元素26“當(dāng)客戶名稱不為空,則只根據(jù)客戶名稱進(jìn)行客戶篩選;
當(dāng)客戶名稱為空,而客戶職業(yè)不為空,則只根據(jù)客戶職業(yè)進(jìn)行客戶篩選。
當(dāng)客戶名稱和客戶職業(yè)都為空,則要求查詢出所有電話不為空的客戶信息。”假設(shè)如下場(chǎng)景:
這種情況下,使用<if>元素進(jìn)行處理是非常不合適的。如果使用的是Java語(yǔ)言,這種情況顯然更適合使用switch…case…default語(yǔ)句來(lái)處理,而在SQL中就可以使用<choose>、<when>、<otherwise>元素組合進(jìn)行處理。其基本使用示例如代碼所示:select*fromtb_userwhere1=1<choose><whentest="username!=nullandusername!=''">andusernamelikeconcat('%',#{username},'%')</when><whentest="jobs!=nullandjobs!=''">andjobs=#{jobs}</when><otherwise>andphoneisnotnull</otherwise></choose>使用<choose>及其子元素依次對(duì)條件進(jìn)行非空判斷,并動(dòng)態(tài)組裝SQLchoose(when、otherwise)27choose(when、otherwise)相當(dāng)于Java中switch語(yǔ)句當(dāng)when有條件滿足的時(shí)候,就跳出choose演示示例:改造用戶表的查詢操作-choose<choose> <whentest="條件1">…</when> <whentest="條件2">…</when> <whentest="條件3">…</when> … <otherwise>…</otherwise></choose> 改造供應(yīng)商列表查詢-choose28需求說(shuō)明實(shí)現(xiàn)按條件查詢供應(yīng)商表,查詢條件如下供應(yīng)商編碼(模糊查詢)供應(yīng)商名稱(模糊查詢)供應(yīng)商聯(lián)系人(模糊查詢)創(chuàng)建時(shí)間在本年內(nèi)(時(shí)間范圍)查詢結(jié)果列顯示:供應(yīng)商id、供應(yīng)商編碼、供應(yīng)商名稱、供應(yīng)商聯(lián)系人、創(chuàng)建時(shí)間choose(when、otherwise)完成時(shí)間:15分鐘練習(xí)指導(dǎo)共性問(wèn)題集中講解29常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解使用動(dòng)態(tài)SQL語(yǔ)句實(shí)現(xiàn)更新03第3章動(dòng)態(tài)SQL語(yǔ)句<set>元素使用場(chǎng)景
在Hibernate框架中,如果想要更新某一個(gè)對(duì)象,就需要發(fā)送所有的字段給持久化對(duì)象,然而在實(shí)際應(yīng)用中,大多數(shù)情況下都是更新某一個(gè)或幾個(gè)字段。如果更新的每一條數(shù)據(jù)都要將其所有的屬性都更新一遍,那么執(zhí)行效率是非常差的。為了解決更新數(shù)據(jù)的效率問(wèn)題,MyBatis提供了<set>元素。<set>元素主要用于更新操作,它可以在動(dòng)態(tài)SQL語(yǔ)句前輸出一個(gè)SET關(guān)鍵字,并將SQL語(yǔ)句中最后一個(gè)多余的逗號(hào)去除。<set>元素與<if>元素結(jié)合可以只更新需要更新的字段。
更新操作31<set>元素32select*fromt_customerwhere1=1<choose><whentest="username!=nullandusername!=''">andusernamelikeconcat('%',#{username},'%')</when><whentest="jobs!=nullandjobs!=''">andjobs=#{jobs}</when><otherwise>andphoneisnotnull</otherwise></choose>
在Hibernate中,想要更新某個(gè)對(duì)象,就需要發(fā)送所有的字段給持久化對(duì)象,這種想更新的每一條數(shù)據(jù)都要將其所有的屬性都更新一遍的方法,其執(zhí)行效率是非常差的。為此,在MyBatis中可以使用動(dòng)態(tài)SQL中的<set>元素進(jìn)行處理:<updateid="update"parameterType=“User">updatetb_user<set><iftest="username!=nullandusername!=''">username=#{username},</if><iftest="jobs!=nullandjobs!=''">jobs=#{jobs},</if></set>whereid=#{id}</update>使用<set>和<if>元素對(duì)username和jobs進(jìn)行更新判斷,并動(dòng)態(tài)組裝SQL。這樣就只需要傳入想要更新的字段即可<set>元素字段非空
在映射文件中使用<set>元素和<if>元素組合進(jìn)行update語(yǔ)句動(dòng)態(tài)SQL組裝時(shí),如果<set>元素內(nèi)包含的內(nèi)容都為空,則會(huì)出現(xiàn)SQL語(yǔ)法錯(cuò)誤。因此,在使用<set>元素進(jìn)行字段信息更新時(shí),要確保傳入的更新字段不能都為空。更新操作33set34更新用戶表數(shù)據(jù)時(shí),若某個(gè)參數(shù)為null時(shí),會(huì)導(dǎo)致更新錯(cuò)誤正確結(jié)果若某個(gè)參數(shù)為null,則不需要更新,保持?jǐn)?shù)據(jù)庫(kù)原值原因SQL語(yǔ)句如何處理ifset演示示例:改造用戶表的修改操作-if+set指導(dǎo)注意技能訓(xùn)練—改造供應(yīng)商表修改操作(if+set)35需求說(shuō)明改造供應(yīng)商表的修改功能,使用動(dòng)態(tài)SQL完善此功能修改SQL語(yǔ)句–使用if+set組合完成時(shí)間:15分鐘練習(xí)指導(dǎo)共性問(wèn)題集中講解36常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解使用<trim>元素更新
除了使用<set>元素外,還可以通過(guò)<trim>元素來(lái)實(shí)現(xiàn)更新操作。其中,<trim>元素的prefix屬性指定要添加的<trim>元素所包含內(nèi)容的前綴為set,suffixOverrides屬性指定去除的<trim>元素所包含內(nèi)容的后綴為逗號(hào)。更新操作37trim38if+trim使用if+trim替代if+set進(jìn)行更新用戶表數(shù)據(jù),效果一樣演示示例:改造用戶表的修改操作-if+trim<updateid="modify"parameterType="User">updatetb_user<trimprefix="set"suffixOverrides=","suffix="whereid=#{id}"> <iftest="userCode!=null">userCode=#{userCode},</if> <iftest="userName!=null">userCode=#{userName},</if> <iftest="userPassword!=null">userPassword=#{userPassword},</if></trim></update>示例改造供應(yīng)商表修改操作(if+trim)39需求說(shuō)明改造供應(yīng)商表的修改功能,使用動(dòng)態(tài)SQL完善此功能修改SQL語(yǔ)句–使用if+trim組合完成時(shí)間:15分鐘練習(xí)指導(dǎo)共性問(wèn)題集中講解40常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解使用<foreach>元素實(shí)現(xiàn)復(fù)雜查詢04第3章動(dòng)態(tài)SQL語(yǔ)句<foreach>元素42select*fromt_customerwhere1=1<choose><whentest="username!=nullandusername!=''">andusernamelikeconcat('%',#{username},'%')</when><whentest="jobs!=nullandjobs!=''">andjobs=#{jobs}</when><otherwise>andphoneisnotnull</otherwise></choose>
在一個(gè)客戶表中有1000條數(shù)據(jù),現(xiàn)在需要將id值小于100的客戶信息全部查詢出來(lái),這要怎么做呢?假設(shè)如下需求:一條一條的查詢1在Java中用for循環(huán)查詢2那如果要查詢1000條數(shù)據(jù)呢,豈不是很累?考慮過(guò)N條查詢語(yǔ)句時(shí)的查詢效率了嗎?<foreach>元素43foreach迭代一個(gè)集合,通常用于in條件屬性itemindexcollection:必須指定listarraymap-keyopenseparatorclose<foreach>元素的屬性
44屬性說(shuō)明item
表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名。該屬性為必選。index在List和數(shù)組中,index是元素的序號(hào),在Map中,index是元素的key。該屬性可選。open
表示foreach語(yǔ)句代碼的開始符號(hào),一般和close=“)”合用。常用在in條件語(yǔ)句中。該屬性可選。separator
表示元素之間的分隔符,例如,在條件語(yǔ)句中,separator=“,”會(huì)自動(dòng)在元素中間用“,”隔開,避免手動(dòng)輸入逗號(hào)導(dǎo)致SQL錯(cuò)誤,錯(cuò)誤示例如in(1,2,)。該屬性可選。close表示foreach語(yǔ)句代碼的關(guān)閉符號(hào),一般和open="("合用。常用在in條件語(yǔ)句中。該屬性可選。collection用于指定遍歷參數(shù)的類型。注意,該屬性必須指定,不同情況下,該屬性的值是不一樣的。
<foreach>元素45需求說(shuō)明:指定用戶角色(1-n個(gè)),獲取這些用戶角色下的用戶列表信息查詢SQL語(yǔ)句含有in條件使用foreach實(shí)現(xiàn)參數(shù):用戶角色列表參數(shù)類型:數(shù)組演示示例:獲取指定用戶角色下用戶列表-foreach_array分析select*fromtb_user whereuserRolein(參數(shù)1,參數(shù)2,參數(shù)3…);<foreach>元素46
針對(duì)上述需求,理想的解決方法就是使用MyBatis中動(dòng)態(tài)SQL的<foreach>元素進(jìn)行處理。其基本使用示例如下所示:<selectid="findUserByIds"parameterType="List"resultType=“User">select*fromtb_userwhereidin<foreachitem="id"index="index"collection="list"open="("separator=","close=")">#{id}</foreach></select><foreach>元素47
關(guān)于上述示例中<foreach>元素中使用的幾種屬性的描述具體如下:<foreach>主要屬性item:配置的是循環(huán)中當(dāng)前的元素。collection:配置的list是傳遞過(guò)來(lái)的參數(shù)類型(首字母小寫),它可以是一個(gè)array、list(或collection)、Map集合的鍵、POJO包裝類中數(shù)組或集合類型的屬性名等。index:配置的是當(dāng)前元素在集合的位置下標(biāo)。separator:配置的是各個(gè)元素的間隔符。open和close:配置的是以什么符號(hào)將這些集合元素包裝起來(lái)。在遍歷參數(shù)時(shí),<collection>屬性的值是必須指定的。不同情況下,該屬性的取值也是不一樣的,主要有以下三種情況。List類型
若入?yún)閱螀?shù)且參數(shù)類型是一個(gè)List,collection屬性值為list。數(shù)組類型若入?yún)閱螀?shù)且參數(shù)類型是一個(gè)數(shù)組,collection屬性值為array。Map類型
若傳入?yún)?shù)為多參數(shù),就需要把參數(shù)封裝為一個(gè)Map進(jìn)行處理,collection屬性值為Map。<collection>屬性的取值48<foreach>元素49
在使用<foreach>時(shí)最關(guān)鍵也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,而且在不同情況下,該屬性的值是不一樣的。主要有以下3種情況:如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)數(shù)組或者List的時(shí)候,collection屬性值分別為array和list(或collection)。1如果傳入的參數(shù)是多個(gè)的時(shí)候,就需要把它們封裝成一個(gè)Map了,當(dāng)然單參數(shù)也可以封裝成Map集合,這時(shí)候collection屬性值就為Map的鍵。2如果傳入的參數(shù)是POJO包裝類的時(shí)候,collection屬性值就為該包裝類中需要進(jìn)行遍歷的數(shù)組或集合的屬性名。3<foreach>元素50需求說(shuō)明:改造上一個(gè)演示示例,使用foreach實(shí)現(xiàn),參數(shù)類型改為L(zhǎng)ist演示示例:獲取指定用戶角色下用戶列表-foreach_list獲取指定供應(yīng)商列表下的訂單列表51需求說(shuō)明指定供應(yīng)商列表(1-n個(gè)),獲取這些供應(yīng)商下的訂單列表信息要求使用foreach實(shí)現(xiàn),參數(shù)類型為數(shù)組完成之后,把參數(shù)類型改為L(zhǎng)ist實(shí)現(xiàn)此功能完成時(shí)間:20分鐘練習(xí)共性問(wèn)題集中講解52常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解<foreach>元素53需求說(shuō)明:在上一個(gè)演示示例中,增加一個(gè)參數(shù):gender,要求查詢出指定性別和用戶角色列表下的用戶列表多參數(shù)封裝成Map單參數(shù)也可封裝成Map嗎?演示示例:獲取多參數(shù)下用戶列表-foreach_map分析問(wèn)題思考獲取多參數(shù)下的訂單列表54需求說(shuō)明:根據(jù)訂單編碼(模糊查詢),指定供應(yīng)商列表(1-n個(gè)),獲取相應(yīng)的訂單列表信息多參數(shù)封裝成Map完成時(shí)間:30分鐘練習(xí)指導(dǎo)共性問(wèn)題集中講解55常見(jiàn)問(wèn)題及解決辦法代碼規(guī)范問(wèn)題調(diào)試技巧共性問(wèn)題集中講解使用<bin
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國(guó)聯(lián)通江蘇省分公司招聘19人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)移動(dòng)福建公司春季校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)電信河北衡水分公司校園招聘6人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)煙草總公司海南省公司??谘┣蜒芯克衅?人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國(guó)交建軌道交通事業(yè)部招聘14人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年重慶渝中區(qū)事業(yè)單位歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年山東煙臺(tái)市棲霞市事業(yè)單位招聘本科及以上學(xué)歷畢業(yè)生入伍9人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年四川瀘州市龍馬潭區(qū)事業(yè)單位招聘工作人員19人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025上海市生物醫(yī)藥科技發(fā)展中心公開招聘5人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025上半年重慶渝中區(qū)招聘事業(yè)單位人員人員歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 校園春季安全
- 【MOOC】工程力學(xué)-浙江大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024年湖南省公務(wù)員考試《行測(cè)》真題及答案解析
- 產(chǎn)房年終總結(jié)及明年計(jì)劃
- 超市消防安全巡查制度
- 北京交通大學(xué)《數(shù)據(jù)結(jié)構(gòu)與算法》2021-2022學(xué)年期末試卷
- 足球體育說(shuō)課
- 【粵教】八上地理知識(shí)點(diǎn)總結(jié)
- 人教鄂教版五年級(jí)上冊(cè)科學(xué)復(fù)習(xí)資料
- TCGMA0330012018壓縮空氣站能效分級(jí)指南
- 國(guó)家開放大學(xué)《高級(jí)財(cái)務(wù)管理》形考任務(wù)1-3參考答案
評(píng)論
0/150
提交評(píng)論