MyBatis動態(tài)sql查詢及多參數(shù)查詢方式
MyBatis動態(tài)sql
動態(tài)sql處理簡單的多參數(shù)查詢
常用標(biāo)簽
標(biāo)簽 | 說明 |
---|---|
if | 條件判斷,與java中的if語句類似 |
where | 為sql語句動態(tài)添加where關(guān)鍵字 |
choose | 條件判斷,這是一個(gè)組合標(biāo)簽,需要與when,otherwise標(biāo)簽搭配使用。 |
foreach | 以迭代方式處理集合類型的參數(shù) |
set | 為sql語句動態(tài)添加set關(guān)鍵字,動態(tài)實(shí)現(xiàn)數(shù)據(jù)更新 |
trim | 對sql語句進(jìn)行格式化處理,添加或移除前后綴 |
if標(biāo)簽
語法
<if test="條件判斷"> ....Sql語句 </if> <!--如果test內(nèi)容為true則執(zhí)行if內(nèi)的sql語句,反之則不執(zhí)行-->
where標(biāo)簽
語法
<where> ? ? <if test="條件判斷"> ? ? ....Sql語句 ? ? </if> </where> <!--where標(biāo)簽用來替換sql語句中where關(guān)鍵詞-->
Eg:
?? ?//接口中 ?? ?/** ? ? ?* 根據(jù)名稱,編碼模糊查 ? ? ?* @param name ? ? ?* @param code ? ? ?* @return ? ? ?*/ ? ? List<SmbmsProvider> listbyCodeAndName(@Param("name")String name, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Param("code")String code);?? ?
?? ?<!--相應(yīng)的mapper映射文件--> ?? ?<!--因?yàn)閭魅氲膮?shù)是基本數(shù)據(jù)類型,所以parameterType屬性可省略--> <select id="listbyCodeAndName" resultType="com.smbms.pojo.SmbmsProvider"> ? ? ? ? select * from ?smbms_provider ? ? <!--where標(biāo)簽 代替sql中的where關(guān)鍵詞--> ? ? ? ? <where> ? ? ? ? ? ? <!--符合if條件的則執(zhí)行相應(yīng)的sql語句--> ? ? ? ? ? ? <if test="name!=null"> and proName like concat('%',#{name},'%') ?? ??? ??? ??? ?</if> ? ? ? ? ? ? <if test="code!=null"> and proCode like concat('%',#[code],'%')</if> ? ? ? ? </where> ? ? </select>
?? ?//測試類 ?? ? @Test ? ? void listbyCodeAndName() { ? ? ? ? List<SmbmsProvider> list=mapper.listbyCodeAndName("北","0"); ? ? ? ? for (SmbmsProvider smbmsProvider : list) { ? ? ? ? ? ? System.out.println(smbmsProvider.getProName()); ? ? ? ? } ? ? }
choose(when,otherwise)標(biāo)簽
語法
<choose> ?? ?<when test="判斷條件"> ? ??? ??? ? sql語句... ? ? </when> ? ? <when test="判斷條件"> ? ? ?? ? sql語句... ? ? </when> ?? ?<otherwise> ? ? ?? ? sql語句... ? ? </otherwise> </choose> <!--此標(biāo)簽相當(dāng)于java中的switch語句功能-->
總結(jié):
? 1,choose(when,otherwise)是一個(gè)組合標(biāo)簽,when和otherwise寫在choose標(biāo)簽中。
? 2,當(dāng)when標(biāo)簽中的test屬性判斷為true,就會執(zhí)行他所包含的語句。
? 3,choose中的多個(gè)when標(biāo)簽指揮執(zhí)行匹配成功的第一個(gè),執(zhí)行之后就跳出choose標(biāo)簽。
? 4,當(dāng)所有的when標(biāo)簽中的test屬性判斷都為false時(shí),進(jìn)入otherwise標(biāo)簽。
Eg:
?? ?//接口中定義方法 ?? ?/** ? ? ?*多參查找 ? ? ?* @param map ? ? ?* @return ? ? ?*/ ? ? List<SmbmsProvider> listByMoreParam(Map<String,Object> map);
<!--相應(yīng)的mapper映射文件--> <select id="listByMoreParam" parameterType="map" resultType="com.smbms.pojo.SmbmsProvider"> ? ? ? ? select * from smbms_provider ? ? ? ? <where> ? ? ? ? ? ? <!--多選一的choose標(biāo)簽--> ? ? ? ? ? ? <choose> ? ? ? ? ? ? ? ? <when test="name!=null and name!=''"> and proName LIKE ?? ??? ?CONCAT('%',#{name},'%')</when> ? ? ? ? ? ? ? ? <when test="code!=null and code!=''"> and proCode LIKE CONCAT('%',#[code],'%')</when> ? ? ? ? ? ? ? ? <when test="contact!=null and contact!=''"> and proName LIKE CONCAT('%',#{proContact},'%')</when> ? ? ? ? ? ? ? ? ?<otherwise> and YEAR(creationDate) = YEAR(#{creationDate})</otherwise> ? ? ? ? ? ? </choose> ? ? ? ? </where> ? ? </select>
?? ?//測試類 ?? ?@Test ? ? void listByMoreParam() { ? ? ? ? try { ? ? ? ? ? ? Map<String,Object> map=new HashMap<>(); ? ? ? ? ? ? map.put("name","優(yōu)百"); ? ? ? ? ? ? map.put("code","002"); ? ? ? ? ? ? map.put("contact",null); ? ? ? ? ? ? map.put("creationDate",new SimpleDateFormat("yyyy-MM-dd").parse("2013-03-21")); ? ? ? ? ? ? List<SmbmsProvider> list=mapper.listByMoreParam(map); ? ? ? ? ? ? for (SmbmsProvider smbmsProvider : list) { ? ? ? ? ? ? ? ? System.out.println(smbmsProvider.getProName()); ? ? ? ? ? ? } ? ? ? ? } catch (ParseException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? }
動態(tài)sql處理更新功能
set標(biāo)簽
語法
<set> ?? ?<if test="判斷條件"> ? ? ?? ?sql語句... ? ? </if> </set>
Eg:
?? ?//接口中的方法 ? ? /** ? ? ?*修改的方法 ? ? ?* @param provider ? ? ?* @return ? ? ?*/ ? ? int updateProviderInfo(SmbmsProvider provider);
<!--相應(yīng)的mapper映射文件--> <update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider"> ? ? ? ? update `smbms_provider` ? ? <!--set標(biāo)簽可以智能的忽略多余的逗號--> ? ? ? ? <set> ? ? ? ? ? ? <if test="proCode!=null">proCode=#{proCode},</if> ? ? ? ? ? ? <if test="proName!=null">proName=#{proName},</if> ? ? ? ? ? ? <if test="proDesc!=null">proDesc=#{proDesc},</if> ? ? ? ? ? ? <if test="proContact!=null">proContact=#{proContact},</if> ? ? ? ? ? ? <if test="proPhone!=null">proPhone=#{proPhone},</if> ? ? ? ? ? ? <if test="proAddress!=null">proAddress=#{proAddress},</if> ? ? ? ? ? ? <if test="proFax!=null">proFax=#{proFax},</if> ? ? ? ? ? ? <if test="createdBy!=null">createdBy=#{createdBy,</if> ? ? ? ? ? ? <if test="creationDate!=null">creationDate=#{creationDate},</if> ? ? ? ? ? ? <if test="modifyDate!=null">modifyDate=#{modifyDate},</if> ? ? ? ? ? ? <if test="modifyBy!=null">modifyBy=#{modifyBy},</if> ? ? ? ? </set> ? ? ?? ? where id=#{id} ? ? </update> ?? ?<!--此方法中的if判斷條件針對的是傳入對象參數(shù)中部分屬性有值-->
?? ?//測試類 ?? ? ?@Test ? ? void updateProviderInfo() { ? ? ? ? result= mapper.updateProviderInfo(new SmbmsProvider("aaaa","sdsd",15L)); ? ? ? ? System.out.println(result); ? ? }
?總結(jié):
where,set標(biāo)簽?zāi)軌騽討B(tài)的為sql語句添加前后綴,并可以只能的忽略標(biāo)簽前后多余的and,or或者逗號等字符。
動態(tài)sql擴(kuò)展
trim標(biāo)簽
語法
<trim prefix="前綴" suffix="后綴" prefixOverrides="忽略前綴" suffixOverrides="忽略后綴"> ?? ?.... </trim>
其屬性介紹
屬性 | 說明 |
---|---|
perfix | 前綴,可自動對trim標(biāo)簽所包含的語句是否有返回值進(jìn)行判斷,如果有返回值,則為sql語句拼接相應(yīng)前綴 |
suffix | 后綴,在trim標(biāo)簽包含的語句末尾拼接后綴。 |
prefixOverrides | 忽略的前綴,忽略trim標(biāo)簽內(nèi)部首部指定的內(nèi)容。此屬性中字符 | 意為 或 。字符 ‘|’ 與前后的字符之間不能有空格。 |
suffixOverrides | 忽略的后綴,忽略trim標(biāo)簽包含內(nèi)容尾部指定的內(nèi)容。 |
eg:
<!--相應(yīng)的mapper映射文件--> <update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider"> update `smbms_provider` <!--使用冬天標(biāo)簽進(jìn)行修改操作--> <trim prefix="set" suffixOverrides="," suffix=" where id=#{id}"> <if test="proCode!=null">proCode=#{proCode},</if> <if test="proName!=null">proName=#{proName},</if> <if test="proDesc!=null">proDesc=#{proDesc},</if> <if test="proContact!=null">proContact=#{proContact},</if> <if test="proPhone!=null">proPhone=#{proPhone},</if> <if test="proAddress!=null">proAddress=#{proAddress},</if> <if test="proFax!=null">proFax=#{proFax},</if> <if test="createdBy!=null">createdBy=#{createdBy,</if> <if test="creationDate!=null">creationDate=#{creationDate},</if> <if test="modifyDate!=null">modifyDate=#{modifyDate},</if> <if test="modifyBy!=null">modifyBy=#{modifyBy},</if> </trim> </update>
動態(tài)sql處理集合參數(shù)
語法:
? ? <foreach collection="參數(shù)名稱" item="元素別名" ? ? ??? ?open="(" separator="," close=")" index="當(dāng)前元素位置下標(biāo)"> ? ? ? ? ? ? #{元素別名} ? ? </foreach>
其屬性介紹
屬性 | 說明 |
---|---|
item | 為集合或數(shù)組中的元素取的別名。 |
open | 起始位置的拼接字符,表示in語句以 ( 開始。 |
separator | 元素之間的連接符,表示 in 語句中的元素之間以 ,連接。 |
close | 結(jié)束位置的拼接字符,表示 in語句以 )結(jié)束。 |
collection | 參數(shù)名稱當(dāng)參數(shù)類型為數(shù)組時(shí),默認(rèn)參數(shù)名為array。當(dāng)參數(shù)類型為list集合時(shí),默認(rèn)參數(shù)為list。當(dāng)參數(shù)類型為Map集合時(shí),參數(shù)名為Map集合元素所在鍵值對的key。當(dāng)參數(shù)類型為對象時(shí),參數(shù)名為對象中集合類型的屬性名。 |
foreach標(biāo)簽處理數(shù)組類型參數(shù)
?? ?//接口中的方法 ?? ?/** ? ? ?* 同時(shí)查詢多個(gè)供貨商關(guān)聯(lián)的入庫單列表數(shù)據(jù) ? ? ?* @param args ? ? ?* @return ? ? ?*/ ? ? List<SmbmsBill> listBySomeProviderId(Integer [] args);
?? ?<!--相應(yīng)的mapper映射文件-->?? ?<select id="listBySomeProviderId" resultType="com.smbms.pojo.SmbmsBill"> ? ? ? ? SELECT * ? ? ? ? FROM `smbms_bill` ? ? ? ? WHERE `providerId` ?in? ? ? ? ? <foreach collection="array" item="item" open="(" separator="," close=")" > ? ? ? ? ? ? #{item} ? ? ? ? </foreach> ? ? </select>
?? ?//測試類 ?? ? ?@Test ? ? void listBySomeProviderId() { ? ? ? ? Integer [] ?someId={1,2,3}; ? ? ? ? List<SmbmsBill> list= billMapper.listBySomeProviderId(someId); ? ? ? ? System.out.println(list.size()); ? ? ? ? for (SmbmsBill bill : list) { ? ? ? ? ? ? System.out.println(bill.getProductName()); ? ? ? ? } ? ? }
foreach標(biāo)簽處理List類型參數(shù)
//相應(yīng)接口 ? ? /** ? ? ?* 查詢多個(gè)供貨商關(guān)聯(lián)的入庫單列表數(shù)據(jù)參數(shù)未list集合 ? ? ?* @param list ? ? ?* @return ? ? ?*/ ? ? List<SmbmsBill> listBySomeProviderIdInList(@Param("list")List<Integer> list);
?? ?<!--相應(yīng)的mapper映射文件--> ?? ?<select id="listBySomeProviderIdInList" resultType="com.smbms.pojo.SmbmsBill"> ? ? ? ? SELECT * ? ? ? ? FROM `smbms_bill` ? ? ? ? WHERE `providerId` ?in ? ? ? ? <foreach collection="list" item="item" open="(" separator="," close=")" > ? ? ? ? ? ? #{item} ? ? ? ? </foreach> ? ? </select>
?? ?//測試類 ?? ? @Test ? ? void listBySomeProviderIdInList() { ? ? ? ? List<Integer> listParam=new ArrayList<>(); ? ? ? ? listParam.add(1); ? ? ? ? listParam.add(2); ? ? ? ? listParam.add(3); ? ? ? ? List<SmbmsBill> list= billMapper.listBySomeProviderIdInList(listParam); ? ? ? ? System.out.println(list.size()); ? ? ? ? for (SmbmsBill bill : list) { ? ? ? ? ? ? System.out.println(bill.getProductName()); ? ? ? ? } ? ? }
foreach標(biāo)簽處理Map類型參數(shù)
?? ?//接口中的方法 ? ? /** ? ? ?* 多參數(shù)查詢條件封裝Map入?yún)? ? ? ?* @param map ? ? ?* @return ? ? ?*/ ? ? List<SmbmsBill> listByCodeAndSomeProviderId(Map<String,Object> map);1
<!--相應(yīng)的mapper映射文件--> ?? ??? ?<!--入?yún)㈩愋蜑閙ap--> ?? ? <select id="listByCodeAndSomeProviderId" parameterType="map"? ? ? ? ? ? ? ?resultType="com.smbms.pojo.SmbmsBill"> ? ? ? ? SELECT * ? ? ? ? FROM `smbms_bill` ? ? ? ? <where> ? ? ? ? ? ? <!--code為map集合中的key--> ? ? ? ? ? ? <if test="code!=null"> ? ? ? ? ? ? ? ? AND `billCode` LIKE CONCAT('%',#[code],'%') ? ? ? ? ? ? </if> ? ? ? ? ? ? <if test="providerIds!=null"> ? ? ? ? ? ? ? ? AND `providerId` IN ? ? ? ? ? ? ? ??? ? ?<!--providerIds為map集合中的key--> ? ? ? ? ? ? ? ? <foreach collection="providerIds" ? ? ? ? ? ? ? ? ? ? ? ? ?open="(" separator="," close=")" item="items"> ? ? ? ? ? ? ? ? ? ? #{items} ? ? ? ? ? ? ? ? </foreach> ? ? ? ? ? ? </if> ? ? ? ? </where> ? ? </select>
?? ?//測試類 ?? ? @Test ? ? void listByCodeAndSomeProviderId() { ? ? ? ? List<Integer> providerIds=new ArrayList<>(); ? ? ? ? providerIds.add(1); ? ? ? ? providerIds.add(2); ? ? ? ? providerIds.add(3); ? ? ? ? Map<String,Object> map=new HashMap<>(); ? ? ? ? map.put("providerIds",providerIds); ? ? ? ? map.put("code","1"); ? ? ? ? List<SmbmsBill> list= billMapper.listByCodeAndSomeProviderId(map); ? ? ? ? System.out.println(list.size()); ? ? }
注意:
1,當(dāng)參數(shù)為基本數(shù)據(jù)類型或數(shù)組,List集合類型時(shí),myBatis框架會將參數(shù)封裝在一個(gè)Map對象中。
2,當(dāng)參數(shù)為數(shù)組時(shí),collection對應(yīng)值默認(rèn)為array.
3,當(dāng)參數(shù)為List集合類型時(shí),collection對應(yīng)值默認(rèn)為list.
4,當(dāng)參數(shù)為Map對象時(shí),collection對應(yīng)值為該Map對象中數(shù)組或集合元素對應(yīng)的key.
5,如果使用@Param注解為參數(shù)設(shè)置了名稱,collection對應(yīng)值為參數(shù)名。
6,當(dāng)參數(shù)為對象類型時(shí),獨(dú)享中有查詢條件所需的集合屬性,collection對應(yīng)值為該集合屬性名稱。
分頁功能
基于MySql的分頁查詢
//相應(yīng)接口 /** * 分頁查詢---多條件 * @param newsId 根據(jù)類型id * @param title 根據(jù)標(biāo)題名稱模糊查 * @param startRow 其實(shí)行號 * @param pageSize 每頁顯示數(shù)量 * @return 返回集合 */ List<NewsDetail> listByPageInMoreParam(@Param("newsId")int newsId, @Param("title")String title, @Param("startRow")int startRow, @Param("pageSize")int pageSize);
<!--相應(yīng)的mapper映射文件--> <select id="listByPageInMoreParam" resultType="com.news.pojo.NewsDetail"> SELECT * FROM `news_detail` <where> <if test="title != null and title != ''"> and `title` LIKE CONCAT('%',#{title},'%') </if> <if test="newsId != null and newsId!=-1"> AND `categoryId`=#{newsId} </if> </where> limit #{startRow} ,#{pageSize} </select>
//測試類 @Test void listByPageInMoreParam() { NewDetailMapper mapper= MyBatisUtil.getSqlSession().getMapper(NewDetailMapper.class); List<NewsDetail> list= mapper.listByPageInMoreParam(2,null,0,2); System.out.println(list.size()); for (NewsDetail detail : list) { System.out.println(detail.getTitle()); } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
elasticsearch分布式及數(shù)據(jù)的功能源碼分析
這篇文章主要為大家介紹了elasticsearch分布式及數(shù)據(jù)功能源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Java8深入學(xué)習(xí)系列(三)你可能忽略了的新特性
一提到Java 8就只能聽到lambda,但這不過是其中的一個(gè)而已,Java 8還有許多新的特性,有一些功能強(qiáng)大的新類或者新的用法,還有一些功能則是早就應(yīng)該加到Java里了,所以下面這篇文章主要給大家介紹了關(guān)于Java8中大家可能忽略了的一些新特性,需要的朋友可以參考下。2017-08-08Spring @Bean vs @Service注解區(qū)別
本篇文章主要介紹了Spring @Bean vs @Service注解區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12Spring?代理?Bean?獲取不到原始?Bean?對象注解解決方法
這篇文章主要介紹了Spring?代理?Bean?獲取不到原始?Bean?對象注解解決方法,文章圍繞主題相關(guān)資料展開詳細(xì)介紹,需要的小伙伴可以參考一下2022-04-04Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常
Java經(jīng)驗(yàn)點(diǎn)滴:處理沒有被捕獲的異常...2006-12-12Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程
Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程...2006-12-12ssh框架實(shí)現(xiàn)文件上傳下載實(shí)例代碼
本篇文章主要介紹了ssh框架文件上傳下載實(shí)例代碼,實(shí)例分析了Spring+struts+Hibernate的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03