Java如何通过反射方式生成数据库实体类
作者:DegenerateAng
这篇文章主要介绍了Java如何通过反射方式生成数据库实体类问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
如何通过反射生成数据库实体类
我这里使用的数据库是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(); } }
下面是运行结果:
数据库可以看到有个自行定义,故意加的,如果在类型判断的时候没有对应上的它就直接给个自行定义,让它报异常就可以知道那个字段出问题了,所以最好就加上;
如果没有它可以对应是的类型它是不会把这个字段写入文件中,也不会报异常,就不知道有没有少字段;
注意:不同的数据库获取的类型可能不一样,所以只建议参考
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。