java 快速生成javaBean类

package com.angen.util;

import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @description: PojoUtil
 * @date: 2022/7/20
 */
public class PojoUtil {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String url = "jdbc:mysql://localhost:3306/test_mybatis?useSSL=false";
        String user = "root";
        String pass = "root";
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn  =  DriverManager.getConnection(url,  user,  pass);
        //java文件输出路径
        String path = "E:\\java重新学习\\mybatis_test\\src\\main\\java\\com\\angen\\pojo";
        GetModel getModel  = new GetModel(conn);
        /*
        使用:
            pojo: 包含属性与getter、setter
            bean: 包含属性与getter、setter与无参构造器,并实现Serializable接口
         */
        //生成pojo到path
        //getModel.generatePojo(path);
        //生成pojo到path,在pojo中添加包信息"package com.ren.model"
        //getModel.generatePojo(path, "com.ren.model");
        //生成Bean到path
        //getModel.generateBean(path);
        //生成Bean到path,在Bean中添加包信息"package com.ren.bean"
        //getModel.generateBean(path, "com.ren.bean");
        getModel.generateBean(path);
    }
}
class GetModel {
    private Connection connection;
    private List<Table> tables;

    public GetModel() {
    }

    public GetModel(Connection connection) throws SQLException {
        this.connection = connection;
        this.tables = getTableList();
    }

    public Connection getConnection() {
        return connection;
    }

    public void setConnection(Connection connection) {
        this.connection = connection;
    }

    /**
     * 获取数据库中所有表信息封装到List<Table> tables
     * @return List<Table> 包含数据库中所有的表
     * @throws SQLException
     */
    private List<Table> getTableList() throws SQLException {
        List<Table> tableList = new ArrayList<>();
        DatabaseMetaData dbMetaData = connection.getMetaData();
        ResultSet rs = dbMetaData.getTables(null, null, null, new String[] { "TABLE" });
        while (rs.next()) {
            Table table = new Table();
            String tableName = rs.getString("TABLE_NAME");
            table.setTableName(tableName);
            table.setDatabaseName(rs.getString("TABLE_CAT"));
            table.setColumns(getTableColumnList(tableName));
            tableList.add(table);
        }
        return tableList;
    }

    /**
     * 获取某表的所有column信息封装到List<Column> columnList中
     */
    private List<Column> getTableColumnList(String tableName) throws SQLException {
        List<Column> columnList = new ArrayList<>();
        String  sql  =  "select  *  from " + tableName;
        PreparedStatement  stmt;
        try  {
            stmt  =  connection.prepareStatement(sql);
            ResultSet  rs  =  stmt.executeQuery(sql);
            ResultSetMetaData  data  =  rs.getMetaData();
            for  (int  i  =  1; i  <=  data.getColumnCount(); i++)  {
                Column column = new Column();
                //  获得所有列的数目及实际列数
                int  columnCount  =  data.getColumnCount();
                //  获得指定列的列名
                String  columnName  =  data.getColumnName(i);
                //  获得指定列的数据类型名
                String  columnTypeName  =  data.getColumnTypeName(i);
                //  对应数据类型的类
                String  columnClassName  =  data.getColumnClassName(i);
                //  在数据库中类型的最大字符个数
                int  columnDisplaySize  =  data.getColumnDisplaySize(i);
                //  某列类型的精确度(类型的长度)
                int  precision  =  data.getPrecision(i);
                //  小数点后的位数
                int  scale  =  data.getScale(i);
                //  是否自动递增
                Boolean  isAutoInctement  =  data.isAutoIncrement(i);
                //  是否为空
                int  isNullable  =  data.isNullable(i);
                column.setColumnName(columnName);
                column.setColumnTypeName(columnTypeName);
                column.setColumnClassName(columnClassName);
                column.setTableName(tableName);
                column.setColumnDisplaySize(columnDisplaySize);
                column.setPrecision(precision);
                column.setScale(scale);
                column.setAutoInctement(isAutoInctement);
                columnList.add(column);
            }
        }
        catch  (SQLException  e)  {
            e.printStackTrace();
        }
        return columnList;
    }

