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

下面是运行结果:

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

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

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

总结

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

相关文章

  • mybatis的动态sql之if test的使用说明

    mybatis的动态sql之if test的使用说明

    这篇文章主要介绍了mybatis的动态sql之if test的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java实现随机抽取奖品工具类

    java实现随机抽取奖品工具类

    这篇文章主要为大家详细介绍了java实现随机抽取奖品工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 详谈Java中Object类中的方法以及finalize函数作用

    详谈Java中Object类中的方法以及finalize函数作用

    下面小编就为大家带来一篇详谈Java中Object类中的方法以及finalize函数作用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • @PathVariable获取路径中带有 / 斜杠的解决方案

    @PathVariable获取路径中带有 / 斜杠的解决方案

    这篇文章主要介绍了@PathVariable获取路径中带有 / 斜杠的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Flowable执行完毕的流程查找方法

    Flowable执行完毕的流程查找方法

    这篇文章主要为大家介绍了Flowable执行完毕的流程查找方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java try()语句实现try-with-resources异常管理机制操作

    Java try()语句实现try-with-resources异常管理机制操作

    这篇文章主要介绍了Java try()语句实现try-with-resources异常管理机制操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring中ApplicationEventPublisher发布订阅模式的实现

    Spring中ApplicationEventPublisher发布订阅模式的实现

    本文主要介绍了Spring中ApplicationEventPublisher发布订阅模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java 动态增加定时任务示例

    java 动态增加定时任务示例

    本篇文章主要介绍了java 动态增加定时任务示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 深入浅析Java 抽象类和接口

    深入浅析Java 抽象类和接口

    这篇文章主要介绍了Java 抽象类和接口的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • nacos如何修改默认的用户名密码

    nacos如何修改默认的用户名密码

    这篇文章主要介绍了nacos如何修改默认的用户名密码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论