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

ibatis支持批量处理的rowhandler

程序员文章站 2022-03-13 09:18:30
...
项目中因为查询返回的数据量太大,用的是ibatis,所以选择用rowhandler,默认情况下rowhandler一次处理一条数据,有时候性能需要一次性处理一批数据,故写一下简单代码

接口
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();