iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Java导出大批量数据(分批查询导出篇)
  • 558
分享到

Java导出大批量数据(分批查询导出篇)

java开发语言sqlmysql 2023-09-10 08:09:19 558人浏览 独家记忆
摘要

上篇文章介绍了java导出文件格式篇xls,xlsx,csvhttps://blog.csdn.net/weixin_56567361/article/details/126640185 本篇介绍下 大批量数据的导出思路和方法 导出数据慢的

上篇文章介绍了java导出文件格式篇xls,xlsx,csvhttps://blog.csdn.net/weixin_56567361/article/details/126640185

本篇介绍下 大批量数据的导出思路和方法

导出数据慢的原因:

一次性查询太多数据 sql会很慢 太多数据导出处理很慢

这里我讲解下分批查询和分批导出

目录

分批查询方法

一: 根据数据量 分割每一部分数据

二: 根据查询时间间隔 分割为每一天一个时间段

分批查询+分批导出实例


分批查询方法

一: 根据数据量 分割每一部分数据

//查询总条数int count = testService.selectSize(test);//数据量分割值10万int num = 100000;//循环次数/分割次数int cycles = count / num;//余数int remainder = count % num;String sql = "";List> getDownloadList = new ArrayList<>();//分批查询次数for (int i = 0; i < cycles; i++) {//sql=select .... from test where .... order by create_time " + " limit " + (i * num) + "," + num;//limit前参数test.setFront(i * num);//limit后参数test.setAfter(num);ListtestList = testService.selectAll(test);getDownloadList.addAll(testList);}if (remainder > 0) {test.setFront(num * cycles);test.setAfter((num * cycles) + remainder);//sql=select .... from test where .... order by create_time " + " limit " + (num * cycles) + "," + ((num * cycles) + remainder);ListtestList = testService.selectAll(test);getDownloadList.addAll(testList);}//导出操作.....

二: 根据查询时间间隔 分割为每一天一个时间段

Long beginTime = ...;(毫米级)Long endTime = ...;List> getDownloadList = new ArrayList<>();//对查询时间进行分割 每天查一次 map中时间顺序 从小到大Map timeMap = new LinkedHashMap<>();if (endTime - beginTime > 86400) {    //要查询分割的次数    int l = (int) ((endTime - beginTime) / 86400);    for (int i = 1; i <= l; i++) {        timeMap.put(DateUtils.longToString(beginTime + (i - 1) * 86400), DateUtils.longToString(beginTime + (i * 86400)));    }    //查询间隔不是整天数时 则补余下时间    if (beginTime + l * 86400 != endTime) {        timeMap.put(DateUtils.longToString(beginTime + (l * 86400)), DateUtils.longToString(endTime));    }} else {    //小于一天时处理    timeMap.put(DateUtils.longToString(beginTime), DateUtils.longToString(endTime));}//如果数据展示要倒序 需要将map中时间翻过来List times = new ArrayList<>(timeMap.keySet());Collections.reverse(times);for (String beginTimeStr : times) {String endTimeStr = timeMap.get(beginTimeStr);sql:.....ListtestList=......;getDownloadList.addAll(testList);}//导出操作.....public static String longToString(long value) {if (String.valueOf(value).length() == 10) {    value = value * 1000;}    Date time = new Date(value);    return fORMatYMDHMS.format(time);}

分批查询+分批导出实例

