欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年10月27日 14:31:05   作者:多羅羅~  
這篇文章主要介紹了MyBatis動態(tài)sql查詢及多參數(shù)查詢方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

最新評論