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文件,记得收藏哈。

你可能感兴趣的:(Java后端文档,java,数据库,sql)