controller层

            if ((endTime - beginTime) / (3600 * 24) > 31) {                throw new CustomException("一次最多请求31天数据,请分批导出");            }            String sql = "select count(1) as count" + " from test where create_time between " + beginTime + " and " + endTime";            List> mapList = ClickHouseUtils.execSQL(sql);            //根据数据量分割上传 也可根据时间            int count = Integer.parseInt(mapList.get(0).get("count").toString());            //数据量分割值20万            int num = 200000;            //循环次数/分割次数            int cycles = count / num;            //余数            int remainder = count % num;            String path = getDefaultBaseDir();            String csvFile = "临时历史数据.csv";            String absolutePath = path + "/" + csvFile;            //获取表头            String[] exportDataTitle = dataService.exportDataTitle(fields);            File file = new File(path);            //检查是否存在此文件夹 如没有则创建            if (!file.exists()) {                if (file.mkdirs()) {                    logger.info("历史查询目录创建成功");                } else {                    logger.error("历史查询目录创建失败");                }            }            for (int i = 0; i < cycles; i++) {                sql = "select .. from test where create_time between " + beginTime + " and " + endTime + " order by create_time limit " + (i * num) + "," + num;                FileVO fileVO = dataService.fileVO(sql, ids, fields);                PoiUtils.exportCSVFile(exportDataTitle, fileVO.getDownloadList(), i, absolutePath);            }            if (remainder > 0) {                sql = "select .. from test where create_time between " + beginTime + " and " + endTime + " order by create_time limit " + (num * cycles) + "," + ((num * cycles) + remainder);                FileVO fileVO = dataService.fileVO(sql, ids, fields);                PoiUtils.exportCSVFile(exportDataTitle, fileVO.getDownloadList(), cycles, absolutePath);            }            //输出csv流文件,提供给浏览器下载            PoiUtils.outCsvStreamCSV(response, absolutePath);            logger.info("历史查询下载目录: " + absolutePath);            //删除临时文件            PoiUtils.deleteFile(new File(absolutePath));            logger.info("历史查询删除目录: " + absolutePath);
PoiUtils层
        public static void exportCSVFile(String[] title, List> downloadList, int i, String absolutePath) throws IOException {        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(absolutePath, true));        logger.info("创建文件地址: " + absolutePath);        //如果是第一次循环 添加表头        if (i == 0) {            PoiUtils.writeHead(title, bufferedWriter);            //另起一行            bufferedWriter.newLine();        }        //循环list中数据 逐个添加        for (List list : downloadList) {            CSVFileUtil.writeRow(list, bufferedWriter);            bufferedWriter.newLine();        }        bufferedWriter.close();    }        public static void writeHead(String[] title, BufferedWriter bufferedWriter) throws IOException {        // 写表头        int i = 0;        for (String data : title) {            bufferedWriter.write(data);            if (i != title.length - 1) {                bufferedWriter.write(",");            }            i++;        }    }    public static void outCsvStreamCSV(HttpServletResponse response, String absolutePath) throws IOException {        java.io.OutputStream out = response.getOutputStream();        byte[] b = new byte[10240];        java.io.File fileLoad = new java.io.File(absolutePath);        response.reset();        response.setContentType("application/csv");        response.setHeader("content-disposition", "attachment; filename=" + URLEncoder.encode("export.csv", "UTF-8"));        java.io.FileInputStream in = new java.io.FileInputStream(fileLoad);        int n;        //为了保证excel打开csv不出现中文乱码        out.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});        while ((n = in.read(b)) != -1) {            //每次写入out1024字节            out.write(b, 0, n);        }        in.close();        out.close();    }

CSVFileUtils

