java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java通过反射生成数据库实体类

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();
           }
        }  

下面是运行结果:

数据库可以看到有个自行定义,故意加的,如果在类型判断的时候没有对应上的它就直接给个自行定义,让它报异常就可以知道那个字段出问题了,所以最好就加上;

如果没有它可以对应是的类型它是不会把这个字段写入文件中,也不会报异常,就不知道有没有少字段;

注意:不同的数据库获取的类型可能不一样,所以只建议参考

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文