使用Java根据约定格式生成MySQL建表语句
記錄:279
場景:在實際開發中,開發文檔中的建表信息以表格的方式提供,包括字段名稱、字段類型、字段注釋、是否為空等。本例就是先把表格信息轉換為約定格式的txt文件,在使用Java代碼生成完整的MySQL建表語句。
版本:Spring Boot 2.6.3
一、案例場景
1.開發文檔中以表格方式提供建表信息。
?2.手動轉換為txt文件,文件名:SENSOR_DATA.txt,格式約定如下:
第一行為,表名##表名稱。
第二行開始,每行:字段名稱##字段類型##字段非空##字段注釋##字段主鍵或者索引。
SENSOR_DATA##傳感器數據 ID##BIGINT(16)##Y##實體唯一標識##primary REGION##VARCHAR(8)##N##區域##index VALUE1##DECIMAL(16,2)##N##取值1##N VALUE2##DECIMAL(16,2)##N##取值2##N3.執行代碼,自動生成sql文件,文件名:SENSOR_DATA.sql,生成結果。
create table SENSOR_DATA ( ID BIGINT(16) not null COMMENT '實體唯一標識',REGION VARCHAR(8) COMMENT '區域',VALUE1 DECIMAL(16,2) COMMENT '取值1',VALUE2 DECIMAL(16,2) COMMENT '取值2') ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='傳感器數據'; alter table SENSOR_DATA add constraint PK_SENSOR_DATA_ID primary key (ID); create index IDX_SENSOR_DATA_REGION on SENSOR_DATA (REGION);二、使用類
1.讀文件操作
java.lang.AutoCloseable,接口。
java.io.Closeable,接口,繼承AutoCloseable。
java.lang.Readable,接口。
java.io.Reader,抽象類,實現Readable接口和Closeable。
java.io.BufferedReader,實現類,實現Reader抽象類。
java.io.InputStreamReader,實現類,讀輸入流,Reader抽象類。
java.io.FileReader,實現類,讀文件,繼承InputStreamReader。
new BufferedReader(new FileReader(fileName))。
2.寫文件操作
java.lang.AutoCloseable,接口。
java.io.Closeable,接口,繼承AutoCloseable。
java.io.Flushable,接口。
java.lang.Appendable,接口。
java.io.Writer,抽象類,實現Appendable, Closeable, Flushable。
java.io.BufferedWriter,實現類,實現Writer抽象類。
java.io.OutputStreamWriter,實現類,寫輸出流,Writer抽象類。
java.io.FileWriter,實現類,寫文件,繼承OutputStreamWriter。
new BufferedWriter(new FileWriter(fileName, true));
3.操作ArrayList
java.lang.Iterable,接口。
java.util.Collection,接口,繼承Iterable。
java.util.List,接口,繼承Collection。
java.util.AbstractCollection,抽象類,實現Collection。
java.util.AbstractList,抽象類,繼承AbstractCollection,實現List。
java.util.ArrayList,一個Resizable-array。
4.Collections
java.util.Collections,對集合相關操作。
5.File操作
java.io.Serializable,接口。
java.lang.Comparable,接口。
java.io.File,實現類,實現Serializable和Comparable接口。
三、代碼
1.讀文件
讀取文件,逐行讀取,每讀取一行,立即解析,根據分隔符##,分割成多個String字符串,存放在一個List<String>中。解析完成的一行數據List<String>,再放入List<List>中。
讀取文件,逐行讀取,每讀取一行,立即解析,根據分隔符##,分割成多個String字符串,存放在一個List<String>中。解析完成的一行數據List<String>,再放入List<List>中。
public static ArrayList<ArrayList<String>> readFromTxt(String fileName) {ArrayList<ArrayList<String>> listAll = new ArrayList<>();try {//1.讀txt文件,一次讀一行BufferedReader br = new BufferedReader(new FileReader(fileName));String oneLine = null;//2.使用readLine方法,一次讀一行while ((oneLine = br.readLine()) != null) {ArrayList<String> oneLineList = getOneLine(oneLine, "##");listAll.add(oneLineList);}br.close();} catch (Exception e) {System.out.println("讀異常.");e.printStackTrace();}return listAll; } public static ArrayList<String> getOneLine(String content, String split) {String[] strArr = content.split(split);ArrayList<String> oneLine = new ArrayList<>(strArr.length);Collections.addAll(oneLine, strArr);return oneLine; }2.寫文件
逐行寫文件,以追加方式寫入,不覆蓋已經寫入的內容。
public static void writeFile(String fileName, String content) {try {// 設置為追加寫入trueBufferedWriter bw = new BufferedWriter(new FileWriter(fileName, true));bw.write(content);bw.close();} catch (IOException e) {System.out.println("讀異常.");e.printStackTrace();} }3.生成建表語句和注釋
根據從txt讀取的表字段信息,生成建表語句和注釋。
public static void createTable(String fileName, ArrayList<ArrayList<String>> content) {List<String> firstOne = content.get(0);String tableName = firstOne.get(0);String tableComment = firstOne.get(1);String part1 = "create table ";String part2 = tableName;String part3 = " ( ";writeFile(fileName, part1 + part2 + part3 + "\n");String part5 = " ) " + "ENGINE=INNODB DEFAULT CHARSET=utf8 ";String part6 = " COMMENT='" + tableComment + "';";int size = content.size();for (int i = 0; i < size; i++) {ArrayList<String> oneLine = content.get(i);if (StringUtils.equals(tableName, oneLine.get(0))) continue;String line = "";int last = content.size() - 1;String columnName = oneLine.get(0) + " ";String dataType = oneLine.get(1) + " ";String comment = " COMMENT '" + oneLine.get(3) + "'";if (StringUtils.equals("Y", oneLine.get(2))) {line = columnName + dataType + " not null " + comment + "," + "\n";} else if (i == last) {line = columnName + dataType + comment + "\n";} else {line = columnName + dataType + comment + "," + "\n";}writeFile(fileName, " " + line);}writeFile(fileName, part5 + part6 + "\n"); }4.生成主鍵約束和索引
根據從txt讀取的表字段信息,生成主鍵約束和索引。
// 生成主鍵和索引 public static void createPrimaryAndIndex(String fileName, ArrayList<ArrayList<String>> content) {List<String> firstOne = content.get(0);String tableName = firstOne.get(0);int size = content.size();for (int i = 0; i < size; i++) {ArrayList<String> oneLine = content.get(i);if (StringUtils.equals(tableName, oneLine.get(0))) continue;if (StringUtils.equals("primary", oneLine.get(4).toLowerCase())) {String part1 = "alter table ";String part2 = tableName;String part3 = " add constraint ";String part4 = "PK_" + tableName + "_" + oneLine.get(0);String part5 = " primary key (" + oneLine.get(0) + ");";part4 = getLimitString(part4);String pk = part1 + part2 + part3 + part4 + part5;writeFile(fileName, pk + "\n");}if (StringUtils.equals("index", oneLine.get(4).toLowerCase())) {String part1 = "create index ";String part2 = "IDX_" + tableName + "_" + oneLine.get(0);String part3 = " on ";String part4 = tableName;String part5 = " (" + oneLine.get(0) + ");";part2 = getLimitString(part2);String index = part1 + part2 + part3 + part4 + part5;writeFile(fileName, index + "\n");}} } // 限定主鍵或索引名稱字符串30個字符 public static String getLimitString(String srcStr){int length = srcStr.length();if (length > 30) {srcStr = srcStr.substring(0, 30);String underline = srcStr.substring(29, 30);if (StringUtils.equals("_", underline)) {// 最后一個字符是字母而不是下劃線srcStr = srcStr.substring(0, 29);}}return srcStr; }5.在main函數調用
在main函數調用測試,從指定目錄下讀取txt文件名稱,逐個生成SQL文件。
public static void main(String[] args) {System.out.println("開始...");String baseDir = "D:\\example\\";List<String> listFile = getAllTxtFile(baseDir);for (String fileName : listFile) {singleFile(baseDir, fileName);}System.out.println("結束..."); } public static List<String> getAllTxtFile(String path) {File dirFile = new File(path);File[] subFiles = dirFile.listFiles();List<String> fileList = new ArrayList<>();if (subFiles != null) {for (File subFile : subFiles) {if (subFile.isDirectory()) continue;else {if (subFile.isFile() && subFile.getName().endsWith(".txt")) {fileList.add(subFile.getName().substring(0, subFile.getName().length() - 4));}}}}return fileList; } public static void singleFile(String baseDir, String fileName) {String srcFileName = baseDir + fileName + ".txt";String tarFileName = baseDir + fileName + ".sql";ArrayList<ArrayList<String>> read = readFromTxt(srcFileName);// 表結構與注釋createTable(tarFileName, read);// 主鍵和索引createPrimaryAndIndex(tarFileName, read); }以上,感謝。
2022年7月2日
總結
以上是生活随笔為你收集整理的使用Java根据约定格式生成MySQL建表语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蜜罐
- 下一篇: linux cmake编译源码,linu