package com.lunhan.xxx.common.orm2.gencolumn; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sql.*; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 生成数据库列 MySql */ public class GenColumnMySql { private final Connection conn; private String outFilePath; public GenColumnMySql(String url, String name, String password, String driver) throws ClassNotFoundException, SQLException { //加载驱动 Class.forName(driver); //获得连接 conn = DriverManager.getConnection(url, name, password); } public boolean run(String packageName, List importList, String outPath) throws Exception { if (conn == null || conn.isClosed()) { return false; } outFilePath = new File("").getAbsolutePath() + "/" + outPath + "/" + packageName.replace(".", "/"); System.out.println("outFilePath:" + outFilePath); File directory = new File(outFilePath); directory.mkdirs(); try { Map tableInfo = this.getTableInfo(conn.getCatalog()); for (Map.Entry item : tableInfo.entrySet()) { String tableName = item.getKey(); String tableComment = item.getValue(); Map columnInfoMap = this.getColumnInfo(tableName); this.createColumnFile(tableName, tableComment, columnInfoMap, packageName, importList); } } finally { conn.close(); } return true; } private Map getTableInfo(String tableSchema) throws SQLException { Map tableInfoMap = new LinkedHashMap<>(); String sql = " SELECT TABLE_NAME ,TABLE_COMMENT " + " FROM information_schema.`TABLES` " + " WHERE TABLE_SCHEMA = ? "; try (PreparedStatement pStmt = conn.prepareStatement(sql)) { pStmt.setString(1, tableSchema); try (ResultSet rs = pStmt.executeQuery()) { while (rs.next()) { String tableName = rs.getString("TABLE_NAME"); String tableComment = rs.getString("TABLE_COMMENT"); tableInfoMap.put(tableName, tableComment); } } } return tableInfoMap; } private Map getColumnInfo(String tableName) throws SQLException { Map columnInfoMap = new LinkedHashMap<>(); String sql = " SELECT COLUMN_NAME ,COLUMN_COMMENT " + " FROM information_schema.`COLUMNS` " + " WHERE TABLE_NAME = ? "; try (PreparedStatement pStmt = conn.prepareStatement(sql)) { pStmt.setString(1, tableName); try (ResultSet rs = pStmt.executeQuery()) { while (rs.next()) { String columnName = rs.getString("COLUMN_NAME"); String columnComment = rs.getString("COLUMN_COMMENT"); columnInfoMap.put(columnName, columnComment); } } } return columnInfoMap; } private void createColumnFile(String tableName, String tableComment, Map columnInfoMap, String packageName, List importList) throws IOException { String fileName = this.underline2Camel(tableName, true); String filePath = this.outFilePath + "/" + fileName + ".java"; File columnFile = new File(filePath); columnFile.createNewFile(); StringBuilder sb = new StringBuilder(); sb.append("/*\n" + "# __----~~~~~~~~~~~------___\n" + "# . . ~~//====...... __--~ ~~\n" + "# -. \\_|// |||\\\\ ~~~~~~::::... /~\n" + "# ___-==_ _-~o~ \\/ ||| \\\\ _/~~-\n" + "# __---~~~.==~||\\=_ -_--~/_-~|- |\\\\ \\\\ _/~\n" + "# _-~~ .=~ | \\\\-_ '-~7 /- / || \\ /\n" + "# .~ .~ | \\\\ -_ / /- / || \\ /\n" + "# / ____ / | \\\\ ~-_/ /|- _/ .|| \\ /\n" + "# |~~ ~~|--~~~~--_ \\ ~==-/ | \\~--===~~ .\\\n" + "# ' ~-| /| |-~\\~~ __--~~\n" + "# |-~~-_/ | | ~\\_ _-~ /\\\n" + "# / \\ \\__ \\/~ \\__\n" + "# _--~ _/ | .-~~____--~-/ ~~==.\n" + "# ((->/~ '.|||' -_| ~~-/ , . _||\n" + "# -_ ~\\ ~~---l__i__i__i--~~_/\n" + "# _-~-__ ~) \\--______________--~~\n" + "# //.-~~~-~_--~- |-------~~~~~~~~\n" + "# //.-~~~--\\\n" + "# 神兽保佑\n" + "# 代码无BUG! \n" + "*/"); sb.append("\r\n"); sb.append(String.format("package %s;%n", packageName)); sb.append("\r\n"); for (String item : importList) { sb.append(String.format("import %s;%n", item)); } sb.append("\r\n"); sb.append("/**\r\n"); sb.append(String.format(" * %s%n", tableComment)); sb.append(" */\r\n"); sb.append(String.format("public enum %s implements ColumnBasic {%n", fileName)); int index = 1; for (Map.Entry item : columnInfoMap.entrySet()) { String columnName = item.getKey(); String columnComment = item.getValue(); sb.append(" /**\r\n"); sb.append(String.format(" * %s%n", columnComment.replace("\r\n", "\r\n * "))); sb.append(" */\r\n"); sb.append(String.format(" %s(\"%s\", %s),%n", columnName.toUpperCase(), columnName, index++)); } sb.replace(sb.lastIndexOf(","), sb.length(), ";\r\n"); sb.append("\r\n"); sb.append(" private String columnName;\r\n"); sb.append(" private Integer columnIndex;\r\n"); sb.append(String.format(" public static final String TABLE_NAME = \"%s\";%n", tableName)); sb.append("\r\n"); sb.append(String.format(" %s(String columnName, Integer columnIndex) {%n", fileName)); sb.append(" this.columnName = columnName;\r\n"); sb.append(" this.columnIndex = columnIndex;\r\n"); sb.append(" }\r\n"); sb.append("\r\n"); sb.append(" @Override\r\n"); sb.append(" public String getColumnName() {\r\n"); sb.append(" return ColumnBuilder.getColumnName(TABLE_NAME, this.columnName);\r\n"); sb.append(" }\r\n"); sb.append("}"); try (FileWriter fw = new FileWriter(columnFile.getAbsolutePath()); PrintWriter pw = new PrintWriter(fw)) { pw.println(sb.toString()); pw.flush(); } } private String underline2Camel(String line, boolean... firstIsUpperCase) { String str = ""; if (StringUtils.isBlank(line)) { return str; } else { StringBuilder sb = new StringBuilder(); String[] strArr; // 不包含下划线,且第二个参数是空的 if (!line.contains("_") && firstIsUpperCase.length == 0) { sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1)); str = sb.toString(); } else if (!line.contains("_") && firstIsUpperCase.length != 0) { if (!firstIsUpperCase[0]) { sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1)); str = sb.toString(); } else { sb.append(line.substring(0, 1).toUpperCase()).append(line.substring(1)); str = sb.toString(); } } else if (line.contains("_") && firstIsUpperCase.length == 0) { strArr = line.split("_"); for (String s : strArr) { sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1)); } str = sb.toString(); str = str.substring(0, 1).toLowerCase() + str.substring(1); } else if (line.contains("_") && firstIsUpperCase.length != 0) { strArr = line.split("_"); for (String s : strArr) { sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1)); } if (!firstIsUpperCase[0]) { str = sb.toString(); str = str.substring(0, 1).toLowerCase() + str.substring(1); } else { str = sb.toString(); } } } return str; } // public static void main(String[] args) throws Exception { // String url = "jdbc:mysql://81.68.189.38:3306/mall-test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false"; // String name = "root"; // String password = "root"; // String driver = "com.mysql.jdbc.Driver"; // String outPath = "framework-common/src/test/java"; // String packageName = "com.ctrip.tour.cq.framework.common.test.dbcoulmns.orms"; // List importList = new ArrayList() {{ // add("com.ctrip.tour.cq.framework.common.orm2.ColumnBuilder"); // add("com.ctrip.tour.cq.framework.common.orm2.enums.ColumnBasic"); // }}; // new GenColumnMySql(url, name, password, driver).run(packageName, importList, outPath); // } }