我这里使用的数据库是mysql,我需要在java项目中创建数据库所有表的实体类;下面我就说一下实现过程:
生成数据库实体类步骤:
* 1、创建数据库连接
* 2、获取数据库表
* 3、构建StringBuffer缓存
* 4、获取数据库表中字段名、字段类型、字段注释
* 5、写入文件
* 6、关闭连接、输入流等等
创建连接路径:
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;
}
连接数据库并且调用获取数据库方法:
private static Connection coon=null;
public static void main(String[] args) {
try {//建立数据连接
coon=DBUtil.getConnection();//调用方法
getTableNameByCon(coon);
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
获取数据库名称,表名,列属性,进行拼接;
public static void getTableNameByCon(Connection con) throws SQLException {
PrintWriter printWriter=null;
try {
DatabaseMetaData meta = con.getMetaData(); //连接数据库
ResultSet rs = meta.getTables(null, null, null,new String[] { "TABLE" });//获取数据库表名
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);
//创建一个语句对象,用于向数据库发送SQL语句
Statement stmt=coon.createStatement();//向数据库发送SQL语句
ResultSet rs1=stmt.executeQuery(sql);
//检索此ResultSet对象的列的数量、类型和属性。
ResultSetMetaData rsmd = rs1.getMetaData();
//ResultSet对象的列数,即表的字段数
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对类型的转换很强,可以把string类型转换datatime直接存储进行
}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{//关闭流
printWriter.close();//关闭数据库连接
coon.close();
}
}
下面是运行结果:
数据库可以看到有个自行定义,故意加的,如果在类型判断的时候没有对应上的它就直接给个自行定义,让它报异常就可以知道那个字段出问题了,所以最好就加上;如果没有它可以对应是的类型它是不会把这个字段写入文件中,也不会报异常,就不知道有没有少字段;
注意:不同的数据库获取的类型可能不一样,所以只建议参考;