Java如何通过反射方式生成数据库实体类

 更新时间:2023年12月07日 17:07:06   作者: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();
           }
        }  

下面是运行结果:

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

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

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

总结

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

相关文章

  • SpringBoot整合MongoDB实现文件上传下载删除

    SpringBoot整合MongoDB实现文件上传下载删除

    这篇文章主要介绍了SpringBoot整合MongoDB实现文件上传下载删除的方法,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-05-05
  • Java多线程中的Phaser详解

    Java多线程中的Phaser详解

    这篇文章主要介绍了Java多线程中的Phaser详解,Pahser是一个可以重复使用的同步屏障,Phaser是按照不同阶段执行线程的,它本身维护着一个叫 phase 的成员变量代表当前执行的阶段,需要的朋友可以参考下
    2023-11-11
  • Java Synchronized字节码层分析体验

    Java Synchronized字节码层分析体验

    这篇文章主要介绍了Java Synchronized字节码层分析,synchronized关键字解决了多个线程之间的资源同步性,synchronized关键字保证了它修饰的方法或者代码块任意时刻只有一个线程在访问
    2023-04-04
  • Java8 stream 中利用 groupingBy 进行多字段分组求和案例

    Java8 stream 中利用 groupingBy 进行多字段分组求和案例

    这篇文章主要介绍了Java8 stream 中利用 groupingBy 进行多字段分组求和案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java获取链接上的参数三种方法举例

    Java获取链接上的参数三种方法举例

    在Java中,我们经常需要从URL链接中获取参数,下面这篇文章主要给大家介绍了关于Java如何获取链接上参数的三种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • Spring Boot 配置文件类型properties 格式与yml 格式

    Spring Boot 配置文件类型properties 格式与yml 格式

    这篇文章主要介绍了Spring Boot 配置文件类型properties 格式与yml 格式,文章围绕主题展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 教你如何轻松学会Java快慢指针法

    教你如何轻松学会Java快慢指针法

    要想把搬砖的效率提高,我们肯定是逃不掉数据结构和算法知识的,这不,可爱的小编今天就和大家一起学习来了,今天给大家分享的是快慢指针,那啥是快慢指针呢,文中有非常详细的解释,需要的朋友可以参考下
    2021-06-06
  •  java中Thread.sleep()的具体使用

     java中Thread.sleep()的具体使用

    本文主要介绍了 java中Thread.sleep()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Web容器启动过程中如何执行Java类

    Web容器启动过程中如何执行Java类

    这篇文章主要介绍了Web容器启动过程中如何执行Java类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java WebSocket实现聊天消息推送功能

    java WebSocket实现聊天消息推送功能

    这篇文章主要为大家详细介绍了java WebSocket实现聊天消息推送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论