Java如何通過反射方式生成數(shù)據(jù)庫實體類
如何通過反射生成數(shù)據(jù)庫實體類
我這里使用的數(shù)據(jù)庫是mysql,我需要在java項目中創(chuàng)建數(shù)據(jù)庫所有表的實體類;
下面我就說一下實現(xiàn)過程:
生成數(shù)據(jù)庫實體類步驟
1、創(chuàng)建數(shù)據(jù)庫連接
2、獲取數(shù)據(jù)庫表
3、構(gòu)建StringBuffer緩存
4、獲取數(shù)據(jù)庫表中字段名、字段類型、字段注釋
5、寫入文件
6、關(guān)閉連接、輸入流等等
創(chuàng)建連接路徑
private static String username =root private static String url=jdbc\:log4jdbc\:mysql\://localhost\:3306/gjj private static String password=scott private static String driver=net.sf.log4jdbc.DriverSpy public static Connection getConnection(){ Connection con=null; try { Class.forName(driver); con=DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return con; }
連接數(shù)據(jù)庫并且調(diào)用獲取數(shù)據(jù)庫方法
private static Connection coon=null; public static void main(String[] args) { try { //建立數(shù)據(jù)連接 coon=DBUtil.getConnection(); //調(diào)用方法 getTableNameByCon(coon); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
獲取數(shù)據(jù)庫名稱,表名,列屬性,進(jìn)行拼接
public static void getTableNameByCon(Connection con) throws SQLException { PrintWriter printWriter=null; try { DatabaseMetaData meta = con.getMetaData(); //連接數(shù)據(jù)庫 ResultSet rs = meta.getTables(null, null, null,new String[] { "TABLE" });//獲取數(shù)據(jù)庫表名 while (rs.next()) { System.out.println("表名:" + rs.getString(3)); //所需生成實體類的文件路徑 File tableName=new File("D:/JavaWorkspaces/MyEclipseWeb/2019/src/po/"+rs.getString(3)+".java"); //輸出 Writer writer=new FileWriter(tableName); printWriter=new PrintWriter(writer); //寫入文件 printWriter.println("package po;\r\n");//所在包 printWriter.println("public class "+rs.getString(3)+"{"); //查詢表sql String sql="select * from "+rs.getString(3); //創(chuàng)建一個語句對象,用于向數(shù)據(jù)庫發(fā)送SQL語句 Statement stmt=coon.createStatement(); //向數(shù)據(jù)庫發(fā)送SQL語句 ResultSet rs1=stmt.executeQuery(sql); //檢索此ResultSet對象的列的數(shù)量、類型和屬性。 ResultSetMetaData rsmd = rs1.getMetaData(); //ResultSet對象的列數(shù),即表的字段數(shù) int count=rsmd.getColumnCount(); for (int i = 1; i <= count; i++) { //獲取ResultSet對象列名 String name = rsmd.getColumnName(i); //獲取ResultSet對象列的類型 String type=rsmd.getColumnTypeName(i); System.out.println(type); //首字母小寫 name=name.substring(0, 1).toLowerCase() + name.substring(1); //判斷類型輸出成員變量 if (type.equals("INT")||type.equals("SMALLINT")) { printWriter.println(" private int" +" "+name+";"); //datatime我也給string類型,mysql對類型的轉(zhuǎn)換很強(qiáng),可以把string類型轉(zhuǎn)換datatime直接存儲進(jìn)行 }else if (type.equals("CHAR")||type.equals("VARCHAR")||type.equals("DATETIME")) { printWriter.println(" private String" +" "+name+";"); }else if (type.equals("BIT")) { printWriter.println(" private boolean" +" "+name+";"); }else if (type.equals("DOUBLE")) { printWriter.println(" private double" +" "+name+";"); }else if (type.equals("FLOAT")) { printWriter.println(" private float" +" "+name+";"); }else { printWriter.println(" private 自行定義" +" "+name+";"); } } printWriter.println("}"); printWriter.flush();//刷新流,必寫 } con.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //關(guān)閉流 printWriter.close(); //關(guān)閉數(shù)據(jù)庫連接 coon.close(); } }
下面是運行結(jié)果:
數(shù)據(jù)庫可以看到有個自行定義,故意加的,如果在類型判斷的時候沒有對應(yīng)上的它就直接給個自行定義,讓它報異常就可以知道那個字段出問題了,所以最好就加上;
如果沒有它可以對應(yīng)是的類型它是不會把這個字段寫入文件中,也不會報異常,就不知道有沒有少字段;
注意:不同的數(shù)據(jù)庫獲取的類型可能不一樣,所以只建議參考
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合MongoDB實現(xiàn)文件上傳下載刪除
這篇文章主要介紹了SpringBoot整合MongoDB實現(xiàn)文件上傳下載刪除的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-05-05Java Synchronized字節(jié)碼層分析體驗
這篇文章主要介紹了Java Synchronized字節(jié)碼層分析,synchronized關(guān)鍵字解決了多個線程之間的資源同步性,synchronized關(guān)鍵字保證了它修飾的方法或者代碼塊任意時刻只有一個線程在訪問2023-04-04Java8 stream 中利用 groupingBy 進(jìn)行多字段分組求和案例
這篇文章主要介紹了Java8 stream 中利用 groupingBy 進(jìn)行多字段分組求和案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Spring?Boot?配置文件類型properties?格式與yml?格式
這篇文章主要介紹了Spring?Boot?配置文件類型properties?格式與yml?格式,文章圍繞主題展開詳細(xì)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05java WebSocket實現(xiàn)聊天消息推送功能
這篇文章主要為大家詳細(xì)介紹了java WebSocket實現(xiàn)聊天消息推送功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07