项目中因为查询返回的数据量太大,用的是ibatis,所以选择用rowhandler,默认情况下rowhandler一次处理一条数据,有时候性能需要一次性处理一批数据,故写一下简单代码
接口
class="java" name="code">import com.ibatis.sqlmap.client.event.RowHandler;
public interface BatchRowHandler<T> extends RowHandler {
/**
* 满足一定数量的对象后,执行一次批量数据操作
* @param list
*/
void handBatch();
/**
* 执行最后一批数据的操作,DAO调用RowHandler之后再执行才方法
*/
void handLast();
}
抽象类
import java.util.ArrayList;
import java.util.List;
/**批次hander处理,抽象类
* 注意此类为线程非安全
*
* @author tangwei001
*
* @param <T>
*/
public abstract class AbstractBatchRowHandler<T> implements BatchRowHandler<T> {
private List<T> list;
/**
* 批次大小设置,默认是20
*/
private int size=20;
/**
*
* @param size 设置批次处理大大小,当达到该大小时,触发批处理
*/
public AbstractBatchRowHandler(int size) {
if(size>0){
this.size=size;
list=new ArrayList<T>(size);
}else{
list=new ArrayList<T>(size);
}
}
@Override
public void handleRow(Object obj) {
list.add((T)obj);
if(list.size()>=size){
handBatch();
list=new ArrayList<T>(size);
}
}
@Override
public void handLast() {
handBatch();
}
/**
* 获取批次数据
* @return
*/
protected List<T> getBatchDate(){
return list;
}
使用 实现handBatch()方法即可
class ProGetBatchRowHander extends AbstractBatchRowHandler<Proget> {
public ProGetBatchRowHander(int size) {
super(size);
}
@Override
public void handBatch() {
List<Proget> list=getBatchDate();
//业务实现
}
}
调用
ProGetBatchRowHander hander=new ProGetBatchRowHander(1000);
最后要记得调用hander.handLast();