從資料庫表反射出實體類,自動生成實體類
阿新 • • 發佈:2019-02-02
package com.db.gen.entity.tool; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.Date; public class GenEntityMysql { private String packageOutPath = "com.user.entity";//指定實體生成所在包的路徑 private String authorName = "封狼居胥";//作者名字 private String tablename = "user";//表名 private String[] colnames; // 列名陣列 private String[] colTypes; //列名型別陣列 private int[] colSizes; //列名大小陣列 private boolean f_util = false; // 是否需要匯入包java.util.* private boolean f_sql = false; // 是否需要匯入包java.sql.* //資料庫連線 private static final String URL ="jdbc:mysql://localhost:3306/jbpm"; private static final String NAME = "root"; private static final String PASS = "root"; private static final String DRIVER ="com.mysql.jdbc.Driver"; /* * 建構函式 */ public GenEntityMysql(){ //建立連線 Connection con; //查要生成實體類的表 String sql = "select * from " + tablename; PreparedStatement pStemt = null; try { try { Class.forName(DRIVER); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } con = DriverManager.getConnection(URL,NAME,PASS); pStemt = con.prepareStatement(sql); ResultSetMetaData rsmd = pStemt.getMetaData(); int size = rsmd.getColumnCount(); //統計列 colnames = new String[size]; colTypes = new String[size]; colSizes = new int[size]; for (int i = 0; i < size; i++) { colnames[i] = rsmd.getColumnName(i + 1); colTypes[i] = rsmd.getColumnTypeName(i + 1); if(colTypes[i].equalsIgnoreCase("datetime")){ f_util = true; } if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){ f_sql = true; } colSizes[i] = rsmd.getColumnDisplaySize(i + 1); } String content = parse(colnames,colTypes,colSizes); try { File directory = new File(""); //System.out.println("絕對路徑:"+directory.getAbsolutePath()); //System.out.println("相對路徑:"+directory.getCanonicalPath()); String path=this.getClass().getResource("").getPath(); System.out.println(path); System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) ); // String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java"; String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java"; FileWriter fw = new FileWriter(outputPath); PrintWriter pw = new PrintWriter(fw); pw.println(content); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } finally{ // try { // con.close(); // } catch (SQLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } } /** * 功能:生成實體類主體程式碼 * @param colnames * @param colTypes * @param colSizes * @return */ private String parse(String[] colnames, String[] colTypes, int[] colSizes) { StringBuffer sb = new StringBuffer(); //判斷是否匯入工具包 if(f_util){ sb.append("import java.util.Date;\r\n"); } if(f_sql){ sb.append("import java.sql.*;\r\n"); } sb.append("package " + this.packageOutPath + ";\r\n"); sb.append("\r\n"); //註釋部分 sb.append(" /**\r\n"); sb.append(" * "+tablename+" 實體類\r\n"); sb.append(" * "+new Date()+" "+this.authorName+"\r\n"); sb.append(" */ \r\n"); //實體部分 sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n"); processAllAttrs(sb);//屬性 processAllMethod(sb);//get set方法 sb.append("}\r\n"); //System.out.println(sb.toString()); return sb.toString(); } /** * 功能:生成所有屬性 * @param sb */ private void processAllAttrs(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n"); } } /** * 功能:生成所有方法 * @param sb */ private void processAllMethod(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + "){\r\n"); sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n"); sb.append("\t}\r\n"); sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n"); sb.append("\t\treturn " + colnames[i] + ";\r\n"); sb.append("\t}\r\n"); } } /** * 功能:將輸入字串的首字母改成大寫 * @param str * @return */ private String initcap(String str) { char[] ch = str.toCharArray(); if(ch[0] >= 'a' && ch[0] <= 'z'){ ch[0] = (char)(ch[0] - 32); } return new String(ch); } /** * 功能:獲得列的資料型別 * @param sqlType * @return */ private String sqlType2JavaType(String sqlType) { if(sqlType.equalsIgnoreCase("bit")){ return "boolean"; }else if(sqlType.equalsIgnoreCase("tinyint")){ return "byte"; }else if(sqlType.equalsIgnoreCase("smallint")){ return "short"; }else if(sqlType.equalsIgnoreCase("int")){ return "int"; }else if(sqlType.equalsIgnoreCase("bigint")){ return "long"; }else if(sqlType.equalsIgnoreCase("float")){ return "float"; }else if(sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric") || sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money") || sqlType.equalsIgnoreCase("smallmoney")){ return "double"; }else if(sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar") || sqlType.equalsIgnoreCase("text")){ return "String"; }else if(sqlType.equalsIgnoreCase("datetime")){ return "Date"; }else if(sqlType.equalsIgnoreCase("image")){ return "Blod"; } return null; } /** * 出口 * TODO * @param args */ public static void main(String[] args) { new GenEntityMysql(); } }
package com.db.gen.entity.tool; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; public class GenEntityOracle { private String packageOutPath = "com.user.entity";//指定實體生成所在包的路徑 private String authorName = "封狼居胥";//作者名字 private String tablename = "emp";//表名 private String[] colnames; // 列名陣列 private String[] colTypes; //列名型別陣列 private int[] colSizes; //列名大小陣列 private boolean f_util = false; // 是否需要匯入包java.util.* private boolean f_sql = false; // 是否需要匯入包java.sql.* //資料庫連線 private static final String URL ="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; private static final String NAME = "scrot"; private static final String PASS = "tiger"; private static final String DRIVER ="oracle.jdbc.driver.OracleDriver"; /* * 建構函式 */ public GenEntityOracle(){ //建立連線 Connection con; //查要生成實體類的表 String sql = "select * from " + tablename; Statement pStemt = null; try { try { Class.forName(DRIVER); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } con = DriverManager.getConnection(URL,NAME,PASS); pStemt = (Statement) con.createStatement(); ResultSet rs = pStemt.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); int size = rsmd.getColumnCount(); //統計列 colnames = new String[size]; colTypes = new String[size]; colSizes = new int[size]; for (int i = 0; i < size; i++) { colnames[i] = rsmd.getColumnName(i + 1); colTypes[i] = rsmd.getColumnTypeName(i + 1); if(colTypes[i].equalsIgnoreCase("date") || colTypes[i].equalsIgnoreCase("timestamp")){ f_util = true; } if(colTypes[i].equalsIgnoreCase("blob") || colTypes[i].equalsIgnoreCase("char")){ f_sql = true; } colSizes[i] = rsmd.getColumnDisplaySize(i + 1); } String content = parse(colnames,colTypes,colSizes); try { File directory = new File(""); //System.out.println("絕對路徑:"+directory.getAbsolutePath()); //System.out.println("相對路徑:"+directory.getCanonicalPath()); String path=this.getClass().getResource("").getPath(); System.out.println(path); System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) ); // String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java"; String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java"; FileWriter fw = new FileWriter(outputPath); PrintWriter pw = new PrintWriter(fw); pw.println(content); pw.flush(); pw.close(); } catch (IOException e) { e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } finally{ // try { // con.close(); // } catch (SQLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } } /** * 功能:生成實體類主體程式碼 * @param colnames * @param colTypes * @param colSizes * @return */ private String parse(String[] colnames, String[] colTypes, int[] colSizes) { StringBuffer sb = new StringBuffer(); //判斷是否匯入工具包 if(f_util){ sb.append("import java.util.Date;\r\n"); } if(f_sql){ sb.append("import java.sql.*;\r\n"); } sb.append("package " + this.packageOutPath + ";\r\n"); sb.append("\r\n"); //註釋部分 sb.append(" /**\r\n"); sb.append(" * "+tablename+" 實體類\r\n"); sb.append(" * "+new Date()+" "+this.authorName+"\r\n"); sb.append(" */ \r\n"); //實體部分 sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\r\n"); processAllAttrs(sb);//屬性 processAllMethod(sb);//get set方法 sb.append("}\r\n"); //System.out.println(sb.toString()); return sb.toString(); } /** * 功能:生成所有屬性 * @param sb */ private void processAllAttrs(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n"); } } /** * 功能:生成所有方法 * @param sb */ private void processAllMethod(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + "){\r\n"); sb.append("\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n"); sb.append("\t}\r\n"); sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n"); sb.append("\t\treturn " + colnames[i] + ";\r\n"); sb.append("\t}\r\n"); } } /** * 功能:將輸入字串的首字母改成大寫 * @param str * @return */ private String initcap(String str) { char[] ch = str.toCharArray(); if(ch[0] >= 'a' && ch[0] <= 'z'){ ch[0] = (char)(ch[0] - 32); } return new String(ch); } /** * 功能:獲得列的資料型別 * @param sqlType * @return */ private String sqlType2JavaType(String sqlType) { if(sqlType.equalsIgnoreCase("binary_double")){ return "double"; }else if(sqlType.equalsIgnoreCase("binary_float")){ return "float"; }else if(sqlType.equalsIgnoreCase("blob")){ return "byte[]"; }else if(sqlType.equalsIgnoreCase("blob")){ return "byte[]"; }else if(sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar2") || sqlType.equalsIgnoreCase("varchar2")){ return "String"; }else if(sqlType.equalsIgnoreCase("date") || sqlType.equalsIgnoreCase("timestamp") || sqlType.equalsIgnoreCase("timestamp with local time zone") || sqlType.equalsIgnoreCase("timestamp with time zone")){ return "Date"; }else if(sqlType.equalsIgnoreCase("number")){ return "Long"; } return "String"; } /** * 出口 * TODO * @param args */ public static void main(String[] args) { new GenEntityOracle(); } }
通過改造可以實現mysql和oracle的了