有時候一個項目有幾十個表的時候,我們會花費很多時間在敲實體類的,寫一個實體類的生成器後只需要運行一下就可以了。並且這個生成器的原理也很簡單。首先從數據庫中獲取它所有的表,並對每一個表進行遍歷,根據相應的類型導入相應的包,使用stringbuffer進行數據的拼接,利用io寫入文件就可以實現生成了。話不多說了,直接上代碼:
package com.ljq;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.mysql.jdbc.ResultSet;
public class AutoModel {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root", "123456");
PreparedStatement ps=conn.prepareStatement("SELECT TABLE_NAME from information_schema.`TABLES` where TABLE_SCHEMA = 'student';");
ResultSet rs=(ResultSet) ps.executeQuery();
while(rs.next()) {
StringBuffer sb = new StringBuffer();
StringBuffer sb1=new StringBuffer();
sb.append("package com.ljq\r\n");
sb.append("public class"+rs.getString(1)+"{\r\n");
ps=conn.prepareStatement("desc "+rs.getString(1));
ResultSet rs1=(ResultSet) ps.executeQuery();
boolean dateFlag=true;
while(rs1.next()) {
String name=rs1.getString(1);
String type=rs1.getString(2);
if(type.contains("int")||type.contains("bigInt")) {
type="int";
}else if(type.contains("varchar")||type.contains("text")) {
type="String";
}else if(type.contains("date")||type.contains("datetime")) {
//標識用以只增加一次
if(dateFlag) {
int a=sb.indexOf("\n");
sb.insert(a, "import java.util.Date");
dateFlag=false;
}
type="Date";
}
sb.append("private "+type+" "+name+";\r\n");
sb1.append("\r\npublic void set"+name.replace(name.substring(0, 1), name.substring(0,1).toUpperCase())+
"("+type+" "+name+"){\r\n");
sb1.append("this."+name+"="+name+";\r\n}\r\n");
sb1.append("public "+type+" get"+name.replace(name.substring(0, 1), name.substring(0,1).toUpperCase())
+"(){\r\n"+"return "+name+";\r\n}");
}
sb1.append("\r\n}");
String model=sb.toString()+sb1.toString();
System.out.println(model);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
以上不是特別的完善,剩餘的以此類推。比較值得注意的是:
SELECT TABLE_NAME from information_schema.`TABLES` where TABLE_SCHEMA = 'student';
這一句是把student數據庫中的所有表名查出。
desc rs.getString(1)
這一句是把相應表的細節查出,然後進行類型的匹配。
在此,我比沒有把得到的數據存到相應的文件中。
以下是代碼的輸出: