最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis動態(tài)sql查詢及多參數(shù)查詢方式

 更新時間:2022年10月27日 14:31:05   作者:多羅羅~  
這篇文章主要介紹了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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java實現(xiàn)分布式項目搭建的方法

    java實現(xiàn)分布式項目搭建的方法

    這篇文章主要介紹了java實現(xiàn)分布式項目搭建的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • SpringBoot項目配置postgresql數(shù)據(jù)庫完整步驟(配置多數(shù)據(jù)源)

    SpringBoot項目配置postgresql數(shù)據(jù)庫完整步驟(配置多數(shù)據(jù)源)

    PostgreSQL是一種特性非常齊全的自由軟件的對象-關系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS),下面這篇文章主要給大家介紹了關于SpringBoot項目配置postgresql數(shù)據(jù)庫(配置多數(shù)據(jù)源)的相關資料,需要的朋友可以參考下
    2023-05-05
  • Mybatis-Plus將字段設置為null解決方法

    Mybatis-Plus將字段設置為null解決方法

    MyBatis-Plus是一個MyBatis的增強工具,在MyBatis的基礎上只做增 強不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關于Mybatis-Plus將字段設置為null的解決方法的相關資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot中如何啟動Tomcat流程

    SpringBoot中如何啟動Tomcat流程

    這篇文章主要介紹了SpringBoot中如何啟動Tomcat流程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Arthas在線java進程診斷工具在線調(diào)試神器詳解

    Arthas在線java進程診斷工具在線調(diào)試神器詳解

    Arthas是 Alibaba 開源的Java診斷工具,深受開發(fā)者喜愛。這篇文章主要介紹了Arthas在線java進程診斷工具 在線調(diào)試神器,需要的朋友可以參考下
    2021-11-11
  • JAVA驗證碼工具實例代碼

    JAVA驗證碼工具實例代碼

    這篇文章主要介紹了JAVA驗證碼工具實例代碼,需要的朋友可以參考下
    2018-03-03
  • Spring MVC--攔截器實現(xiàn)和用戶登陸例子

    Spring MVC--攔截器實現(xiàn)和用戶登陸例子

    本文主要介紹了Spring MVC--攔截器實現(xiàn)和用戶登陸例子,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • Mybatis中的Criteria條件查詢方式

    Mybatis中的Criteria條件查詢方式

    這篇文章主要介紹了Mybatis中的Criteria條件查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring中的EurekaServer啟動詳解

    Spring中的EurekaServer啟動詳解

    這篇文章主要介紹了Spring中的EurekaServer啟動詳解,初始化eureka,包含eureka集群的同步和發(fā)布注冊,這個方法時重寫ServletContextListener#contextInitialized,是eureka啟動的入口了,需要的朋友可以參考下
    2023-11-11
  • Spring Boot文件上傳簡單實例代碼

    Spring Boot文件上傳簡單實例代碼

    在本篇文章里小編給大家分享的是關于Spring Boot 文件上傳簡易教程以及相關知識點,需要的朋友們參考下。
    2019-08-08

最新評論

松滋市| 河南省| 工布江达县| 安塞县| 牡丹江市| 翁牛特旗| 景东| 三穗县| 田林县| 延寿县| 子长县| 湖南省| 永春县| 高台县| 博白县| 焦作市| 陈巴尔虎旗| 墨江| 横峰县| 宁陕县| 新闻| 绥中县| 商南县| 客服| 辽阳市| 延长县| 锡林郭勒盟| 罗源县| 延津县| 同仁县| 灵武市| 卓尼县| 大姚县| 册亨县| 深圳市| 巴东县| 连城县| 凤城市| 鲜城| 湄潭县| 新郑市|