java使用jdbc将数据库数据导出到csv文件

       //获取连接,自行替换为自己的
       Connection conn =  reqBean.getDataSyncExecInfo().getConn();
       //sql 改为自己的
        String sql = reqBean.getDataSyncExecInfo().getSql();
        if ( null == conn|| null == sql){
            throw  new Exception("连接和sql不能为空");
        }
       ResultSet rs = null;
       String file_name = UUID.randomUUID().toString() + ".csv";
        BufferedWriter csvFileOutputStream = null;
        File csvFile = null;
        try {
            //生成文件
            csvFile = new File(file_name);
            try {
                csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "utf-8"), 1024);;
            } catch (Exception e) {
                log.error("生成cvs文件异常", e);
                throw new Exception("生成cvs文件异常");
            }
            log.info("文件路径:"+csvFile.getAbsolutePath());
            StringBuilder sb = new StringBuilder();

            Statement st = conn.createStatement();

            rs = st.executeQuery(sql);

			//获取元数据信息
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            Map<String,Object> row = null;
            String columnName=null;
            Object  value=null;
            List<String> valueList = new ArrayList<>();

            while (rs.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    columnName =metaData.getColumnLabel(i);
                    value = rs.getObject(columnName);

                    if(null != value) {
                        /**
                         * 目前使用object, TIMESTAMP 会丢失时分秒的精度
                         */
                        if ("TIMESTAMP".equalsIgnoreCase(metaData.getColumnTypeName(i))   ){
                            value = rs .getTimestamp(columnName);
                            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                            value = format.format(value);
                        }
                        if ("DATE".equalsIgnoreCase(metaData.getColumnTypeName(i))) {
                            value = rs .getDate(columnName);
                            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                            value = format.format(value);
                        }
                        if ("DATETIME".equalsIgnoreCase(metaData.getColumnTypeName(i))) {
                            value = rs .getDate(columnName);
                            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                            value = format.format(value);
                        }
                        if ("null".equals(value)) {
                            value = "" ;
                        }
                    } else {
                        value = "" ;
                    }
                    valueList.add(String.valueOf(value));
                }
                sb.append(StringUtils.join(valueList,","));
                log.info("row:"+sb.toString());
                //将数据写入到 sb中, 逗号分隔
                csvFileOutputStream.write(sb.toString());
                csvFileOutputStream.newLine();
                sb.delete(0,sb.length());
                valueList.clear();
            }


        } catch (SQLException e) {
           if(csvFile != null) {
                csvFile.delete();
            }
            log.error("数据导出到文件异常,已删除该文件:"+csvFile.getAbsolutePath(),e);
            throw e;

        } finally {

            if (rs != null) {
                rs.close();
            }
            if (conn != null) {
                conn.close();
            }
            if(csvFileOutputStream != null) {
                try{
                    csvFileOutputStream.close();
                } catch (IOException e){
                    log.error("同步导出到csv后,关闭流异常:",e);
                }
            }

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值