在做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)來 獲取值