MyBatis動態(tài)sql查詢及多參數(shù)查詢方式
MyBatis動態(tài)sql
動態(tài)sql處理簡單的多參數(shù)查詢
常用標簽
| 標簽 | 說明 |
|---|---|
| if | 條件判斷,與java中的if語句類似 |
| where | 為sql語句動態(tài)添加where關鍵字 |
| choose | 條件判斷,這是一個組合標簽,需要與when,otherwise標簽搭配使用。 |
| foreach | 以迭代方式處理集合類型的參數(shù) |
| set | 為sql語句動態(tài)添加set關鍵字,動態(tài)實現(xiàn)數(shù)據(jù)更新 |
| trim | 對sql語句進行格式化處理,添加或移除前后綴 |
if標簽
語法
<if test="條件判斷"> ....Sql語句 </if> <!--如果test內(nèi)容為true則執(zhí)行if內(nèi)的sql語句,反之則不執(zhí)行-->
where標簽
語法
<where> ? ? <if test="條件判斷"> ? ? ....Sql語句 ? ? </if> </where> <!--where標簽用來替換sql語句中where關鍵詞-->
Eg:
?? ?//接口中
?? ?/**
? ? ?* 根據(jù)名稱,編碼模糊查
? ? ?* @param name
? ? ?* @param code
? ? ?* @return
? ? ?*/
? ? List<SmbmsProvider> listbyCodeAndName(@Param("name")String name,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Param("code")String code);?? ??? ?<!--相應的mapper映射文件-->
?? ?<!--因為傳入的參數(shù)是基本數(shù)據(jù)類型,所以parameterType屬性可省略-->
<select id="listbyCodeAndName" resultType="com.smbms.pojo.SmbmsProvider">
? ? ? ? select * from ?smbms_provider
? ? <!--where標簽 代替sql中的where關鍵詞-->
? ? ? ? <where>
? ? ? ? ? ? <!--符合if條件的則執(zhí)行相應的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)標簽
語法
<choose> ?? ?<when test="判斷條件"> ? ??? ??? ? sql語句... ? ? </when> ? ? <when test="判斷條件"> ? ? ?? ? sql語句... ? ? </when> ?? ?<otherwise> ? ? ?? ? sql語句... ? ? </otherwise> </choose> <!--此標簽相當于java中的switch語句功能-->
總結:
? 1,choose(when,otherwise)是一個組合標簽,when和otherwise寫在choose標簽中。
? 2,當when標簽中的test屬性判斷為true,就會執(zhí)行他所包含的語句。
? 3,choose中的多個when標簽指揮執(zhí)行匹配成功的第一個,執(zhí)行之后就跳出choose標簽。
? 4,當所有的when標簽中的test屬性判斷都為false時,進入otherwise標簽。
Eg:
?? ?//接口中定義方法 ?? ?/** ? ? ?*多參查找 ? ? ?* @param map ? ? ?* @return ? ? ?*/ ? ? List<SmbmsProvider> listByMoreParam(Map<String,Object> map);
<!--相應的mapper映射文件-->
<select id="listByMoreParam" parameterType="map" resultType="com.smbms.pojo.SmbmsProvider">
? ? ? ? select * from smbms_provider
? ? ? ? <where>
? ? ? ? ? ? <!--多選一的choose標簽-->
? ? ? ? ? ? <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標簽
語法
<set> ?? ?<if test="判斷條件"> ? ? ?? ?sql語句... ? ? </if> </set>
Eg:
?? ?//接口中的方法 ? ? /** ? ? ?*修改的方法 ? ? ?* @param provider ? ? ?* @return ? ? ?*/ ? ? int updateProviderInfo(SmbmsProvider provider);
<!--相應的mapper映射文件-->
<update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
? ? ? ? update `smbms_provider`
? ? <!--set標簽可以智能的忽略多余的逗號-->
? ? ? ? <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);
? ? }?總結:
where,set標簽能夠動態(tài)的為sql語句添加前后綴,并可以只能的忽略標簽前后多余的and,or或者逗號等字符。
動態(tài)sql擴展
trim標簽
語法
<trim prefix="前綴" suffix="后綴" prefixOverrides="忽略前綴" suffixOverrides="忽略后綴"> ?? ?.... </trim>
其屬性介紹
| 屬性 | 說明 |
|---|---|
| perfix | 前綴,可自動對trim標簽所包含的語句是否有返回值進行判斷,如果有返回值,則為sql語句拼接相應前綴 |
| suffix | 后綴,在trim標簽包含的語句末尾拼接后綴。 |
| prefixOverrides | 忽略的前綴,忽略trim標簽內(nèi)部首部指定的內(nèi)容。此屬性中字符 | 意為 或 。字符 ‘|’ 與前后的字符之間不能有空格。 |
| suffixOverrides | 忽略的后綴,忽略trim標簽包含內(nèi)容尾部指定的內(nèi)容。 |
eg:
<!--相應的mapper映射文件-->
<update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
update `smbms_provider`
<!--使用冬天標簽進行修改操作-->
<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="當前元素位置下標">
? ? ? ? ? ? #{元素別名}
? ? </foreach>其屬性介紹
| 屬性 | 說明 |
|---|---|
| item | 為集合或數(shù)組中的元素取的別名。 |
| open | 起始位置的拼接字符,表示in語句以 ( 開始。 |
| separator | 元素之間的連接符,表示 in 語句中的元素之間以 ,連接。 |
| close | 結束位置的拼接字符,表示 in語句以 )結束。 |
| collection | 參數(shù)名稱當參數(shù)類型為數(shù)組時,默認參數(shù)名為array。當參數(shù)類型為list集合時,默認參數(shù)為list。當參數(shù)類型為Map集合時,參數(shù)名為Map集合元素所在鍵值對的key。當參數(shù)類型為對象時,參數(shù)名為對象中集合類型的屬性名。 |
foreach標簽處理數(shù)組類型參數(shù)
?? ?//接口中的方法 ?? ?/** ? ? ?* 同時查詢多個供貨商關聯(lián)的入庫單列表數(shù)據(jù) ? ? ?* @param args ? ? ?* @return ? ? ?*/ ? ? List<SmbmsBill> listBySomeProviderId(Integer [] args);
?? ?<!--相應的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標簽處理List類型參數(shù)
//相應接口
? ? /**
? ? ?* 查詢多個供貨商關聯(lián)的入庫單列表數(shù)據(jù)參數(shù)未list集合
? ? ?* @param list
? ? ?* @return
? ? ?*/
? ? List<SmbmsBill> listBySomeProviderIdInList(@Param("list")List<Integer> list);?? ?<!--相應的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標簽處理Map類型參數(shù)
?? ?//接口中的方法 ? ? /** ? ? ?* 多參數(shù)查詢條件封裝Map入?yún)? ? ? ?* @param map ? ? ?* @return ? ? ?*/ ? ? List<SmbmsBill> listByCodeAndSomeProviderId(Map<String,Object> map);1
<!--相應的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,當參數(shù)為基本數(shù)據(jù)類型或數(shù)組,List集合類型時,myBatis框架會將參數(shù)封裝在一個Map對象中。
2,當參數(shù)為數(shù)組時,collection對應值默認為array.
3,當參數(shù)為List集合類型時,collection對應值默認為list.
4,當參數(shù)為Map對象時,collection對應值為該Map對象中數(shù)組或集合元素對應的key.
5,如果使用@Param注解為參數(shù)設置了名稱,collection對應值為參數(shù)名。
6,當參數(shù)為對象類型時,獨享中有查詢條件所需的集合屬性,collection對應值為該集合屬性名稱。
分頁功能
基于MySql的分頁查詢
//相應接口
/**
* 分頁查詢---多條件
* @param newsId 根據(jù)類型id
* @param title 根據(jù)標題名稱模糊查
* @param startRow 其實行號
* @param pageSize 每頁顯示數(shù)量
* @return 返回集合
*/
List<NewsDetail> listByPageInMoreParam(@Param("newsId")int newsId,
@Param("title")String title,
@Param("startRow")int startRow,
@Param("pageSize")int pageSize);
<!--相應的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());
}
}以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot項目配置postgresql數(shù)據(jù)庫完整步驟(配置多數(shù)據(jù)源)
PostgreSQL是一種特性非常齊全的自由軟件的對象-關系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS),下面這篇文章主要給大家介紹了關于SpringBoot項目配置postgresql數(shù)據(jù)庫(配置多數(shù)據(jù)源)的相關資料,需要的朋友可以參考下2023-05-05
Arthas在線java進程診斷工具在線調(diào)試神器詳解
Arthas是 Alibaba 開源的Java診斷工具,深受開發(fā)者喜愛。這篇文章主要介紹了Arthas在線java進程診斷工具 在線調(diào)試神器,需要的朋友可以參考下2021-11-11
Spring MVC--攔截器實現(xiàn)和用戶登陸例子
本文主要介紹了Spring MVC--攔截器實現(xiàn)和用戶登陸例子,具有很好的參考價值,下面跟著小編一起來看下吧2017-03-03

