iBatisNet 中 iterate標籤的使用

<iterate>標籤,顧名思義是用來遍歷標籤用的。sql

支持的屬性以下:app

屬性 說明 是否必選
open 遍歷後生成的這些sql,開始的第一個符號 可選
close 遍歷後生成的這些sql,最後一個符號 可選
prepend 添加在open指定的符號前面 可選
property 被遍歷的屬性(每每是一個集合) 可選
conjunction 遍歷後每一條sql之間的間隔 可選

各個擊破,沒有什麼比例子最直接的了。spa

1. open 和closecode

insert into table (id,name) values
<iterate open="(" close=")">
#ID#,#Name#
</iterate>

不用考慮該語句的合理性,只是爲了解釋這兩個屬性隨便寫的,最終生成的SQL以下:blog

insert into table (id,name) values ('123','wh');get

其中紅色的兩個括號,就是經過open 和close指定的。string

 

2.conjunction-用於分割各個語句it

select * from user where id in (
<iterate conjunction=",">
    #id#
</iterate>
)

生成的SQL以下:io

select * from user where id in (1,2,3,4,5);table

其中紅色的逗號  ,  就是經過conjunction指定的。

 

3. prepend-追加到最前面的內容

sele ct * from user
<iterate prepend="WHERE" conjunction="AND">
  id=#id#
</iterate>

該語句更沒啥價值,只爲了說明該屬性,生成SQL以下:

select * from user where id='1' and id='2' and id='3'

其中prepend指定的where會被添加在<iterate>標籤的最前面,conjunction做爲間隔符被添加在每一條語句中間。

 

4.property-官教說該變量是必須的,其實並非必須的

若是有這麼一個類定義:
public class Dept{ public string ID{get;set;} public List<User> Users{get;set;} }

public class User{
public string ID{get;set;}
punlic string Name{get;set;}
}
對應的sqlmp以下(property必須的狀況):
<insert id="insert_u" parameterClass="Dept"> //指定parameterClass是Dept
  insert into user (id,name) values
    <iterate property="Users" conjunction=","> //設置property=Users,意思是要遍歷的是Dept.Users屬性
        (#Users[].ID#,#Users[].Name#) //由於Users是一個集合,因此寫法要求Users[]的方式訪問
    </iterate>
</insert>

//調用
mapper.insert("isert_u",dept)

輸出的SQL以下:

insert into user (id,name) values

('1','name1'),

('2','name2')

對應的sqlmp以下(property非必須的狀況):
<insert id="insert_u" parameterClass="list"> //指定parameterClass是list,是一個集合
  insert into user (id,name) values
    <iterate conjunction=","> //不須要設置property,由於咱們直接訪問整個集合,而不是集合的某個屬性
        (#[].ID#,#[].Name#) //由於自己是一個集合,因此寫法要求[]的方式訪問便可
    </iterate>
</insert>

//調用mapper.insert("isert_u",userList);
相關文章
相關標籤/搜索