MyBatis動(dòng)態(tài)sql查詢(xún)及多參數(shù)查詢(xún)方式
MyBatis動(dòng)態(tài)sql
動(dòng)態(tài)sql處理簡(jiǎn)單的多參數(shù)查詢(xún)
常用標(biāo)簽
| 標(biāo)簽 | 說(shuō)明 |
|---|---|
| if | 條件判斷,與java中的if語(yǔ)句類(lèi)似 |
| where | 為sql語(yǔ)句動(dòng)態(tài)添加where關(guān)鍵字 |
| choose | 條件判斷,這是一個(gè)組合標(biāo)簽,需要與when,otherwise標(biāo)簽搭配使用。 |
| foreach | 以迭代方式處理集合類(lèi)型的參數(shù) |
| set | 為sql語(yǔ)句動(dòng)態(tài)添加set關(guān)鍵字,動(dòng)態(tài)實(shí)現(xiàn)數(shù)據(jù)更新 |
| trim | 對(duì)sql語(yǔ)句進(jìn)行格式化處理,添加或移除前后綴 |
if標(biāo)簽
語(yǔ)法
<if test="條件判斷"> ....Sql語(yǔ)句 </if> <!--如果test內(nèi)容為true則執(zhí)行if內(nèi)的sql語(yǔ)句,反之則不執(zhí)行-->
where標(biāo)簽
語(yǔ)法
<where> ? ? <if test="條件判斷"> ? ? ....Sql語(yǔ)句 ? ? </if> </where> <!--where標(biāo)簽用來(lái)替換sql語(yǔ)句中where關(guān)鍵詞-->
Eg:
?? ?//接口中
?? ?/**
? ? ?* 根據(jù)名稱(chēng),編碼模糊查
? ? ?* @param name
? ? ?* @param code
? ? ?* @return
? ? ?*/
? ? List<SmbmsProvider> listbyCodeAndName(@Param("name")String name,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Param("code")String code);?? ??? ?<!--相應(yīng)的mapper映射文件-->
?? ?<!--因?yàn)閭魅氲膮?shù)是基本數(shù)據(jù)類(lèi)型,所以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語(yǔ)句-->
? ? ? ? ? ? <if test="name!=null"> and proName like concat('%',#{name},'%') ?? ??? ??? ??? ?</if>
? ? ? ? ? ? <if test="code!=null"> and proCode like concat('%',#[code],'%')</if>
? ? ? ? </where>
? ? </select>?? ?//測(cè)試類(lèi)
?? ? @Test
? ? void listbyCodeAndName() {
? ? ? ? List<SmbmsProvider> list=mapper.listbyCodeAndName("北","0");
? ? ? ? for (SmbmsProvider smbmsProvider : list) {
? ? ? ? ? ? System.out.println(smbmsProvider.getProName());
? ? ? ? }
? ? }choose(when,otherwise)標(biāo)簽
語(yǔ)法
<choose> ?? ?<when test="判斷條件"> ? ??? ??? ? sql語(yǔ)句... ? ? </when> ? ? <when test="判斷條件"> ? ? ?? ? sql語(yǔ)句... ? ? </when> ?? ?<otherwise> ? ? ?? ? sql語(yǔ)句... ? ? </otherwise> </choose> <!--此標(biāo)簽相當(dāng)于java中的switch語(yǔ)句功能-->
總結(jié):
? 1,choose(when,otherwise)是一個(gè)組合標(biāo)簽,when和otherwise寫(xiě)在choose標(biāo)簽中。
? 2,當(dāng)when標(biāo)簽中的test屬性判斷為true,就會(huì)執(zhí)行他所包含的語(yǔ)句。
? 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>?? ?//測(cè)試類(lèi)
?? ?@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();
? ? ? ? }
? ? }動(dòng)態(tài)sql處理更新功能
set標(biāo)簽
語(yǔ)法
<set> ?? ?<if test="判斷條件"> ? ? ?? ?sql語(yǔ)句... ? ? </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)簽可以智能的忽略多余的逗號(hà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判斷條件針對(duì)的是傳入對(duì)象參數(shù)中部分屬性有值-->?? ?//測(cè)試類(lèi)
?? ? ?@Test
? ? void updateProviderInfo() {
? ? ? ? result= mapper.updateProviderInfo(new SmbmsProvider("aaaa","sdsd",15L));
? ? ? ? System.out.println(result);
? ? }?總結(jié):
where,set標(biāo)簽?zāi)軌騽?dòng)態(tài)的為sql語(yǔ)句添加前后綴,并可以只能的忽略標(biāo)簽前后多余的and,or或者逗號(hào)等字符。
動(dòng)態(tài)sql擴(kuò)展
trim標(biāo)簽
語(yǔ)法
<trim prefix="前綴" suffix="后綴" prefixOverrides="忽略前綴" suffixOverrides="忽略后綴"> ?? ?.... </trim>
其屬性介紹
| 屬性 | 說(shuō)明 |
|---|---|
| perfix | 前綴,可自動(dòng)對(duì)trim標(biāo)簽所包含的語(yǔ)句是否有返回值進(jìn)行判斷,如果有返回值,則為sql語(yǔ)句拼接相應(yīng)前綴 |
| suffix | 后綴,在trim標(biāo)簽包含的語(yǔ)句末尾拼接后綴。 |
| 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>動(dòng)態(tài)sql處理集合參數(shù)
語(yǔ)法:
? ? <foreach collection="參數(shù)名稱(chēng)" item="元素別名"
? ? ??? ?open="(" separator="," close=")" index="當(dāng)前元素位置下標(biāo)">
? ? ? ? ? ? #{元素別名}
? ? </foreach>其屬性介紹
| 屬性 | 說(shuō)明 |
|---|---|
| item | 為集合或數(shù)組中的元素取的別名。 |
| open | 起始位置的拼接字符,表示in語(yǔ)句以 ( 開(kāi)始。 |
| separator | 元素之間的連接符,表示 in 語(yǔ)句中的元素之間以 ,連接。 |
| close | 結(jié)束位置的拼接字符,表示 in語(yǔ)句以 )結(jié)束。 |
| collection | 參數(shù)名稱(chēng)當(dāng)參數(shù)類(lèi)型為數(shù)組時(shí),默認(rèn)參數(shù)名為array。當(dāng)參數(shù)類(lèi)型為list集合時(shí),默認(rèn)參數(shù)為list。當(dāng)參數(shù)類(lèi)型為Map集合時(shí),參數(shù)名為Map集合元素所在鍵值對(duì)的key。當(dāng)參數(shù)類(lèi)型為對(duì)象時(shí),參數(shù)名為對(duì)象中集合類(lèi)型的屬性名。 |
foreach標(biāo)簽處理數(shù)組類(lèi)型參數(shù)
?? ?//接口中的方法 ?? ?/** ? ? ?* 同時(shí)查詢(xún)多個(gè)供貨商關(guān)聯(lián)的入庫(kù)單列表數(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>?? ?//測(cè)試類(lèi)
?? ? ?@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類(lèi)型參數(shù)
//相應(yīng)接口
? ? /**
? ? ?* 查詢(xún)多個(gè)供貨商關(guān)聯(lián)的入庫(kù)單列表數(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>?? ?//測(cè)試類(lèi)
?? ? @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類(lèi)型參數(shù)
?? ?//接口中的方法 ? ? /** ? ? ?* 多參數(shù)查詢(xún)條件封裝Map入?yún)? ? ? ?* @param map ? ? ?* @return ? ? ?*/ ? ? List<SmbmsBill> listByCodeAndSomeProviderId(Map<String,Object> map);1
<!--相應(yīng)的mapper映射文件-->
?? ??? ?<!--入?yún)㈩?lèi)型為map-->
?? ? <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>?? ?//測(cè)試類(lèi)
?? ? @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ù)類(lèi)型或數(shù)組,List集合類(lèi)型時(shí),myBatis框架會(huì)將參數(shù)封裝在一個(gè)Map對(duì)象中。
2,當(dāng)參數(shù)為數(shù)組時(shí),collection對(duì)應(yīng)值默認(rèn)為array.
3,當(dāng)參數(shù)為L(zhǎng)ist集合類(lèi)型時(shí),collection對(duì)應(yīng)值默認(rèn)為list.
4,當(dāng)參數(shù)為Map對(duì)象時(shí),collection對(duì)應(yīng)值為該Map對(duì)象中數(shù)組或集合元素對(duì)應(yīng)的key.
5,如果使用@Param注解為參數(shù)設(shè)置了名稱(chēng),collection對(duì)應(yīng)值為參數(shù)名。
6,當(dāng)參數(shù)為對(duì)象類(lèi)型時(shí),獨(dú)享中有查詢(xún)條件所需的集合屬性,collection對(duì)應(yīng)值為該集合屬性名稱(chēng)。
分頁(yè)功能
基于MySql的分頁(yè)查詢(xún)
//相應(yīng)接口
/**
* 分頁(yè)查詢(xún)---多條件
* @param newsId 根據(jù)類(lèi)型id
* @param title 根據(jù)標(biāo)題名稱(chēng)模糊查
* @param startRow 其實(shí)行號(hào)
* @param pageSize 每頁(yè)顯示數(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> //測(cè)試類(lèi)
@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)文章
java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法
這篇文章主要介紹了java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
SpringBoot項(xiàng)目配置postgresql數(shù)據(jù)庫(kù)完整步驟(配置多數(shù)據(jù)源)
PostgreSQL是一種特性非常齊全的自由軟件的對(duì)象-關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS),下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目配置postgresql數(shù)據(jù)庫(kù)(配置多數(shù)據(jù)源)的相關(guān)資料,需要的朋友可以參考下2023-05-05
Mybatis-Plus將字段設(shè)置為null解決方法
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增 強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus將字段設(shè)置為null的解決方法的相關(guān)資料,需要的朋友可以參考下2023-04-04
Arthas在線java進(jìn)程診斷工具在線調(diào)試神器詳解
Arthas是 Alibaba 開(kāi)源的Java診斷工具,深受開(kāi)發(fā)者喜愛(ài)。這篇文章主要介紹了Arthas在線java進(jìn)程診斷工具 在線調(diào)試神器,需要的朋友可以參考下2021-11-11
Spring MVC--攔截器實(shí)現(xiàn)和用戶(hù)登陸例子
本文主要介紹了Spring MVC--攔截器實(shí)現(xiàn)和用戶(hù)登陸例子,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03
Spring中的EurekaServer啟動(dòng)詳解
這篇文章主要介紹了Spring中的EurekaServer啟動(dòng)詳解,初始化eureka,包含eureka集群的同步和發(fā)布注冊(cè),這個(gè)方法時(shí)重寫(xiě)ServletContextListener#contextInitialized,是eureka啟動(dòng)的入口了,需要的朋友可以參考下2023-11-11
Spring Boot文件上傳簡(jiǎn)單實(shí)例代碼
在本篇文章里小編給大家分享的是關(guān)于Spring Boot 文件上傳簡(jiǎn)易教程以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。2019-08-08

