从mysql数据库生成javabean

面对数百张数据库表,手动创建JavaBean效率低下。通过编写程序实现自动化:使用`show TABLES`获取所有表名,`desc 表名`获取表结构。制定规则将表名转化为类名,列类型转化为Bean属性类型,如:表ecs_account_log转换为类EcsAccountLog,不同列类型对应不同的Java类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

现有数据库有几百张表,需要将表对应的JavaBean写完。由于表数量太多,一个一个写太浪费时间,所以写了个批量导入的程序。

解决思路

1、mysql
使用show TABLES;获取所有的表名
这里写图片描述

使用desc 表名;获取相应表的结构
这里写图片描述

2、生成javabean规则
(1)表名 到 类名:首字母大写,”_”去掉且后面的字母大写
例如:表ecs_account_log对应为EcsAccountLog
(2)列类型 到 Bean属性类型
列包含”int”对应为”Integer”
列包含”char”、”text”对应为”String”
列包含”time”、”date”对应为”Date”
列包含”float”、”decimal”对应为”Double”
列其他的对应为”Unknow” 方便找到漏掉的列类型

代码

package common.database;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MysqlToBeans {
    static String driver = "com.mysql.jdbc.Driver";
    static String url = "jdbc:mysql://localhost:3306/gyxshop?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true";
    static String user = "root";
    static String password = "111111";

    static StringBuffer sb = new StringBuffer();

    private static Statement stmt = null;
    private static Connection conn = null;
    private static OutputStreamWriter osw = null;
    private static BufferedWriter bw = null;
    private static FileOutputStream fos = null;

    private static void writeData(String message, String className) {
        String file = "D:\\javabeans\\" + className + ".java";
        try {
            fos = new FileOutputStream(file);
            osw = new OutputStreamWriter(fos);
            bw = new BufferedWriter(osw);
            bw.write(message);
            bw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    // 根据表名查到字段 名称类型
    public static void getTableDetatils(String tablename, String jbname) {
        ResultSet rs = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
            // 执行sql语句
            stmt = conn.createStatement();
            rs = stmt.executeQuery("desc " + tablename + ";");
            ResultSet rs2 = rs;
            List<HashMap> list = new ArrayList<HashMap>();
            while (rs.next()) {
                HashMap h = new HashMap();
                h.put("Field", rs.getString("Field"));
                h.put("Type", rs.getString("Type"));
                list.add(h);
            }

            for (int x = 0; x < list.size(); x++) {
                String field = (String) list.get(x).get("Field");// 字段名
                String type = (String) list.get(x).get("Type");
                // 表名转换:遇到_a变为A
                String[] ss = field.split("_");
                String jba = "";
                for (int i = 0; i < ss.length; i++) {
                    String s = ss[i];
                    if (i > 0)
                        s = s.substring(0, 1).toUpperCase() + s.substring(1);
                    jba += s;
                }
                // System.out.println(jbname);
                sb.append("\r \t private ");
                if (type.contains("int")) {
                    sb.append("Integer " + jba + ";");
                } else if (type.contains("char") || type.contains("text")) {
                    sb.append("String " + jba + ";");
                } else if (type.contains("time") || type.contains("date")) {
                    sb.append("Date " + jba + ";");
                } else if (type.contains("float") || type.contains("decimal")
                        || type.contains("double")) {
                    sb.append("Double " + jba + ";");
                } else {
                    sb.append("Unknow " + jba + ";");
                }

                // sb.append("\r \t private String " + jba + ";");

                // System.out.println(jba+":  "+type);
            }

            sb.append("\r \t public " + jbname + "() {");
            sb.append("\n \t \t super();\r");
            sb.append("\t}\n");

            for (int x = 0; x < list.size(); x++) {
                String field = (String) list.get(x).get("Field");// 字段名
                String type = (String) list.get(x).get("Type");
                // 表名转换:遇到_a变为A
                String[] ss = field.split("_");
                String jba = "";
                String jba2 = "";
                for (int i = 0; i < ss.length; i++) {
                    String s = ss[i];
                    String s2 = ss[i];
                    s = s.substring(0, 1).toUpperCase() + s.substring(1);
                    if (i > 0)
                        s2 = s2.substring(0, 1).toUpperCase() + s2.substring(1);
                    jba += s;
                    jba2 += s2;
                }

                // sb.append("\r \t private ");
                // sb.append("\n");
                if (type.contains("int")) {
                    sb.append("\r \t public void set" + jba + "(Integer "
                            + jba2 + "){");
                    sb.append("\r \t\t this." + jba2 + "=" + jba2 + ";");
                    sb.append("\r \t }");
                    sb.append("\r \t public Integer get" + jba + "(){");
                    sb.append("\r \t\t return this." + jba2 + ";");
                    sb.append("\r \t }");
                } else if (type.contains("char") || type.contains("text")) {
                    sb.append("\r \t public void set" + jba + "(String " + jba2
                            + "){");
                    sb.append("\r \t\t this." + jba2 + "=" + jba2 + ";");
                    sb.append("\r \t }");
                    sb.append("\r \t public String get" + jba + "(){");
                    sb.append("\r \t\t return this." + jba2 + ";");
                    sb.append("\r \t }");
                } else if (type.contains("time") || type.contains("date")) {
                    sb.append("\r \t public void set" + jba + "(Date " + jba2
                            + "){");
                    sb.append("\r \t\t this." + jba2 + "=" + jba2 + ";");
                    sb.append("\r \t }");
                    sb.append("\r \t public Date get" + jba + "(){");
                    sb.append("\r \t\t return this." + jba2 + ";");
                    sb.append("\r \t }");
                } else if (type.contains("float") || type.contains("decimal")
                        || type.contains("double")) {
                    sb.append("\r \t public void set" + jba + "(Double " + jba2
                            + "){");
                    sb.append("\r \t\t this." + jba2 + "=" + jba2 + ";");
                    sb.append("\r \t }");
                    sb.append("\r \t public Double get" + jba + "(){");
                    sb.append("\r \t\t return this." + jba2 + ";");
                    sb.append("\r \t }");
                } else {
                    sb.append("\r \t public void set" + jba + "(Unknow " + jba2
                            + "){");
                    sb.append("\r \t\t this." + jba2 + "=" + jba2 + ";");
                    sb.append("\r \t }");
                    sb.append("\r \t public Unknow get" + jba + "(){");
                    sb.append("\r \t\t return this." + jba2 + ";");
                    sb.append("\r \t }");
                }

                // sb.append("\r \t private String " + jba + ";");

                // System.out.println(jba+":  "+type);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 1、建立与mysql的链接
        ResultSet rs = null;

        List<String> jbnames = new ArrayList<String>();// java类中的所有表名称
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
            // 执行sql语句
            stmt = conn.createStatement();
            rs = stmt.executeQuery("show tables;"); // 查询所有的表名,保存在结果集中
            // 测试表名
            // System.out.println("-----------------");
            // System.out.println("执行结果如下所示:");
            // System.out.println("-----------------");

            while (rs.next()) {
                sb = new StringBuffer();
                String tablename = rs.getString(1);
                // 表名转换:第一个字母大写,遇到_a变为A
                String[] ss = tablename.split("_");
                String jbname = "";
                for (int i = 0; i < ss.length; i++) {
                    String s = ss[i];
                    s = s.substring(0, 1).toUpperCase() + s.substring(1);
                    jbname += s;
                }
                // System.out.println(jbname);
                sb.append("package model;\n\n");
                sb.append("import java.util.Date;\n\n");

                sb.append("public class " + jbname + "{");

                getTableDetatils(tablename, jbname);

                sb.append("\n}");

                // System.out.println(sb.toString());
                writeData(sb.toString(), jbname);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
一直以来把数据库的表换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个表的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,支持精确指定只生成哪几个表的Bean,也支持模糊查找生成哪几个表的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表。 第10版更新震撼发布,效率大提升,功能更加强大,速度过来围观,这次版本更新如下: 1、新增数据库连接池并可以手动配置,提升数据库连接的使用效率。 2、新增多线程并发处理并可以手动配置,大大提升数据收集和文件生成的效率。 3、增强字符串格式化工具,使得自动拼接字符串的应用场景更多。 4、测试数据库连接、生成Bean文件、精确匹配的更多等按钮都使用了异步线程进行处理, 这样界面不再会被卡住了,点了这些按钮以后还可以同时对界面进行其他操作, 如:移动、最小化、设置参数、使用集成工具等。 5、生成Bean文件按钮添加计时功能,当点击该按钮以后,按钮上的文字会变为读秒计时, 这样就不会以为程序卡死了。 6、更新Oracle的数据库驱动包,提升了数据库连接和查询的速度。 7、更新MySQL数据库驱动包。 8、其他一些小Bug的修改和代码优化调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值