    /**
     * 为table创建pojo
     * @param table 表
     * @param path 输出路径
     */
    private static void writeFilePojo(Table table, String path, String packagePath) {
        String fileName = path + "\\" + upperCase(table.getTableName()) + ".java";
        try {
            FileWriter writer = new FileWriter(fileName);
            StringBuilder  getterSetter = new StringBuilder();
            //需要添加包路径
            if (!packagePath.equals("0")) {
                writer.write("package " + packagePath + ";\n\n");
            }
            writer.write("public class " + upperCase(table.getTableName()) + " {\n");
            for (Column column : table.getColumns()) {
                writer.write("    private " + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ";\n");
                //getter()
                getterSetter.append("\n    public " + changeType(column.getColumnTypeName()) + " get" + upperCase(column.getColumnName()) + "() {\n");
                getterSetter.append("        return " + column.getColumnName() + ";\n");
                getterSetter.append("    }\n\n");
                //setter()
                getterSetter.append("    public void set" + upperCase(column.getColumnName()) + "(" + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ") {\n");
                getterSetter.append("        this." + column.getColumnName() + " = " + column.getColumnName() + ";\n");
                getterSetter.append("    }\n");
            }
            writer.write(getterSetter.toString());
            writer.write("}");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 为table创建Bean
     * @param table 表
     * @param path 输出路径
     */
    private static void writeFileBean(Table table, String path, String packagePath) {
        String fileName = path + "\\" + upperCase(table.getTableName()) + ".java";
        try {
            FileWriter writer = new FileWriter(fileName);
            StringBuilder  getterSetter = new StringBuilder();
            //需要添加包路径
            if (!packagePath.equals("0")) {
                writer.write("package " + packagePath + ";\n\n");
            }
            writer.write("import java.io.Serializable;\n\n");
            writer.write("public class " + upperCase(table.getTableName()) + " implements Serializable {\n");
            for (Column column : table.getColumns()) {
                writer.write("    private " + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ";\n");
                //getter()
                getterSetter.append("\n    public " + changeType(column.getColumnTypeName()) + " get" + upperCase(column.getColumnName()) + "() {\n");
                getterSetter.append("        return " + column.getColumnName() + ";\n");
                getterSetter.append("    }\n\n");
                //setter()
                getterSetter.append("    public void set" + upperCase(column.getColumnName()) + "(" + changeType(column.getColumnTypeName()) + " " + column.getColumnName() + ") {\n");
                getterSetter.append("        this." + column.getColumnName() + " = " + column.getColumnName() + ";\n");
                getterSetter.append("    }\n");
            }
            //无参构造器
            writer.write("\n    public " + upperCase(table.getTableName()) + "() { }\n");
            writer.write(getterSetter.toString());
            writer.write("}");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将 str 首字母大写
     * @param str
     * @return
     */
    private static String upperCase(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

    /**
     * 将数据库类型转换为java中合适的类型
     * @param typeName
     * @return
     */
    private static String changeType(String typeName) {
        switch (typeName) {
            case "VARCHAR":
            case "CHAR":
            case "TEXT":
            case "TINYTEXT":
            case "MEDIUMTEXT":
            case "LONGTEXT":
            case "ENUM":
            case "SET":
                return "String";
            case "BLOB":
            case "BINARY":
            case "VARBINARY":
            case "TINYBLOB":
            case "MEDIUMBLOB":
            case "LONGBLOB":
                return "byte[]";
            case "INTEGER":
            case "ID":
            case "BIGINT":
                return "Long";
            case "TINYINT":
            case "SMALLINT":
            case "MEDIUMINT":
            case "INT":
                return "Integer";
            case "DECIMAL":
                return "BigDecimal";
            case "BIT":
                return "Boolean";
            case "FLOAT":
                return "Float";
            case "DOUBLE":
                return "Double";
            case "DATE":
            case "YEAR":
                return "Date";
            case "TIME":
                return "Time";
        }
        return "String";
    }

    /**
     * 根据tables生成pojo到path
     * @param path 输出路径
     */
    public void generatePojo(String path) {
        for (Table table : tables) {
            writeFilePojo(table, path, "0");
            System.out.println("已创建Pojo: " + path + "\\" + upperCase(table.getTableName()) + ".java");
        }
    }

    /**
     * 根据tables生成Bean到path
     * @param path 输出路径
     */
    public void generateBean(String path) {
        for (Table table : tables) {
            writeFileBean(table, path, "0");
            System.out.println("已创建Bean: " + path + "\\" + upperCase(table.getTableName()) + ".java");
        }
    }

    /**
     * 根据tables生成pojo到path
     * @param path 输出路径
     * @param packagePath 添加包路径
     */
    public void generatePojo(String path, String packagePath) {
        for (Table table : tables) {
            writeFilePojo(table, path, packagePath);
            System.out.println("已创建Pojo: " + path + "\\" + upperCase(table.getTableName()) + ".java    包名:" + packagePath);
        }
    }

    /**
     * 根据tables生成Bean到path
     * @param path 输出路径
     * @param packagePath 添加包路径
     */
    public void generateBean(String path, String packagePath) {
        for (Table table : tables) {
            writeFileBean(table, path, packagePath);
            System.out.println("已创建Bean: " + path + "\\" + upperCase(table.getTableName()) + ".java    包名:" + packagePath);
        }
    }
}
class Table {
    private String tableName;
    private String databaseName;
    private List<Column> columns;

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getDatabaseName() {
        return databaseName;
    }

    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

    public List<Column> getColumns() {
        return columns;
    }

    public void setColumns(List<Column> columns) {
        this.columns = columns;
    }

    @Override
    public String toString() {
        return "Table{" +
                "\n     tableName='" + tableName + '\'' +
                "\n     databaseName='" + databaseName + '\'' +
                "\n     columns=" + columns +
                '}';
    }
}
class Column {
    //  列名
    private String columnName;
    // 列的数据类型名
    private String columnTypeName;
    //  对应数据类型的类
    private String columnClassName;
    //  在数据库中类型的最大字符个数
    private int columnDisplaySize;
    //  某列类型的精确度(类型的长度)
    private int  precision;
    //  小数点后的位数
    private int  scale;
    //  获取某列对应的表名
    private String  tableName;
    //  是否自动递增
    private Boolean  isAutoInctement;

    public String getColumnName() {
        return columnName;
    }

    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    public String getColumnTypeName() {
        return columnTypeName;
    }

    public void setColumnTypeName(String columnTypeName) {
        this.columnTypeName = columnTypeName;
    }

    public String getColumnClassName() {
        return columnClassName;
    }

    public void setColumnClassName(String columnClassName) {
        this.columnClassName = columnClassName;
    }

    public int getColumnDisplaySize() {
        return columnDisplaySize;
    }

    public void setColumnDisplaySize(int columnDisplaySize) {
        this.columnDisplaySize = columnDisplaySize;
    }

    public int getPrecision() {
        return precision;
    }

    public void setPrecision(int precision) {
        this.precision = precision;
    }

    public int getScale() {
        return scale;
    }

    public void setScale(int scale) {
        this.scale = scale;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public Boolean getAutoInctement() {
        return isAutoInctement;
    }

    public void setAutoInctement(Boolean autoInctement) {
        isAutoInctement = autoInctement;
    }

    @Override
    public String toString() {
        return "\n      Column{" +
                "columnName='" + columnName + '\'' +
                ", columnTypeName='" + columnTypeName + '\'' +
                ", columnClassName='" + columnClassName + '\'' +
                ", columnDisplaySize=" + columnDisplaySize +
                ", precision=" + precision +
                ", scale=" + scale +
                ", tableName='" + tableName + '\'' +
                ", isAutoInctement=" + isAutoInctement +
                '}';
    }
}

博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库的表转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个表的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,支持精确指定只生成哪几个表的Bean,也支持模糊查找生成哪几个表的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表! 第12版更新震撼发布,此次版本更新如下: 1、新增参数配置管理功能,可以为不同的项目配置不同的参数。 2、新增快速新增参数配置功能,快速为项目添加参数配置。 3、新增选择实体注解功能,生成实体的时候自动为实体添加额外的注解。 4、弹出对话框界面大小调整。 5、新增数据源添加默认设置。 6、精确匹配在点更多时,已选中的表会在弹出的列表中被勾选中。 7、修复模糊匹配找不到表的Bug。 8、其他一些小Bug的修改和代码优化调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值