根據建表語句生成實體類和查詢用的ResultMap
阿新 • • 發佈:2019-01-08
import java.io.*; public class Main { public static void main(String[] args) { String filePath = "D:\\00t1.txt"; Main main = new Main(); main.getModel(filePath); main.getResultMapXML(filePath); }//main /** * 根據sql生成實體類,支援多個建表語句 * 輸入:建表語句的檔案路徑 * 輸出:ResultMap * * @param filePath */ private void getModel(String filePath) { System.out.println("//------------以下是生成的Model程式碼-----------"); InputStream is = null; String propertyName; String typeName; String commentStr; try { is = new FileInputStream(filePath); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 512); // 讀取一行,儲存於字串列表中 for (String line = reader.readLine(); line != null; line = reader.readLine()) { if (line.length() <= 1) { continue; } // 生成Model, private String aaColumn; //a_column的註釋 if (line.contains("CREATE")) { System.out.println(); System.out.println(line.substring(line.indexOf("`") + 1, line.lastIndexOf("`"))); } propertyName = this.getPropertyName(line); typeName = this.getType(line); if (!"NULL".equals(typeName) && !"NULL".equals(propertyName)) { commentStr = this.getComment(line); System.out.println("private " + typeName + " " + propertyName + "; //" + commentStr); } } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (is != null) { is.close(); is = null; } } catch (IOException e) { e.printStackTrace(); } } }//getModel /** * 根據SQL獲取 ResultMap XML程式碼,支援多個建表語句 * 輸入:建表語句的檔案路徑 * 輸出:ResultMap * * @param filePath */ private void getResultMapXML(String filePath) { InputStream is = null; try { is = new FileInputStream(filePath); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 512); // 讀取一行,儲存於字串列表中 System.out.println(); System.out.println("<!-- ----------以下是生成的XML程式碼--------- -->"); String tableName; String typeName; String propertyName; String columnName; StringBuilder sbTableName = new StringBuilder(); for (String line = reader.readLine(); line != null; line = reader.readLine()) { line = line.trim(); if (line == null || line.length() == 0 || line.contains("-") || line.contains("DROP")) { continue; } if (line.contains("CREATE")) { tableName = line.substring(line.indexOf("`") + 1, line.lastIndexOf("`")); tableName = this.getTableName(tableName); sbTableName.append("<resultMap id=\"").append(tableName).append("Map\" ").append("class=\"").append(tableName).append("\">"); System.out.println(sbTableName.toString()); sbTableName.delete(0, sbTableName.length()); } //生成xml <result property="abcProperty" column="abc_property"/> propertyName = this.getPropertyName(line); if (!"NULL".equals(propertyName)) { columnName = this.getColumnName(line); typeName = this.getType(line); System.out.print("<result property=" + "\"" + propertyName + "\"" + " column=" + "\"" + columnName + "\""); if ("Date".equals(typeName)) { System.out.println(" javaType=\"java.util.Date\"" + "/>"); } else { System.out.println("/>"); } } if (line.contains("ENGINE=")) { System.out.println("</resultMap>"); System.out.println(""); } }//for } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if (is != null) { is.close(); is = null; } } catch (IOException e) { e.printStackTrace(); } } }//getResultMapXML /** * 獲取對應的java型別 * * @param line * @return */ private String getType(String line) { if (line.length() > 1 && !line.contains("CREATE") && !line.contains("PRIMARY") && !line.contains("KEY") && !line.contains("ENGINE=")) { line = line.substring(line.lastIndexOf("`") + 2, line.length()); line = line.substring(0, line.indexOf(" ")); if (line.contains("bigint")) { return "Long"; } else if (line.contains("char")) {//此時也包括 varchar型別 return "String"; } else if (line.contains("double")) { return "Double"; } else if (line.contains("int")) {//此時也包括 tinyint型別 return "Integer"; } else if (line.contains("date")) {//此時也包括 datetime型別 return "Date"; } } return "NULL"; } /** * 把欄位名轉化為駝峰命名的屬性名,abc_property ->abcProperty * * @param line * @return */ private String getPropertyName(String line) { if (line.length() > 1 && !line.contains("CREATE") && !line.contains("PRIMARY") && !line.contains("KEY") && !line.contains("ENGINE=")) { String tempDelimiter = line.substring(line.indexOf("`") + 1, line.lastIndexOf("`")); String tempDelimiterArray[] = tempDelimiter.split("_");//如果不包含“_”,此時就含有字串一個元素 StringBuffer sb = new StringBuffer(); for (int i = 0; i < tempDelimiterArray.length; i++) { if (i == 0) { sb.append(tempDelimiterArray[i]); } if (i != 0) { //除第一個單詞外,其他的單詞的首字母大寫,String substring(int beginIndex) sb.append(tempDelimiterArray[i].substring(0, 1).toUpperCase() + tempDelimiterArray[i].substring(1)); } }//for return sb.toString(); } return "NULL"; } /** * 獲取SQL的註釋 * * @param line * @return */ private String getComment(String line) { if (line.contains("COMMENT")) { return line.substring(line.indexOf("'") + 1, line.lastIndexOf("',")); } else if (line.contains("AUTO_INCREMENT")) { return "主鍵Id"; } else if (line.contains("created_time")) { return "建立時間"; } else if (line.contains("updated_time")) { return "修改時間"; } return "NULL"; } /** * 獲取sql的欄位名.`abc_property` -> abc_property * * @param line * @return */ private String getColumnName(String line) { line = line.substring(line.indexOf("`") + 1, line.lastIndexOf("`")); return line; } /** * 轉化為駝峰命名的表名,abc_table -> AbcTable * * @param tempDelimiter * @return */ private String getTableName(String tempDelimiter) { String tempDelimiterArray[] = tempDelimiter.split("_"); StringBuffer sb = new StringBuffer(); for (int i = 0; i < tempDelimiterArray.length; i++) { sb.append(tempDelimiterArray[i].substring(0, 1).toUpperCase() + tempDelimiterArray[i].substring(1)); }//for return sb.toString(); } }
輸入檔案內容:
CREATE TABLE `abc_table` ( `id` bigint(20) NOT NULL COMMENT 'ID', `aa_column` char(1) DEFAULT NULL COMMENT 'aa_column的註釋', `bb_column` varchar(500) DEFAULT NULL COMMENT 'bb_column的註釋', `start_time` datetime NOT NULL COMMENT '開始時間', `end_time` datetime NOT NULL COMMENT '結束時間', `cc_column` tinyint(4) NOT NULL COMMENT 'cc_column的註釋', `dt` varchar(255) NOT NULL COMMENT '分割槽', `dt` date NOT NULL COMMENT '日期', `created_time` datetime NOT NULL, `updated_time` datetime NOT NULL, `dd_column` double DEFAULT NULL COMMENT 'dd_column的註釋', `created_date` datetime NOT NULL COMMENT '建立時間', `updated_date` datetime NOT NULL COMMENT '更新時間', PRIMARY KEY (`id`), KEY `idx_a_column` (`a_column`), KEY `idx_b_column_time` (`b_column`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='xxxx表'; CREATE TABLE `abc_table` ( `id` bigint(20) NOT NULL COMMENT 'ID', `aa_column` char(1) DEFAULT NULL COMMENT 'aa_column的註釋', `bb_column` varchar(500) DEFAULT NULL COMMENT 'bb_column的註釋', `start_time` datetime NOT NULL COMMENT '開始時間', `end_time` datetime NOT NULL COMMENT '結束時間', `cc_column` tinyint(4) NOT NULL COMMENT 'cc_column的註釋', `dt` varchar(255) NOT NULL COMMENT '分割槽', `dt` date NOT NULL COMMENT '日期', `created_time` datetime NOT NULL, `updated_time` datetime NOT NULL, `dd_column` double DEFAULT NULL COMMENT 'dd_column的註釋', `created_date` datetime NOT NULL COMMENT '建立時間', `updated_date` datetime NOT NULL COMMENT '更新時間', PRIMARY KEY (`id`), KEY `idx_a_column` (`a_column`), KEY `idx_b_column_time` (`b_column`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='xxxx表';
輸出內容:
//------------以下是生成的Model程式碼----------- abc_table private Long id; //ID private String aaColumn; //aa_column的註釋 private String bbColumn; //bb_column的註釋 private Date startTime; //開始時間 private Date endTime; //結束時間 private Integer ccColumn; //cc_column的註釋 private String dt; //分割槽 private Date dt; //日期 private Date createdTime; //建立時間 private Date updatedTime; //修改時間 private Double ddColumn; //dd_column的註釋 private Date createdDate; //建立時間 private Date updatedDate; //更新時間 abc_table private Long id; //ID private String aaColumn; //aa_column的註釋 private String bbColumn; //bb_column的註釋 private Date startTime; //開始時間 private Date endTime; //結束時間 private Integer ccColumn; //cc_column的註釋 private String dt; //分割槽 private Date dt; //日期 private Date createdTime; //建立時間 private Date updatedTime; //修改時間 private Double ddColumn; //dd_column的註釋 private Date createdDate; //建立時間 private Date updatedDate; //更新時間 <!-- ----------以下是生成的XML程式碼--------- --> <resultMap id="AbcTableMap" class="AbcTable"> <result property="id" column="id"/> <result property="aaColumn" column="aa_column"/> <result property="bbColumn" column="bb_column"/> <result property="startTime" column="start_time" javaType="java.util.Date"/> <result property="endTime" column="end_time" javaType="java.util.Date"/> <result property="ccColumn" column="cc_column"/> <result property="dt" column="dt"/> <result property="dt" column="dt" javaType="java.util.Date"/> <result property="createdTime" column="created_time" javaType="java.util.Date"/> <result property="updatedTime" column="updated_time" javaType="java.util.Date"/> <result property="ddColumn" column="dd_column"/> <result property="createdDate" column="created_date" javaType="java.util.Date"/> <result property="updatedDate" column="updated_date" javaType="java.util.Date"/> </resultMap> <resultMap id="AbcTableMap" class="AbcTable"> <result property="id" column="id"/> <result property="aaColumn" column="aa_column"/> <result property="bbColumn" column="bb_column"/> <result property="startTime" column="start_time" javaType="java.util.Date"/> <result property="endTime" column="end_time" javaType="java.util.Date"/> <result property="ccColumn" column="cc_column"/> <result property="dt" column="dt"/> <result property="dt" column="dt" javaType="java.util.Date"/> <result property="createdTime" column="created_time" javaType="java.util.Date"/> <result property="updatedTime" column="updated_time" javaType="java.util.Date"/> <result property="ddColumn" column="dd_column"/> <result property="createdDate" column="created_date" javaType="java.util.Date"/> <result property="updatedDate" column="updated_date" javaType="java.util.Date"/> </resultMap>