欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ibatis之iterator研究

程序员文章站 2024-02-20 20:20:11
...

     iBtatis的动态特性在很多时候能帮助大家做很多事情.Iterator就是用一个列表动态的生成sql的一部分的动态特性.网上这方资料有很多,个人觉得不是很全.在这里抛砖引玉,望高手多多指教.

    iterator的语法相对比较简单.下面摘抄语法于下.(引用于http://blog.csdn.net/dinglinhu/archive/2008/05/27/2487647.aspx )

Iterate:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。
Iterate的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)

 

 

在比较多的网站上就property 很多不同的说法.下面我们通过实例觉得我们的结论:

eg1.传入的参数是一个list类型.此时property不需要.

<delete id="Employee.delete" parameterClass="list">
        DELETE FROM Employee      WHERE 1=1
            <iterate prepend=" AND id in " open="(" close=")" conjunction=",">
                #[]#
            </iterate>   
    </delete>
 

 

调用形式:

                List<Integer> ids=new ArrayList<Integer>();


		for (int i = 1; i < 10; i++) {
			ids.add(i);
		}
		sqlMapClient.delete("Employee.delete",ids);

    eg2.传入的参数不是list类型,是一个简单的Pojo,但是该pojo有个list类型的属性

<delete id="Employee.delete2"  parameterClass="org.jenfer.entity.Dept">
		DELETE FROM employee 	WHERE 1=1
			<iterate property="empIds" prepend=" AND id in " open="(" close=")" conjunction=",">
				#empIds[]#
			</iterate>	
	</delete>
 

   调用形式:

                Dept dept=new Dept();
		List<Integer> empIds=new ArrayList<Integer>();
		dept.setEmpIds(empIds);


		
		for (int i = 1; i < 10; i++) {
			empIds.add(i);
		}
		
		sqlMapClient.delete("Employee.delete2",dept);

 eg3:传入的参数不是list类型,是一个简单的Pojo,但是该pojo有个list类型的属性,而且list的元素类型是一个Pojo,不是一个基本类型或者包装类.

 

<delete id="Employee.delete1" parameterClass="org.jenfer.entity.Dept">
		DELETE FROM employee 	WHERE 1=1
			<iterate property="employees" 
prepend=" AND username in " open="(" close=")" conjunction=",">
				#employees[].username#
			</iterate>	
	</delete>
 

 调用形式:

		List<Employee> employees=new ArrayList<Employee>();
		Dept dept=new Dept();
		dept.setEmployees(employees);

		
		Employee employee=null;
		for (int i = 1; i < 10; i++) {
			employee=new Employee();
			employee.setUsername("zhangsan"+i);
			employees.add(employee);
		}
		
		sqlMapClient.delete("Employee.delete1",dept);

 

综上所述:在eg1在的情况下property属性不需要.在eg2,3情况下property是需要的.另外注意eg2,eg3的的语法稍有不同.