MYSQL 表转 JavaBean 工具类

import org.apache.commons.lang.StringUtils;

import java.io.BufferedWriter;
import java.io.File;  
import java.io.FileWriter;  
import java.io.IOException;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;

public class DBTableToJavaBeanUtil {
    public static Connection connection;

    //mysql DB连接字符串 
    private static String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&noDatetimeStringSync=true&serverTimezone=UTC";
    
    private static String DB_USER = "root"; //账号
    
    private static String DB_PASSWD = "root"; //密码
    
    //mysql 驱动全限定名称  
    public static String DB_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";

    static {
        try {
            Class.forName(DB_DRIVER_CLASS_NAME);
            if (connection == null || connection.isClosed())
                //获得链接
                connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWD);
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }

    public DBTableToJavaBeanUtil(){

    }  

    /**
     * 表元数据
     * @param table
     * @return
     */
    public static Map<String, String> getDBTableMeta(String table){
        Map<String, String> colAndTypes = new HashMap();
        String sql = "select * from " + table;
        try {  
            PreparedStatement statement = connection.prepareStatement(sql);  
            //表 元数据
            ResultSetMetaData metadata = statement.getMetaData();  
            //表 列
            int len = metadata.getColumnCount();  
            for(int i= 1;i<= len; i++){
                colAndTypes.put(metadata.getColumnName(i), sqlType2JavaType(metadata.getColumnTypeName(i)));
            }
        } catch (SQLException e) {  
            e.printStackTrace();  
        }
        return colAndTypes;
    }  

    /**
     * sql type <=> java type
     * @param sqlType
     * @return
     */
    public static String sqlType2JavaType(String sqlType) {
        switch (sqlType.toLowerCase()){
            case "bit": return "boolean";
            case "tinyint": return "byte";
            case "smallint": return "short";
            case "int": return "int";
            case "bigint": return "long";
            case "float": return "float";
            case "decimal":
            case "numeric":
            case "real":
            case "money":
            case "smallmoney": return "double";
            case "varchar":
            case "char":
            case "nvarchar":
            case "nchar":
            case "text": return "String";
            case "datetime":
            case "date": return "Date";
            case "image": return "Blob";
            case "timestamp": return "Timestamp";
            default: return "String";
        }
    }

    /**
     * table 2 class
     * @param table  表名称
     * @param path 保存类文件路径
     */
    public static String tableToClass(String table, String path, String pack){
        Map<String, String> colAndTypes = getDBTableMeta(table);
        //类字符串
        StringBuilder classStr = new StringBuilder();

        if(colAndTypes.size() == 0) return "";

        if(!isEmpty(pack)){
            classStr.append("package " + pack + ";");
        }

        classStr.append(genImport(colAndTypes.values()));

        //驼峰bean名称
        classStr.append("public class " + dealName(table, 1) + " {\r\n");

        //类字段
        for (Map.Entry<String, String> entry : colAndTypes.entrySet()) {
            classStr.append(genFieldStr(entry.getKey(), entry.getValue()));
        }

        //get,Set
        for (Map.Entry<String, String> entry : colAndTypes.entrySet()) {
            classStr.append(genGetMethodStr(entry.getKey(), entry.getValue()));
            classStr.append(genSetMethodStr(entry.getKey(), entry.getValue()));
        }

        classStr.append("}\r\n");

        //保存
        path = isEmpty(path)?"":path;
        File file = new File(path + dealName(table, 1) + ".java");
        try(BufferedWriter write = new BufferedWriter(new FileWriter(file))) {
            write.write(classStr.toString());
            write.close();  
        } catch (IOException e) {
            e.printStackTrace();  
        }

        return classStr.toString();
    }

    public static String genImport(Collection<String> types){
        StringBuilder sb = new StringBuilder();
        if(types.contains("Date")){
            sb.append("import java.util.Date;\r\n");
        }
        if(types.contains("Blob")){
            sb.append("import java.sql.Blob;\r\n");
        }
        if(types.contains("Timestamp")){
            sb.append("import java.sql.Timestamp;\r\n");
        }
        return sb.toString();
    }

    /**
     * 属性构造
     * @param name
     * @param type
     * @return
     */
    public static String genFieldStr(String name, String type) {
        if(isEmpty(name) || isEmpty(type)) {
            return "";
        }
        return String.format("    private %s %s;\n\r", new String[]{type, dealName(name, 0)});
    }

    public static boolean isEmpty(String str){
        if(str == null || str == "") return true;

        return false;
    }

    /**
     * get method construct
     * @param name
     * @param type
     * @return
     */
    private static String genGetMethodStr(String name, String type) {
        if(isEmpty(name) || isEmpty(type)) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("    public %s get%s(){\n\r", type, dealName(name, 1)));
        sb.append(String.format("        return this.%s;\r\n", dealName(name, 0)));
        sb.append("    }\r\n");
        return sb.toString();
    }

    /**
     * 驼峰名称处理
     * @param name
     * @param type
     * @return
     */
    public static String dealName(String name, int type) {
        String[] names = StringUtils.split(StringUtils.trim(name), "_");
        if(names.length > 0){
            StringBuilder sb= new StringBuilder();
            for (String s : names) {
                sb.append(StringUtils.upperCase(StringUtils.substring(s, 0, 1)));
                sb.append(StringUtils.lowerCase(StringUtils.substring(s, 1)));
            }
            if(type == 0){
                sb.replace(0, 1, StringUtils.lowerCase(sb.substring(0, 1)));
            }
            return sb.toString();
        }
        return "";
    }

    /**
     * set method contruct
     * @param name
     * @param type
     * @return
     */
    public static String genSetMethodStr(String name, String type) {
        if(isEmpty(name) || isEmpty(type)) {
            return "";
        }
        String fieldName = dealName(name, 0);
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("    public void set%s(%s %s){\n\r", dealName(name, 1), type, fieldName));
        sb.append(String.format("        this.%s = %s;\r\n", fieldName, fieldName));
        sb.append("    }\r\n");
        return sb.toString();
    }

    public static void close(){
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
  
    public static void main(String[] args) {  
        System.out.println(DBTableToJavaBeanUtil.tableToClass("book", "d:\\", null));
        close();
    }
      
}  

 

转载于:https://www.cnblogs.com/niejunlei/p/10169654.html

一直以来把数据库表转换成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、付费专栏及课程。

余额充值