通过程序实现SQL脚本检索条件拼接

package tool;

import static java.lang.System.out;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;;

/**
 * 

* Oracle中检索条件在1000+以上,无法直接写入同一个in里,可以通过or in的方式拼接条件,如下所示 *

*

* SELECT * FROM TARGET_TABLE WHERE FILED IN ('A','B','C') OR IN('D','E','F') *

*

* 当条件数量巨大时,手动写or in脚本灰常困难,比如说100000条,甚至更多。这时候可以通过程序来制作相应的脚本,本程序旨在解决这一需求。 *

*

* mock():用于生成模拟数据,示范效果; createSqlScript():制作脚本; * 实际使用时,需要将mock方法注释掉。详细过程可以参照代码部分。 *

* * @author jiangrx * */ public class SqlScriptGenerator { // 模拟数据条数 final static Integer COUNT = 10000; // 脚本中or in部分数量限制,达到该数量会重新拼接or in(Oracle中in部分最多只允许1000的条件) final static Integer LIMIT_IN = 1000; // 脚本中全部in中条件数量限制,达到该数量会重新生成一个脚本文件 final static Integer LIMIT_FILE = 3000; // 生成的脚本文件存放目录(该目录用于存放生成的脚本文件) final static String TARGET_FOLDER = "D:\\temp"; // 源文件路径(该路径存放包含需要拼接的源数据的文本文件) final static String SOURCE_FILE = "D:\\temp\\source.txt"; // 日期格式化 final static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 判断目标目录是否存在,如果不存在,则先生成目标目录 static { File file = new File(TARGET_FOLDER); if (!file.exists()) { file.mkdir(); } } public static void main(String[] args) { // mock(); createSqlScript(); } /** * 制作脚本 */ public static void createSqlScript() { StringBuilder sb = new StringBuilder(); FileWriter bw = null; int lineNum = 1; int order = 1; out.println("开始拼接SQL脚本---" + LocalDateTime.now().format(FORMATTER)); try (BufferedReader br = new BufferedReader(new FileReader(SOURCE_FILE))) { String l; while ((l = br.readLine()) != null) { if (lineNum % LIMIT_FILE == 1) { bw = new FileWriter(TARGET_FOLDER + "\\script" + order + ".sql"); order++; } if (lineNum % LIMIT_IN == 0) { bw.write(" OR IN (" + sb + "'" + l + "')"); bw.flush(); sb = new StringBuilder(); } else { sb.append("'" + l + "',").append("\r\n"); } lineNum++; } out.println("SQL脚本拼接完成---" + LocalDateTime.now().format(FORMATTER)); } catch (IOException e) { e.printStackTrace(); } } /** * 制作模拟数据 */ public static void mock() { StringBuilder ex = new StringBuilder(); out.println("开始生成模拟数据---" + LocalDateTime.now().format(FORMATTER)); try (FileWriter fr = new FileWriter(SOURCE_FILE)) { for (int i = 0; i < COUNT; i++) { ex.append(String.valueOf(i + 1000000)).append("\r\n"); } fr.write(ex.toString()); fr.flush(); out.println("模拟数据已生成---" + LocalDateTime.now().format(FORMATTER)); } catch (IOException e1) { e1.printStackTrace(); } } }

有不足之处,请不吝赐教。 

 

你可能感兴趣的:(JAVA,java)