MYSQL 表转 JavaBean 工具类

时间:2022-07-24
本文章向大家介绍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) + " {rn");

        //类字段
        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("}rn");

        //保存
        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;rn");
        }
        if(types.contains("Blob")){
            sb.append("import java.sql.Blob;rn");
        }
        if(types.contains("Timestamp")){
            sb.append("import java.sql.Timestamp;rn");
        }
        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;nr", 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(){nr", type, dealName(name, 1)));
        sb.append(String.format("        return this.%s;rn", dealName(name, 0)));
        sb.append("    }rn");
        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){nr", dealName(name, 1), type, fieldName));
        sb.append(String.format("        this.%s = %s;rn", fieldName, fieldName));
        sb.append("    }rn");
        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();
    }
      
}