在IBatis中使用RowHandler接口来解决大型数据集的问题:
RowHandler接口定义非常简单:
public interface RowHandler(){
void handlerow(Object valueObject) ;
}
其中每一条记录与对应的pojo类的xml文件中的查询语句的resultClass相对应:Xxx.xml--><select ···resultClass>,使用的时候强转一下valueobject的类型即可。
例:
配置文件中:Employee.queryOneEmployee
<select id="queryOneEmployee" resultClass="employee"> <![CDATA[ select empNo,ename,job,mgr,hireDate,sal,comm,deptNo from emp ]]> </select>
定义一个类继承RowHeadler接口
public class EmpRowHandler implements RowHandler{ private List<Employee> empList=new ArrayList<Employee>(); public List<Employee> getEmpList() { return empList; } public void handleRow(Object valueObject) { Employee employee=(Employee)valueObject; employee.setSal(500.0);//修改查询结果的属性 empList.add(employee); }
测试代码片段:
sqlmap.startTransaction(); EmpRowHandler handler=new EmpRowHandler(); sqlmap.queryWithRowHandler("Employee.queryOneEmployee", handler);
List<Employee> list=handler.getEmpList(); for(Employee emp:list) { System.out.println(emp.getSal()); } sqlmap.commitTransaction();
在测试片段中,将查询结果放到对象handler 中,通过对valueObject 的操作获取查询的结果的每一行,通过重写handleRow()方法,实现对查询结果的过滤(可以进行你想要的任何操作)。