亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2347 | 回復(fù): 0
打印 上一主題 下一主題

mybatis中 sql 通過 in 查詢 [復(fù)制鏈接]

論壇徽章:
43
15-16賽季CBA聯(lián)賽之上海
日期:2020-11-04 09:36:5515-16賽季CBA聯(lián)賽之北控
日期:2018-10-29 18:20:3415-16賽季CBA聯(lián)賽之北京
日期:2018-10-06 21:39:5715-16賽季CBA聯(lián)賽之天津
日期:2018-08-09 10:30:41ChinaUnix元老
日期:2018-08-03 17:26:00黑曼巴
日期:2018-07-13 09:53:5415-16賽季CBA聯(lián)賽之吉林
日期:2018-03-30 12:58:4315-16賽季CBA聯(lián)賽之佛山
日期:2017-12-01 10:26:3815-16賽季CBA聯(lián)賽之上海
日期:2017-11-14 09:20:5015-16賽季CBA聯(lián)賽之江蘇
日期:2019-02-20 09:53:3319周年集字徽章-慶
日期:2019-08-27 13:23:2515-16賽季CBA聯(lián)賽之廣夏
日期:2019-09-03 18:29:06
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-08-02 18:18 |只看該作者 |倒序瀏覽
在SQL開發(fā)過程中,動態(tài)構(gòu)建In集合條件查詢是比較常見的用法,在Mybatis中提供了foreach功能,該功能比較強大,它允許你指定一個集合,聲明集合項和索引變量,它們可以用在元素體內(nèi)。它也允許你指定開放和關(guān)閉的字符串,在迭代之間放置分隔符。這個元素是很智能的,它不會偶然地附加多余的分隔符。下面是一個演示示例:
  <select id="findByIdsMap" resultMap="BaseResultMap">
    Select
    <include refid="Base_Column_List" />
     from jria where ID in
     <foreach item="item" index="index" collection="list"
                    open="(" separator="," close=")">
                   #{item}
            </foreach>
</select>
但由于官方文檔對這塊的使用,描述的比較簡短,細(xì)節(jié)上也被忽略掉了(可能是開源項目文檔一貫的問題吧),也使用不少同學(xué)在使用中遇到了問題。特別是foreach這個函數(shù)中,collection屬性做什么用,有什么注意事項。由于文檔不全,這塊只能通過源代碼剖析的方式來分析一下各個屬性的相關(guān)要求。
collection屬性的用途是接收輸入的數(shù)組或是List接口實現(xiàn)。但對于其名稱的要求,Mybatis在實現(xiàn)中還是有點不好理解的,所以需要特別注意這一點。
下面開始分析源代碼(筆記使用的是Mybatis 3.0.5版本)
先找到Mybatis執(zhí)行SQL配置解析的入口
MapperMethod.java類中 public Object execute(Object[] args)該方法是執(zhí)行的入口.
針對in集合查詢,對應(yīng)用就是 selectForList或SelctForMap方法。


但不管調(diào)用哪個方法,都會對原來JDK傳入的參數(shù) Object[]類型,通過 getParam方法轉(zhuǎn)換成一個Object,那這個方法是做什么的呢?分析源碼如下:


上 圖中標(biāo)紅的兩處,很驚訝的發(fā)現(xiàn),一個參數(shù)與多個參數(shù)的處理方式是不同的(后續(xù)很多同學(xué)遇到的問題,就有一大部分出自這個地方)。如果參數(shù)個數(shù)大于一個,則 會被封裝成Map, key值如果使用了Mybatis的 Param注解,則會使用該key值,否則默認(rèn)統(tǒng)一使用數(shù)據(jù)序號,從1開始。這個問題先記下,繼續(xù)分析代碼,接下來如果是selectForList操作 (其它操作就對應(yīng)用相應(yīng)方法),會調(diào)用DefaultSqlSession的publicList selectList(String statement, Object parameter, RowBounds rowBounds)方法
又一個發(fā)現(xiàn),見源代碼如下:


上圖標(biāo)紅部分,對參數(shù)又做了一次封裝,我們看一下代碼



現(xiàn)在有點清楚了,如果參數(shù)類型是List,則必須在collecion中指定為list, 如果是數(shù)據(jù)組,則必須在collection屬性中指定為 array.
現(xiàn)在就問題就比較清楚了,如果是一個參數(shù)的話,collection的值取決于你的參數(shù)類型。
如果是多個值的話,除非使用注解Param指定,否則都是數(shù)字開頭,所以在collection中指定什么值都是無用的。下圖是debug顯示結(jié)果。


針對上面分析的結(jié)果,下面給出了一個使用的解決方案,希望對大家對幫助。
在使用這個功能是需要特別注意以下規(guī)則:
1. 當(dāng)查詢的參數(shù)只有一個時
  findByIds(List<Long> ids)
1.a 如果參數(shù)的類型是List, 則在使用時,collection屬性要必須指定為 list
<select id="findByIdsMap" resultMap="BaseResultMap">
         Select
         <include refid="Base_Column_List" />
         from jria where ID in
                  <foreach item="item" index="index" collection="list"
                        open="(" separator="," close=")">
                       #{item}
               </foreach>
  </select>

findByIds(Long[] ids)
1.b 如果參數(shù)的類型是Array,則在使用時,collection屬性要必須指定為 array
  <select id="findByIdsMap" resultMap="BaseResultMap">
                 select
                 <include refid="Base_Column_List" />
          from jria where ID in
                  <foreach item="item" index="index" collection="array"
                        open="(" separator="," close=")">
                       #{item}
               </foreach>
  </select>

2. 當(dāng)查詢的參數(shù)有多個時,例如 findByIds(String name, Long[] ids)
這種情況需要特別注意,在傳參數(shù)時,一定要改用Map方式, 這樣在collection屬性可以指定名稱
         下面是一個示例
         Map<String, Object> params = new HashMap<String, Object>(2);
        params.put("name", name);
         params.put("ids", ids);
        mapper.findByIdsMap(params);

<select id="findByIdsMap" resultMap="BaseResultMap">
                 select
                 <include refid="Base_Column_List" />
          from jria where ID in
                  <foreach item="item" index="index" collection="ids"
                        open="(" separator="," close=")">
                       #{item}
               </foreach>
   </select>


完整的示例如下:
例如有一個查詢功能,Mapper接口文件定義如下方法:
List<Jria> findByIds(Long... ids);
使用 in 查詢的sql拼裝方法如下:
<select id="findbyIds" resultMap="BaseResultMap">
                 select
                 <include refid="Base_Column_List" />
          from jria where ID in
                  <foreach item="item" index="index" collection="array"
                        open="(" separator="," close=")">
                       #{item}
               </foreach>
  </select>
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP