Java代码导出数据库百万数据生成sql脚本

Java代码查询数据生成update更新sql

一、查询数据库数据

	/**
	* 导入查询数据的接口
	**/
	@Autowired
    private DataMapper dataMapper;
    /**
     * 编写单元测试查询数据库数据
     * @author douglas
     * @date 2022/5/10 18:19
     * @param
     * @return void
     **/
    @Test
    public void exportData(){
        //处理开始时间
        long startTime = System.currentTimeMillis();
        //1.根据条件分页查询mysql符合条件的数据
        //1.1获取查询总数量数量
        //1.2DataQo构建查询数据的入参
        final long count = dataMapper.count(DataQo.builder().status(0).personCoune(0).build());
        //2.1定义每次查询数量
        final int sizePer = 10000;
        //2.2计算需要查询的次数(向上取整,15.3次==16次)
        int totalNumber = (int)Math.ceil(new BigDecimal(count).divide(new BigDecimal(sizePer)).doubleValue());
        //3.循环遍历查询数据
        for (int i = 1; i <= totalNumber; i++) {
        	//3.1计算分页每次开始的条数
        	final Integer offset = sizePer*(i-1);
        	//3.2查询数据库数据
            List<DataPO> dataPOs = dataMapper.listData(DataQo.builder().status(0).personCoune(0).offset(offset).limit(sizePer).build());
            //3.2过滤数据中的code字段值收集为list集合
            List<String> codeList = dataPOs .stream().map(po -> po.getCode()).collect(Collectors.toList());
            //3.3调用生成sql拼接方法
            generateSqlString(i,codeList.parallelStream());
        }
        //处理结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("【输出sql文件总耗时:】"+(endTime - startTime)/1000+"秒");
    }

二、动态拼接sql字符串

/**
     * 拼接sql
     * @author douglas
     * @date 2022/5/11 9:18
     * @param
     * @return void
     **/
        private void generateSqlString(int i, Stream<String> codeStream) {
        //1.定义需要输出的sql
        final String sql = "update 表名 set status = 1 where code in (";
        StringBuffer updateSql = new StringBuffer();
        updateSql.append(sql);
        //2.拼接sql
        codeStream.forEach(t ->{
            updateSql.append("'").append(t).append("'").append(",");
        });
        //3.最后一个字段替换为')'
        updateSql.setCharAt(updateSql.length()-1,')');
        updateSql.append(";");
        System.out.println(updateSql.toString());
        //4.调用输出sql文件的流方法(一个sql一个文件)
        //generateSqlFile(i,updateSql.toString());
        //5.所有的sql输出到一个文件(流追加的方式)  4与5选其一即可
        generateSqlOneFile(updateSql.toString());
    }

三、生成sql文件并输出(一个sql一个文件)

/**
     * 生成sql文件
     * @author douglas
     * @date 2022/5/11 9:38
     * @param
     * @return void
     **/
    private void generateSqlFile(int i, String updateSql) {
        //1.定义文件名称(这里是动态生成文件名,一条sql一个文件)
        final String fileName = "自定义"+ i +".sql";
        //2.定义文件输出路径
        final String filePath = "D:/sqlFile/";
        File directory = new File(filePath);
        if(!directory.exists()){
            directory.mkdirs();
        }
        //3.创建输出流(jdk7后如下方式会自动关流)
        try(FileOutputStream fos = new FileOutputStream(filePath + fileName)){
            fos.write(updateSql.getBytes());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

四、输出sql文件(以追加的方式写入一个sql文件)

/**
     * 输出一个sql文件
     * @author douglas
     * @date 2022/5/11 12:26
     * @param
     * @return void
     **/
    private void generateSqlOneFile(String updateSql) {
        //1.定义文件名称
        final String fileName = "自定义.sql";
        //2.定义文件输出路径
        final String filePath = "D:/sqlFile/";
        File directory = new File(filePath);
        if(!directory.exists()){
            directory.mkdirs();
        }
        //3.遍历集合以追加的方式输出;追加多配一个参数 true
        try(FileOutputStream fos = new FileOutputStream(filePath + fileName,true)){
                fos.write(updateSql.getBytes());
                //3.1推荐使用,具有良好的跨平台性,换行符
                String newLine = System.getProperty("line.separator");
                fos.write(newLine.getBytes());
                fos.flush();
        }catch (Exception e){
                e.printStackTrace();
        }
    }
【总结】三步完成使用java生成sql文件,记得收藏哈。
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、简介 1.1前言 1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。 2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库脚本,副脚本,增量脚本。 3、 什么是主脚本、副脚本、增量脚本呢? 3.1、主脚本数据库表或存储过程,视图脚本,序列等脚本。 3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。 3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则需要的SQL脚本。 2、减少人工编写SQL脚本出错率问题,完全通过程序检测SQL准确性。 3、帮助开发人员提高SQL编写效率,减少人工编写SQL开发成本问题。 4、帮助开发人员节约时间,同时避免繁琐不必要编写SQL的工作。 二、实现方式与原理 2.1实现方式 1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】 2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 2.2原理 对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以梦为馬Douglas

您的鼓励是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值