`
sdkd_Tiger
  • 浏览: 26158 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iBatis中RowHandler处理大数据量的导出

    博客分类:
  • Web
阅读更多

背景:一次性导出几十万条数据到excel,此时的导出效率会严重损失。

解决方法: 用ibatis中的RowHandler,一次只处理一条数据,内存中只保持一条数据,导出时每5万条创建一个sheet

具体实现方法:

MyRowHandler处理类:

import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.ibatis.sqlmap.client.event.RowHandler;

public class MyRowHandler implements RowHandler {
	HSSFWorkbook wb;
	HSSFSheet sheet ; 
	HSSFRow row;
	HSSFCell cell;
	int dataNum=0;
	int rowStart = 1;
	@Override
	public void handleRow(Object arg0){
		dataNum++;
		if(dataNum%50000==0){
			//每5万条记录分页
			setSheet();
		}
		
		Map map = (Map)arg0;
		//在这里处理逻辑,插入数据到excel
		System.out.println(map.get("key"));
		System.out.println(map.get("value"));
		
	}
	public HSSFWorkbook getWb() {
		return wb;
	}
	public void setWb(HSSFWorkbook wb) {
		this.wb = wb;
		setSheet();
	}
	public void setSheet(){
		this.sheet= wb.createSheet();
		rowStart = 1;
		//写表头
		writeHeader();
	}
	public void writeHeader(){
		String[] header = {"ID","类型"};
		row = sheet.createRow(0);
		int n=0;
		for (String  head : header) {
			cell = row.createCell((short) n);
			HSSFRichTextString str = new HSSFRichTextString(head);
			cell.setCellValue(str);
			n++; 
		}
	}
	
}



 action中执行:

public String execute(){
		
		String fileName="F:\\05-JAVA\\测试.xls";
		HSSFWorkbook wb = new HSSFWorkbook();
		MyRowHandler handler = new MyRowHandler();
		handler.setWb(wb);
		DaoFactory.getIbatisDao().getSqlMapClientTemplate().queryWithRowHandler("term.base", handler);
		wb = handler.getWb();
		
		OutputStream os = null;
		try {
			os = new FileOutputStream(fileName);
			wb.write(os);
		}catch(Exception e){
			
		}finally{
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			} 
		}
             return "success";
	}
分享到:
评论

相关推荐

    ibatis sql语句对条件中特殊字符% # 处理

    ### ibatis SQL语句对条件中特殊字符% # 处理 在开发过程中,经常会遇到SQL查询时需要处理字符串中的特殊字符的情况。特别是在使用类似`LIKE`这样的操作符时,如果用户输入的数据中含有`%`、`_`或`#`等特殊字符,...

    ibatis应对批量update

    通过上述步骤,我们可以在ibatis中实现高效的批量更新操作,极大地提升系统处理大规模数据的能力。这种方法不仅适用于Java环境下的开发,也适用于其他支持ibatis的编程语言。总之,ibatis提供的批量更新功能是处理...

    struts2_spring_ibatis根据模板文件导出Excel

    Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的Action层、业务逻辑层和数据访问层。在这个项目中,“struts2_spring_ibatis根据模板文件导出Excel”是利用这三大框架实现了一个...

    ibatis中iterate的例子

    总结来说,`<iterate>`标签是iBatis中处理集合数据的重要工具,它简化了SQL语句的构建,提高了代码的可读性和可维护性。在实际开发中,合理利用`<iterate>`可以极大地提高工作效率,并降低出错概率。

    ibatis官方中文文档

    教程中还会详细讲解如何在iBATIS中定义和执行存储过程,包括输入参数、输出参数和结果集的处理。同时,这份教程可能还涵盖了异常处理、事务管理以及性能优化等相关内容。 **iBATIS存储过程调用** 在iBATIS中调用...

    jxl结合IBATIS导出EXCEL

    jxl结合IBATIS,导出EXCEL。读取EXCEL模板,把数据写到新的EXCEL中。sql语句中要起别名,别名第一位为字母,第二位包括第二位要是整数数字,这个数字决定插入到excel表格中的位置,决定插入的是那一列。EXCEL模板中...

    ibatis实现数据的操作

    在这个过程中,Ibatis会自动处理参数绑定、结果集映射等细节,极大地提高了开发效率。同时,由于SQL语句与Java代码的分离,使得SQL的优化和维护变得更加容易。 对于MySQL数据库,Ibatis提供了很好的支持,包括对...

    iBATIS操作Oracle CLOB数据

    7. **事务管理**:由于CLOB操作可能会涉及到较大的数据量,确保正确设置事务的隔离级别和回滚规则,以防止数据不一致。 综上所述,通过iBATIS操作Oracle的CLOB数据,需要对iBATIS的映射文件、类型处理器以及Oracle...

    ibatis总结 ibatis ibatis ibatis ibatis

    - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大的情况下。 - 避免在`WHERE`子句中使用多个条件或`OR`操作符,而是应该使用`IN`操作符或者`UNION ALL`合并多个查询。 3. Struts、Spring与Ibatis...

    ibatis乱码解决方法(ibatis独立)

    通过以上步骤,我们可以有效地处理Ibatis中的乱码问题。在实际开发中,一定要注意数据编码的一致性,从数据库到应用程序,再到用户界面,每个环节都要做好编码的匹配和转换工作。对于`ibatisdemo`这个项目,你可以...

    Ibatis 事务处理

    Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者Java注解中,从而提供了灵活的数据访问方式。在Ibatis中,事务管理是至关重要的,因为它确保了数据库操作的一致性和可靠性。 事务...

    iBatis net版中文 1.6的

    -事务管理:讨论如何在iBatis .NET中处理事务,包括手动和自动事务控制。 - 故障排查:提供常见问题的解决方案和最佳实践。 通过阅读这份文档,开发者可以了解到iBatis .NET的完整功能,学会如何在.NET项目中有效...

    ibatis_with_memcached

    总的来说,"ibatis_with_memcached"项目提供了一个实用的参考,展示了如何在实际开发中利用Ibatis与Memcached集成来优化数据访问,对于提升Java Web应用的性能具有很大的指导价值。开发者可以通过该项目学习到缓存...

    ibatis-api中文(真的中文)

    在iBATIS中,DAO层可以帮助你创建可重用的对象,这些对象可以直接执行SQL查询并处理结果。这个文档会详细介绍如何创建和使用DAO类,以及如何将它们集成到你的项目中,以实现高效且灵活的数据访问。 最后,`iBATIS-...

    iBatis开发指南和一个iBatis实例

    在学习这部分时,你会了解如何在SQL中添加分页条件,以及如何在Java代码中处理分页结果。 "spring+iBatis处理1对多数据表实例"展示了如何将iBatis与Spring框架集成,实现更高级的数据操作。Spring的依赖注入可以...

    ibatis批量处理

    iBatis提供了批处理功能,可以在一次数据库连接中执行多个SQL语句,这极大地提高了处理大量数据时的性能。iBatis通过`SqlMapClient`接口提供了几个关键方法来实现批处理: 1. **`startBatch()`**:开始批处理。 2. ...

    Ibatis多表查询

    在多表查询中,Ibatis 提供了多种方式来处理复杂的关联查询,包括一对一、一对多、多对一和多对多等关系。在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `...

    ibatis2.0中文API

    iBATIS提供了集合映射和关联映射的方式来处理这些关系,使我们能够在Java对象中方便地操作这些复杂的数据结构。 其次,属性设置详解涉及到的是如何在iBATIS中设置和获取Java对象的属性,以及如何将这些属性与数据库...

Global site tag (gtag.js) - Google Analytics