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

下面是运行结果:

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

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

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

总结

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

相关文章

  • Java+swing实现抖音上的表白程序详解

    Java+swing实现抖音上的表白程序详解

    这篇文章主要为大家详细介绍了如何利用Java swing实现抖音上的表白程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • mybatis那些约定的配置你真的都了解吗(经验总结)

    mybatis那些约定的配置你真的都了解吗(经验总结)

    mybatsi中Mapper和xml文件之间有很多约定俗称的规则,比如名称匹配,包扫描,别名等,这些规则是什么。如果想更加灵活,该如何配置呢?今天就给大家讲一下如何配置mybatsi的xml文件
    2021-06-06
  • Java单例模式继承覆盖多态原理详解

    Java单例模式继承覆盖多态原理详解

    这篇文章主要介绍了Java单例模式继承覆盖多态原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java8 中使用Stream 让List 转 Map使用问题小结

    Java8 中使用Stream 让List 转 Map使用问题小结

    这篇文章主要介绍了Java8 中使用Stream 让List 转 Map使用总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • 浅谈java String.split丢失结尾空字符串的问题

    浅谈java String.split丢失结尾空字符串的问题

    下面小编就为大家带来一篇浅谈java String.split丢失结尾空字符串的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java使用开源Rxtx实现串口通讯

    Java使用开源Rxtx实现串口通讯

    这篇文章主要为大家详细介绍了Java使用开源Rxtx实现串口通讯,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 一文秒懂Java enum常见的用法讲解

    一文秒懂Java enum常见的用法讲解

    这篇文章主要介绍了一文秒懂Java enum常见的用法讲解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • spring boot整合redis实现shiro的分布式session共享的方法

    spring boot整合redis实现shiro的分布式session共享的方法

    本篇文章主要介绍了spring boot整合redis实现shiro的分布式session共享的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 一文详解如何更改电脑使用的JDK版本

    一文详解如何更改电脑使用的JDK版本

    我们在日常学习或者工作中,难免会遇到需要使用不同的jdk版本进行开发,这篇文章主要给大家介绍了关于如何更改电脑使用的JDK版本的相关资料,需要的朋友可以参考下
    2024-01-01
  • Maven-POM文件及组成部分

    Maven-POM文件及组成部分

    POM是用于描述Maven项目的配置文件,它包含了项目构建、依赖管理和其他相关配置的信息,这篇文章主要介绍了Maven-POM文件,需要的朋友可以参考下
    2023-06-06

最新评论