<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 0,comments - 0,trackbacks - 0

    在SQL開發(fā)過程中,動態(tài)構(gòu)建In集合條件查詢是比較常見的用法,在Mybatis中提供了foreach功能,該功能比較強(qiáng)大,它允許你指定一個集合,聲明集合項和索引變量,它們可以用在元素體內(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)中還是有點(diǎn)不好理解的,所以需要特別注意這一點(diǎn)。

    下面開始分析源代碼(筆記使用的是Mybatis 3.0.5版本)

    先找到Mybatis執(zhí)行SQL配置解析的入口

    MapperMethod.java類中 public Object execute(Object[] args) 該方法是執(zhí)行的入口.

    針對in集合查詢,對應(yīng)用就是 selectForListSelctForMap方法。


    但不管調(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的public List selectList(String statement, Object parameter, RowBounds rowBounds) 方法

    又一個發(fā)現(xiàn),見源代碼如下:



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




    現(xiàn)在有點(diǎ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>
     

    Good Luck!
    Yours Matthew!
    posted on 2013-07-10 14:24 章有智 閱讀(103) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲最大的成人网| 黄网址在线永久免费观看| 香蕉视频免费在线| 亚洲一区二区三区高清不卡| 亚洲av永久无码精品秋霞电影影院 | 免费人成再在线观看网站 | 国产h视频在线观看网站免费| 一道本不卡免费视频| 亚洲欧洲无卡二区视頻| 国产综合免费精品久久久| 亚洲国产精品精华液| 国产91在线|亚洲| 亚洲精品中文字幕乱码| 在线视频免费国产成人| 在线观看H网址免费入口| 久久青草精品38国产免费| 亚洲中文无码av永久| 精品国产日韩亚洲一区| 免费一级国产生活片| 国产精品久久免费视频| 青草草在线视频永久免费| 在线免费一区二区| 成人免费无码大片a毛片软件| 日本成年免费网站| 青青草a免费线观a| 91精品免费在线观看| 亚洲免费二区三区| 精品国产福利尤物免费| 一个人看的www免费高清| 一级女性全黄生活片免费看| 日本高清免费中文在线看| 四虎影视久久久免费观看| 免费国产在线精品一区| 日韩少妇内射免费播放| 高h视频在线免费观看| 亚欧乱色国产精品免费视频| 2022免费国产精品福利在线| 中国毛片免费观看| 在线观看特色大片免费网站| 国产激情免费视频在线观看| 95免费观看体验区视频|