以前我们数据库中存在大量的数据,我们要查询,怎么办?我们在没有经过设计的时候是这样来处理的,先写一个集合,然后执行jdbc,将返回的结果赋值给list,然后再返回到页面上,但是当数据量大的时候,就会出现数据无法返回,内存溢出的情况,于是我们在有限的时间和空间下,通过分页将数据一页一页的显示出来,这样可以避免了大数据量数据对内存的占用,也提高了用户的体验,在我们要导出的百万数据也是一个道理,内存突发性占用,我们可以限制导出数据所占用的内存,这里我先建立一个list容器,list中开辟10000行的存储空间,每次存储10000行,用完了将内容清空,然后重复利用,这样就可以有效控制内存,所以我们的设计思路就基本形成了,所以分页数据导出共有以下3个步骤:
1、求数据库中待导出数据的行数
2、根据行数求数据提取次数
3、按次数将数据写入文件
注:当数据量超过百万必须拆分到多个工作表,或者多个工作簿中才能实现。因为一个sheet最多行数为1048576。
附上代码(工作中实例)
@RequestMapping("/exportmq")
public String exportmq(HttpServletResponse response, HttpServletRequest req) throws Exception {
long startTime = System.currentTimeMillis();
logger.info("激活码导出开始:" + TimeUtil.getDateToString(new Date(), "yyyy-MM-dd HH:mm:ss"));
setResponseHeader(response, "card.xlsx");
List<Map<String, Object>> list1 = new ArrayList<>();
JdbcTemplate template = JdbcTemplateManager.getTemplate();
String log_id = req.getParameter("log_id");
String card_code = req.getParameter("card_code");
String role_id = req.getParameter("role_id");
String server_id = req.getParameter("server_id");
String user_name = req.getParameter("user