mybatis之foreach用法


在做mybatis的mapper.xml文件的時候,我們時常用到這樣的情況:動態生成sql語句的查詢條件,這個時候我們就可以用mybatis的foreach了

foreach元素的屬性主要有item,index,collection,open,separator,close。

  • item:集合中元素迭代時的別名,
  • index:集合中元素迭代時的索引
  • open:常用語where語句中,表示以什么開始,比如以'('開始
  • separator:表示在每次進行迭代時的分隔符,
  • close 常用語where語句中,表示以什么結束,

在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況: 

  • 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list .
  • 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array .
  • 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,實際上如果你在傳入參數的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key.

針對最后一條,我們來看一下官方說法:

注意 你可以將一個 List 實例或者數組作為參數對象傳給 MyBatis,當你這么做的時候,MyBatis 會自動將它包裝在一個 Map 中並以名稱為鍵。List 實例將會以“list”作為鍵,而數組實例的鍵將是“array”。

所以,不管是多參數還是單參數的list,array類型,都可以封裝為map進行傳遞。如果傳遞的是一個List,則mybatis會封裝為一個list為key,list值為object的map,如果是array,則封裝成一個array為key,array的值為object的map,如果自己封裝呢,則colloection里放的是自己封裝的map里的key值,如下所示:

    <insert id="insertRole">
        BEGIN
        INSERT INTO [sys_role]([role_name],[available]) VALUES(#{role.roleName},1);
        <selectKey resultType="int" keyProperty="role_id" order="BEFORE">
            -- SELECT MAX(role_id) as id FROM [sys_role];
            SELECT IDENT_CURRENT('sys_role')+1
        </selectKey>
        <foreach item="item"  collection="perlist">
            insert into sys_role_permission(role_id,permission_id) VALUES (#{role_id}, #{item});
        </foreach>
        END
    </insert>

注意collection中的名稱。

雙層foreach用法

 <selectKey resultType="int" keyProperty="release_id" order="BEFORE">
            SELECT IDENT_CURRENT('cms_release')+1;
        </selectKey>
        <foreach collection="sendcsmlist" item="sendcms" index="index">
        INSERT INTO [cms_release]
        ([release_type],[unit_id],[device_id],[device_type],[pixel_x],[pixel_y],[max_picture_size],[style],
        [dwell_time],[alignment],[operator_id],[release_time],[common_type])
        values(#{sendcms.releaseType},#{sendcms.unitId},#{sendcms.deviceId},#{sendcms.deviceType},#{sendcms.pixelX},#{sendcms.pixelY},
        #{sendcms.maxPictureSize},#{sendcms.style},#{sendcms.dwellTime},#{sendcms.alignment},#{sendcms.operatorId},GETDATE(), #{sendcms.commonType});
        <foreach item="itemcontent" collection= "sendcms.displayContentList" >
            INSERT INTO [cms_release_content]
            ([release_id],[step_no],[linetype],[position_x],[position_y],[cms_content],[color]
            ,[font_family],[font_size],[letter_spacing],[picture_name])
            values (#{release_id}+${index},#{itemcontent.stepNo},#{itemcontent.linetype},#{itemcontent.positionX},#{itemcontent.positionY}, #{itemcontent.cmsContent},#{itemcontent.color}
            ,#{itemcontent.fontFamily}, #{itemcontent.fontSize},#{itemcontent.letterSpacing}, #{itemcontent.pictureName});
        </foreach>
        </foreach>

注意下划線的部分,還有${index}是對index的引用,如果傳入的是map類型,可以采用$(key)來 獲取值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM