Java如何通過(guò)反射方式生成數(shù)據(jù)庫(kù)實(shí)體類
如何通過(guò)反射生成數(shù)據(jù)庫(kù)實(shí)體類
我這里使用的數(shù)據(jù)庫(kù)是mysql,我需要在java項(xiàng)目中創(chuàng)建數(shù)據(jù)庫(kù)所有表的實(shí)體類;
下面我就說(shuō)一下實(shí)現(xiàn)過(guò)程:
生成數(shù)據(jù)庫(kù)實(shí)體類步驟
1、創(chuàng)建數(shù)據(jù)庫(kù)連接
2、獲取數(shù)據(jù)庫(kù)表
3、構(gòu)建StringBuffer緩存
4、獲取數(shù)據(jù)庫(kù)表中字段名、字段類型、字段注釋
5、寫(xiě)入文件
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ù)庫(kù)并且調(diào)用獲取數(shù)據(jù)庫(kù)方法
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ù)庫(kù)名稱,表名,列屬性,進(jìn)行拼接
public static void getTableNameByCon(Connection con) throws SQLException {
PrintWriter printWriter=null;
try {
DatabaseMetaData meta = con.getMetaData(); //連接數(shù)據(jù)庫(kù)
ResultSet rs = meta.getTables(null, null, null,new String[] { "TABLE" });//獲取數(shù)據(jù)庫(kù)表名
while (rs.next()) {
System.out.println("表名:" + rs.getString(3));
//所需生成實(shí)體類的文件路徑
File tableName=new File("D:/JavaWorkspaces/MyEclipseWeb/2019/src/po/"+rs.getString(3)+".java");
//輸出
Writer writer=new FileWriter(tableName);
printWriter=new PrintWriter(writer);
//寫(xiě)入文件
printWriter.println("package po;\r\n");//所在包
printWriter.println("public class "+rs.getString(3)+"{");
//查詢表sql
String sql="select * from "+rs.getString(3);
//創(chuàng)建一個(gè)語(yǔ)句對(duì)象,用于向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句
Statement stmt=coon.createStatement();
//向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句
ResultSet rs1=stmt.executeQuery(sql);
//檢索此ResultSet對(duì)象的列的數(shù)量、類型和屬性。
ResultSetMetaData rsmd = rs1.getMetaData();
//ResultSet對(duì)象的列數(shù),即表的字段數(shù)
int count=rsmd.getColumnCount();
for (int i = 1; i <= count; i++) {
//獲取ResultSet對(duì)象列名
String name = rsmd.getColumnName(i);
//獲取ResultSet對(duì)象列的類型
String type=rsmd.getColumnTypeName(i);
System.out.println(type);
//首字母小寫(xiě)
name=name.substring(0, 1).toLowerCase() + name.substring(1);
//判斷類型輸出成員變量
if (type.equals("INT")||type.equals("SMALLINT")) {
printWriter.println(" private int" +" "+name+";");
//datatime我也給string類型,mysql對(duì)類型的轉(zhuǎn)換很強(qiáng),可以把string類型轉(zhuǎn)換datatime直接存儲(chǔ)進(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();//刷新流,必寫(xiě)
}
con.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//關(guān)閉流
printWriter.close();
//關(guān)閉數(shù)據(jù)庫(kù)連接
coon.close();
}
} 下面是運(yùn)行結(jié)果:

數(shù)據(jù)庫(kù)可以看到有個(gè)自行定義,故意加的,如果在類型判斷的時(shí)候沒(méi)有對(duì)應(yīng)上的它就直接給個(gè)自行定義,讓它報(bào)異常就可以知道那個(gè)字段出問(wèn)題了,所以最好就加上;
如果沒(méi)有它可以對(duì)應(yīng)是的類型它是不會(huì)把這個(gè)字段寫(xiě)入文件中,也不會(huì)報(bào)異常,就不知道有沒(méi)有少字段;
注意:不同的數(shù)據(jù)庫(kù)獲取的類型可能不一樣,所以只建議參考
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java反射機(jī)制,如何將一個(gè)實(shí)體類所有字段賦值為null
- java 實(shí)現(xiàn)反射 json動(dòng)態(tài)轉(zhuǎn)實(shí)體類--fastjson
- 利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作
- java反射機(jī)制給實(shí)體類相同字段自動(dòng)賦值實(shí)例
- Java 通過(guò)反射給實(shí)體類賦值操作
- java反射遍歷實(shí)體類屬性和類型,并賦值和獲取值的簡(jiǎn)單方法
- Java如何通過(guò)反射取實(shí)體類字段取值
相關(guān)文章
詳解MyBatis增刪改查SQL案例實(shí)戰(zhàn)
本文通過(guò)具體的SQL案例,詳細(xì)介紹了MyBatis的增刪改查操作,通過(guò)靈活的Mapper接口和XML配置,MyBatis能夠?qū)崿F(xiàn)高效的數(shù)據(jù)操作,同時(shí)支持動(dòng)態(tài)SQL和批量操作,極大地提升了開(kāi)發(fā)效率,感興趣的可以了解一下2026-03-03
Springboot編寫(xiě)CRUD時(shí)訪問(wèn)對(duì)應(yīng)數(shù)據(jù)函數(shù)返回null的問(wèn)題及解決方法
我在學(xué)習(xí)springboot,其中在編寫(xiě)CRUD時(shí)發(fā)現(xiàn)訪問(wèn)數(shù)據(jù)的函數(shù)執(zhí)行下去返回值是null但是其它部分正常,這篇文章主要介紹了Springboot在編寫(xiě)CRUD時(shí),訪問(wèn)對(duì)應(yīng)數(shù)據(jù)函數(shù)返回null,需要的朋友可以參考下2024-02-02
Eclipse 開(kāi)發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯(cuò)誤
這篇文章主要介紹了Eclipse 開(kāi)發(fā)java 出現(xiàn)Failed to create the Java Virtual Machine錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04
JAVA中ArrayList與LinkedList二者特點(diǎn)與區(qū)別總結(jié)
ArrayList和LinkedList是Java集合框架中兩種常用的List實(shí)現(xiàn),它們?cè)诓樵冃噬洗嬖陲@著差異,這篇文章主要介紹了JAVA中ArrayList與LinkedList二者特點(diǎn)與區(qū)別的相關(guān)資料,需要的朋友可以參考下2025-07-07
Spring使用Redis限制用戶登錄失敗的次數(shù)及暫時(shí)鎖定用戶登錄權(quán)限功能
這篇文章主要介紹了Spring使用Redis限制用戶登錄失敗的次數(shù)及暫時(shí)鎖定用戶登錄權(quán)限功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
如何解決shardingsphere報(bào)錯(cuò)Missing?the?data?source?name:‘null‘
使用ShardingSphere進(jìn)行分庫(kù)操作時(shí),如果遇到“Missing?the?datasource?name:?‘null’”的錯(cuò)誤,通常是因?yàn)樗僮鞯谋頉](méi)有配置相關(guān)的路由信息,例如,如果在properties中僅配置了health_record和health_task的路由規(guī)則2024-11-11
Java開(kāi)發(fā)中請(qǐng)求頭的概念與寫(xiě)法代碼示例
本文介紹了Java開(kāi)發(fā)中請(qǐng)求頭(RequestHeaders)的用途、組成和常見(jiàn)字段,并提供了使用HttpURLConnection、HttpClient(Java11及以上)和ApacheHttpClient發(fā)送帶有請(qǐng)求頭的HTTP請(qǐng)求的代碼示例,感興趣的朋友跟隨小編一起看看吧2025-12-12
Mybatis-Plus中updateById方法不能更新空值問(wèn)題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

