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

           下面是运行结果:

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java反射机制来动态生成实体类的代码。下面是一个简单的示例代码,使用JDBC连接数据库,并根据查询结果生成对应的实体类: ```java import java.sql.*; import java.util.ArrayList; import java.util.List; public class EntityGenerator { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; String tableName = "mytable"; try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); List<String> fieldDefinitions = new ArrayList<>(); for (int i = 1; i <= columnCount; i++) { String columnName = metaData.getColumnName(i); String columnType = metaData.getColumnTypeName(i); fieldDefinitions.add("private " + columnType + " " + columnName + ";"); } String className = tableName.substring(0, 1).toUpperCase() + tableName.substring(1); StringBuilder classDefinition = new StringBuilder(); classDefinition.append("public class ").append(className).append(" {\n"); for (String fieldDefinition : fieldDefinitions) { classDefinition.append("\t").append(fieldDefinition).append("\n"); } classDefinition.append("}"); System.out.println(classDefinition.toString()); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的示例,你需要修改`url`、`username`、`password`和`tableName`为你自己的数据库连接信息和名。运行该程序后,它会输出生成实体类的代码。 注意:该示例只是生成了字段的定义,你可能还需要根据需要添加相应的getter和setter方法等。另外,该示例使用的是MySQL数据库,你需要根据自己使用数据库型来修改连接驱动和SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值