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);
相关文章
相关标签/搜索