@Slf4jpublic class CSVFileUtil {        public static List importCsv(File file, String delimiter, String charsetName) {        List dataList = new ArrayList<>();        BufferedReader br = null;        try {            InputStreamReader isr = new InputStreamReader(new FileInputStream(file), charsetName);            br = new BufferedReader(isr);            String line = "";            while ((line = br.readLine()) != null) {                dataList.add(line.split(delimiter));            }        } catch (Exception e) {        } finally {            if (br != null) {                try {                    br.close();                    br = null;                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return dataList;    }        public static File exportCsv(List> exportData, String outPutPath, String fileName) {        File csvFile = null;        BufferedWriter csvFileOutputStream = null;        try {            File file = new File(outPutPath);            if (!file.exists()) {                if (file.mkdirs()) {                    log.info("创建成功");                } else {                    log.error("创建失败");                }            }            //定义文件名格式并创建            csvFile = File.createTempFile(fileName, ".csv", new File(outPutPath));            csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile, true), StandardCharsets.UTF_8), 1024);            for (List exportDatum : exportData) {                writeRow(exportDatum, csvFileOutputStream);                csvFileOutputStream.newLine();            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (csvFileOutputStream != null) {                    csvFileOutputStream.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }        return csvFile;    }        public static void writeRow(List row, BufferedWriter csvWriter) throws IOException {        int i = 0;        for (String data : row) {            csvWriter.write(data);            if (i != row.size() - 1) {                csvWriter.write(",");            }            i++;        }    }        public static String DelQuota(String str) {        String result = str;        String[] strQuota = {"~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "`", ";", "'", ",", ".", "/", ":", "/,", "<", ">", "?"};        for (String s : strQuota) {            if (result.contains(s)) {                result = result.replace(s, "");            }        }        return result;    }        public static void main(String[] args) {        exportCsv();        //importCsv();    }        public static void importCsv() {        List dataList = CSVFileUtil.importCsv(new File("F:/test_two.csv"), ",", "GB2312");        if (!dataList.isEmpty()) {            for (String[] cells : dataList) {                if (cells != null && cells.length > 0) {                    for (String cell : cells) {                        System.out.print(cell + "  ");                    }                    System.out.println();                }            }        }    }        public static void exportCsv() {        List> listList = new ArrayList<>();        List list1 = new ArrayList<>();        List list2 = new ArrayList<>();        List list3 = new ArrayList<>();        list1.add("编号");        list1.add("姓名");        list1.add("身高");        list1.add("电话");        list2.add("1");        list2.add("小明");        list2.add("180cm");        list2.add("1111111");        list3.add("2");        list3.add("小红");        list3.add("176cm");        list3.add("1111111");        listList.add(list1);        listList.add(list2);        listList.add(list3);        CSVFileUtil.exportCsv(listList, "D://", "testFile");    }}

到这里分批查询+分批导出已经介绍完了

大家根据需求调整代码 根据源码测试

最后有遇到什么问题可以留言告诉我哦 欢迎评论区讨论🤪

来源地址:https://blog.csdn.net/weixin_56567361/article/details/126647979

您可能感兴趣的文档:

--结束END--

本文标题: Java导出大批量数据(分批查询导出篇)

本文链接: https://www.lsjlt.com/news/402112.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java导出大批量数据(分批查询导出篇)
    上篇文章介绍了java导出文件格式篇xls,xlsx,csvhttps://blog.csdn.net/weixin_56567361/article/details/126640185 本篇介绍下 大批量数据的导出思路和方法 导出数据慢的...
    99+
    2023-09-10
    java 开发语言 sql mysql
  • php怎么大批量导出excel数据
    本篇内容介绍了“php怎么大批量导出excel数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在平时生活或其他时候,我们可能会需要大批量导...
    99+
    2023-06-20
  • Java大批量导出Excel数据的优化过程
    目录背景问题和解决方案遇到的问题解决步骤整理工具类参考资料背景 团队目前在做一个用户数据看板(下面简称看板),基本覆盖用户的所有行为数据,并生成分析报表,用户行为由多个数据来源组成...
    99+
    2024-04-02
  • plsql如何批量导出数据
    在PL/SQL中,可以使用游标和循环语句来批量导出数据。以下是一种可能的方法:1. 创建一个游标,用于查询需要导出的数据。2. 使用...
    99+
    2023-09-08
    plsql
  • Java,excel大量百万数据导出优化措施,SXSSFWorkbook流式、分批次导出示例
    在导出百万级的数据时,如果不采用适当的优化措施,确实可能会造成死机和内存崩溃等问题。 为避免这些问题,可以采用以下优化措施: 分批次读取数据:将需要导出的数据分成多个批次进行读取和写入,每次读取部分数据,写入 Excel 后即时清除内存。这...
    99+
    2023-09-22
    java excel jvm 数据导出 数据库
  • oracle如何批量导出表数据
    Oracle数据库可以使用以下方法批量导出表数据: 使用SQL*Plus工具: 可以使用SQL*Plus工具执行导出命令来批量导...
    99+
    2024-04-09
    oracle
  • SQL Server怎么批量导入和导出数据
    在SQL Server中,可以使用bcp命令行实用程序批量导入和导出数据。以下是一些示例:1. 批量导入数据:使用bcp命令行实用程...
    99+
    2023-10-10
    SQL Server
  • 服务器怎么批量导入与导出数据
    这篇文章主要讲解了“服务器怎么批量导入与导出数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“服务器怎么批量导入与导出数据”吧!在使用IIS7远程桌面时,若有多个服务器需要添加,而逐一进行选...
    99+
    2023-06-05
  • 数据库分批导出为csv文件
    boss需要1500万个手机号码,导出为excel文件由于数量太大,直接存一个文件,打开电脑会直接卡死。需要分为15批,每批100万。可以手工在navicat软件上面运行,根据MySQL分页公式(page-1)*page_size,page...
    99+
    2023-01-30
    数据库 文件 csv
  • Java怎么实现文件批量导入导出
    本篇内容介绍了“Java怎么实现文件批量导入导出”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、介绍java实现文件的导入导出数据库,目前...
    99+
    2023-06-16
  • Java实现批量导出导入数据及附件文件zip包
    目录前言-应用场景一、导出ZIP包1. 列表数据导出到本地excel文件2. 下载附件信息3. 生成压缩文件(浏览器下载)4. 删除临时目录二、导入ZIP包1. 上传zip包,解压到...
    99+
    2024-04-02
  • java批量导入Excel数据
    后台导入代码 import cn.afterturn.easypoi.excel.entity.ImportParams;import cn.afterturn.easypoi.excel.entity.result.ExcelImport...
    99+
    2023-09-01
    java excel vue.js
  • 批量备份还原导入与导出MongoDB数据方式
    前文链接传送门 mongo数据库的安装与配置 Navicat 建立数据库连接 新建数据库 导入JavaScript文件入数据库 mongodb数据备份和还原主要分为二种,一...
    99+
    2024-04-02
  • oracle怎么批量导出表结构和数据
    在Oracle数据库中,可以使用expdp命令来进行表结构和数据的批量导出操作。以下是一个示例: 打开命令行窗口,输入以下命令连接...
    99+
    2024-04-19
    oracle
  • SQLServer数据批量导出的方法是什么
    在SQL Server中,可以使用bcp命令行实用程序来进行数据批量导出。以下是具体的步骤: 打开命令提示符(cmd)窗口。 输入...
    99+
    2024-04-09
    SQLServer
  • mac照片如何批量导出
    要批量导出Mac上的照片,您可以按照以下步骤操作:1. 打开“照片”应用程序。它位于“应用程序”文件夹中,或者您可以使用Spotli...
    99+
    2023-10-09
    mac
  • dbeaver怎么批量导出索引
    在DBeaver中,可以通过以下步骤批量导出索引: 在DBeaver中连接到您的数据库。 在导航器中找到您的数据库,展开并选择要导...
    99+
    2024-03-14
    dbeaver
  • git日志如何批量导出
    在软件开发过程中,版本控制是非常重要的一环。Git是现今最流行的版本控制系统之一,它能够记录开发者在项目中的每一个更改,并就此生成一份日志。在某些情况下,我们可能需要将这些日志导出至文本文件中,以方便进一步处理或查阅。本文将介绍如何使用Gi...
    99+
    2023-10-22
  • SQLSERVER怎么大批量导入数据
    在SQL Server中,可以使用以下方法进行大批量数据导入:1. 使用BULK INSERT语句:BULK INSERT语句允许从...
    99+
    2023-08-18
    SQLSERVER
  • oracle怎么批量导入大量数据
    Oracle数据库可以通过多种方式批量导入大量数据,以下是一些常用的方法: SQLLoader工具:SQLLoader是Orac...
    99+
    2024-04-16
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作