自己簡單寫的JDBCUtils,可以根據當前數據庫下面的表生成java實體類,代碼萌新,請多多包涵。
初始化配置:
//驅動程序名//不固定,根據驅動 static String driver = "com.mysql.jdbc.Driver"; // URL指向要訪問的數據庫名******,8.0jar包新增時區。 static String url = "jdbc:mysql://localhost/你的數據庫名?serverTimezone=GMT%2B8"; // MySQL配置時的用戶名 static String user = "你的帳號"; // Java連接MySQL配置時的密碼****** static String password = "你的密碼"; private static String[] colnames; // 列名數組 private static String[] colTypes; // 列名類型數組 private static String[] upperColnames; //駝峰命名的字段 private static List<StringBuffer> listArr=new ArrayList<StringBuffer>(); //存儲最終的數據 static { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
打開與關閉數據庫連接:
public static Connection mySQLOpen() { Connection con = null; try { con = DriverManager.getConnection(url, user, password); System.out.println("succeed to connection mysql!"); } catch (SQLException e) { e.printStackTrace(); } return con; } public static void mySQLClose(ResultSet rs, Statement st, Connection con) { try { try { if (rs != null) { rs.close(); } } finally { try { if (st != null) { st.close(); } } finally { if (con != null) con.close(); } } } catch (SQLException e) { e.printStackTrace(); } }
獲得當前數據庫下的所有表名:
/** * 獲得當前數據庫生成數據庫下所有的表名 * @author one * * */ public static List<String> getTableFromNowConnectDB(){ Connection conn=null; DatabaseMetaData dbmd = null; List<String> list = null; try { conn=mySQLOpen(); dbmd=(DatabaseMetaData) conn.getMetaData(); //conn.getCatalog():獲得當前目錄 ResultSet rs = dbmd.getTables(conn.getCatalog(), "%", "%", new String[] { "TABLE" }); if (rs != null) { list = new ArrayList<String>(); } while(rs.next()){ //System.out.println(rs.getString("TABLE_NAME")); list.add(rs.getString("TABLE_NAME")); } } catch (Exception e) { e.printStackTrace(); } return list; }
生成每個表名的所有字段:
/** * 生成所有的字段 * * @param sb,把stringbuffer 對象傳進來繼續append * @return */ private static void processAllField(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { sb.append("\tprivate " + colTypes[i] + " " + colnames[i] + ";\r\n"); } }
生成每個表名的set(),get()訪問器:
/** * 生成所有的set(),get() * * @param sb,把stringbuffer 對象傳進來繼續append */ private static void processAllMethod(StringBuffer sb) { for (int i = 0; i < colnames.length; i++) { sb.append("\tpublic void set" + upperColnames[i] + "(" + colTypes[i] + " " + colnames[i] + "){\r\n"); sb.append("\t\tthis." + colnames[i] + " = " + colnames[i] + ";\r\n"); sb.append("\t}\r\n"); sb.append("\tpublic " + colTypes[i] + " get" + upperColnames[i] + "(){\r\n"); sb.append("\t\treturn this." + colnames[i] + ";\r\n"); sb.append("\t}\r\n"); } }
生成每個表名的構造函數:
/** * @author one * 該方法用於生成構造函數 * @param sb,把stringbuffer 對象傳進來繼續append * @see 默認生成一個無參數構造和帶全部參數構造 * * public UserInfo(){} public UserInfo(int uid, String uname, String usex) { super(); this.uid = uid; this.uname = uname; this.usex = usex; } * */ private static void processConstructor(StringBuffer sb,String tableName) { sb.append("\tpublic "+tableName+"(){}\r\n"); sb.append("\tpublic "+tableName+"("); String link=""; for (int i = 0; i < colnames.length; i++) { sb.append(link + colTypes[i] + " " + colnames[i]); link=","; } sb.append("){\r\n"); for (int i = 0; i < colnames.length; i++) { sb.append("\t\tthis."+colnames[i]+"="+colnames[i]+";\r\n"); } sb.append("\t}\r\n"); }
數據類型轉換的方法:
/** * 該方法用於類型轉換 * @param dbType:傳入的數據類型 * @author one * */ private static String sqlTypeToJava(String dbType) { dbType = dbType.toUpperCase(); switch (dbType) { case "VARCHAR": case "VARCHAR2": case "CHAR": return "String"; case "NUMBER": case "DECIMAL": return "double"; case "INT": case "SMALLINT": case "INTEGER": return "int"; case "BIGINT": return "int"; case "DATETIME": case "TIMESTAMP": case "DATE": return "Date"; default: return "Object"; } }
創建文件夾,寫入項目:
/** * 創建java 文件 將生成的屬性 get/set 方法 保存到 文件中 * * @author one * @param className * 類名稱 * @param content * 類內容 包括屬性 getset 方法 */ public static void createFloder(String className, String content, String packageName) { String folder = System.getProperty("user.dir") + "/src/" + packageName + "/"; File file = new File(folder); if (!file.exists()) { file.mkdirs(); } String fileName = folder + className + ".java"; try { File newdao = new File(fileName); FileWriter fw = new FileWriter(newdao); fw.write("package\t" + packageName.replace("/", ".") + ";\r\n"); fw.write(content); fw.flush(); fw.close(); } catch (IOException e) { e.printStackTrace(); } }
生成實體類:
/** * 該方法生成Entity * @param tablename:表名集合 * @param packname:要生成的路徑 * @author one * */ public static List<StringBuffer> createEntity(List<String> tableNames,String packname) throws Exception{ Connection conn=null; PreparedStatement pstmt=null; ResultSetMetaData rsmd = null; //每個表的表名 String eveTableName=""; conn=mySQLOpen(); //System.out.println("當前數據庫下的表的總數:"+tableNames.size()); for (int i = 0; i < tableNames.size(); i++) { //用StringBuffer的形式先輸出測試一下 StringBuffer sb=new StringBuffer(""); //表名首字母轉大寫 eveTableName=tableNames.get(i).substring(0, 1).toUpperCase()+tableNames.get(i).substring(1,tableNames.get(i).length()); sb.append("public class "+eveTableName+" {\n\n"); //查詢語句 String sql="select * from "+eveTableName; pstmt=conn.prepareStatement(sql); //獲得表的元數據 rsmd=pstmt.getMetaData(); // 每個表共有多少列 int size = rsmd.getColumnCount(); //把字段放在集合里面 colnames = new String[size]; colTypes = new String[size]; upperColnames = new String[size]; for (int j = 0; j < size; j++) { String columnName = rsmd.getColumnName(j+1);//每列的字段名 colnames[j]=columnName; String colunmType=sqlTypeToJava(rsmd.getColumnTypeName(j+1));//每列的類型 colTypes[j]=colunmType; //接下來做駝峰命名的字段 String upperColumnNam= rsmd.getColumnName(j+1).substring(0,1).toUpperCase()+ rsmd.getColumnName(j+1).substring(1,rsmd.getColumnName(j+1).length()); upperColnames[j]=upperColumnNam; } processAllField(sb); //生成字段 processAllMethod(sb); //生成set,get方法 processConstructor(sb,eveTableName); //生成構造函數 //添加最后一個括號 sb.append("}"); //創建文件夾,sb.toString(),把數據加進去 createFloder(eveTableName,sb.toString(),packname); listArr.add(sb); } //關閉連接 mySQLClose(null,pstmt,conn); return listArr; }
展示數據的方法:
/** * 展示 * */ public static void goCreate(){ try { List<StringBuffer> result=createEntity(getTableFromNowConnectDB(),"vo2"); for (int i = 0; i < result.size(); i++) { System.out.println("============第"+(i+1)+"個表的實體類生成============"); System.out.println(result.get(i)); } } catch (Exception e) { e.printStackTrace(); } }
效果如下:

文件夾創建效果:

