java 实体类生成代码

摘要:

根据数据库表自己动生成实体类代码,因为之前一直用的破解的IDEA,现在换成社区版的,没这个功能。
package com.idowcn.superstore.util;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

/**
 *
 */
public class DBTools {

    //数据库连接
    private static final String url = "jdbc:mysql://127.0.0.1:3306/dev_test?useUnicode=true&characterEncoding=utf8&serverTimezone=CTT";
    private static final String name = "root";
    private static final String pass = "test";
    private static final String driver = "com.mysql.cj.jdbc.Driver";

    private static final String dbName = "dev_test";
    private static final String author = "yihuas@163.com";
    private static final String sRootPath = System.getProperty("user.dir") + "\\";
    private static final String packagename = "package com.idowcn.test"; //工程所在包名称

    private Connection conn;
    private List<String> tables = new ArrayList<String>();

    private boolean bCancel = false;
    private boolean bWhole = false;

    public void addTableName(String sTableName) {
        tables.add(sTableName);
    }

    //从数据库返回所有表名称
    public void addTableName() {
        try {
            DatabaseMetaData dbMetaData = conn.getMetaData();
            ResultSet rs = dbMetaData.getTables(null, null, null, new String[]{"TABLE"});
            while (rs.next()) {// ///TABLE_TYPE/REMARKS
                if (rs.getString("TABLE_CAT").compareToIgnoreCase(dbName) == 0) {
                    // System.out.println("表名:" + rs.getString("TABLE_NAME"));
                    addTableName(rs.getString("TABLE_NAME"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //获取conn
    public void InitConnection() throws Exception {
        try {
            bWhole = false;
            bCancel = false;
            Class.forName(driver).newInstance();
            conn = java.sql.DriverManager.getConnection(url, name, pass);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    //释放conn
    public void finalize() {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void GenerateEntity() {
        for (String tableName : tables) {
            if (bCancel) break;
            String sPackage = packagename + ".entity.master";
            String sql = "select * from " + tableName;
            String sClassName = convertTableName(tableName) + "Entity";
            String sHashCode = "";
            StringBuffer sEquals = new StringBuffer();
            StringBuffer sEqualsObject = new StringBuffer();
            StringBuffer fileHeader = new StringBuffer();
            StringBuffer fileContent = new StringBuffer();
            try {
                fileHeader.append(sPackage + ";\r\n");
                fileHeader.append("\r\n");
                fileHeader.append("import javax.persistence.*;\r\n");
                fileHeader.append("import java.util.Objects;\r\n");
                fileHeader.append("import java.util.Date;\r\n");
                fileHeader.append("import java.sql.Blob;\r\n");
                fileHeader.append("\r\n");

                //注释部分
                fileHeader.append("   /**\r\n");
                fileHeader.append("    * " + tableName.toUpperCase() + " Entity\r\n");
                fileHeader.append("    * " + new Date() + "  " + author + "\r\n");
                fileHeader.append("    */ \r\n");

                fileHeader.append("@Entity\r\n");
                fileHeader.append("@Table(name = \"" + tableName + "\", schema = \"" + dbName + "\")\r\n");
                fileHeader.append("public class " + sClassName + " {\r\n");

                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();
                ResultSetMetaData meta = rs.getMetaData();
                int columeCount = meta.getColumnCount();
                // System.out.println("表 "+ tableName + "共有 "+columeCount+" 个字段。字段信息如下:");
                for (int i = 1; i < columeCount + 1; i++) {

                    String sNullable = "false";
                    String sLength = "";
                    String sRawFieldName = meta.getColumnName(i);
                    String sFieldName = convertFieldName(sRawFieldName, false);
                    String sFieldTypeName = sqlType2JavaType(meta.getColumnTypeName(i));
                    String sGSFieldName = convertFieldName(sRawFieldName, true);
                    fileHeader.append("\tprivate " + sFieldTypeName + " " + sFieldName + ";\r\n");

                    // System.out.println(sRawFieldName);
                    // System.out.println(meta.getColumnType(i));

                    if (meta.isAutoIncrement(i)) {
                        fileContent.append("\t@Id\r\n");
                        fileContent.append("\t@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n");
                    } else {
                        fileContent.append("\t@Basic\r\n");
                    }

                    if (meta.isNullable(i) == 1) sNullable = "true";
                    if (meta.getColumnType(i) == -1) sLength = " , length = -1 ";
                    if (meta.getColumnType(i) == 12) sLength = " , length = " + meta.getPrecision(i);


                    fileContent.append("\t@Column(name = \"" + sRawFieldName + "\", nullable = " + sNullable + sLength + " )\r\n");

                    fileContent.append("\tpublic " + sFieldTypeName + " get" + sGSFieldName + "(){\r\n");
                    fileContent.append("\t\treturn " + sFieldName + ";\r\n");
                    fileContent.append("\t}\r\n");

                    fileContent.append("\tpublic void set" + sGSFieldName + "(" + sFieldTypeName + " " + sFieldName + "){\r\n");
                    fileContent.append("\t\tthis." + sFieldName + "=" + sFieldName + ";\r\n");
                    fileContent.append("\t}\r\n");
                    fileContent.append("\r\n");
                    if (sqlType2equals(meta.getColumnTypeName(i))) {
                        sEqualsObject.append("\t\t\t\tObjects.equals(" + sFieldName + ", that." + sFieldName + ") &&\r\n");
                    } else {
                        sEquals.append("\t\t\t\t" + sFieldName + " == that." + sFieldName + " &&\r\n");
                    }
                    sHashCode += "," + sFieldName;
                }

                fileHeader.append("\r\n");
                fileHeader.append(fileContent);
                fileHeader.append("\r\n");

                fileHeader.append("\t@Override\r\n");
                fileHeader.append("\tpublic boolean equals(Object o) {\r\n");
                fileHeader.append("\tif (this == o) return true;\r\n");
                fileHeader.append("\t\tif (o == null || getClass() != o.getClass()) return false;\r\n");
                fileHeader.append("\t\t" + sClassName + " that = (" + sClassName + ") o;\r\n");
                fileHeader.append("\t\treturn \r\n");
                if (sEqualsObject.length() == 0) {
                    sEquals.delete(sEquals.length() - 5, sEquals.length());
                    fileHeader.append(sEquals + ";\r\n");
                }
                if (sEqualsObject.length() > 0) {
                    fileHeader.append(sEquals);
                    sEqualsObject.delete(sEqualsObject.length() - 5, sEqualsObject.length());
                    fileHeader.append(sEqualsObject + ";\r\n");
                }
                fileHeader.append("\t}\r\n");

                fileHeader.append("\t@Override\r\n");
                fileHeader.append("\tpublic int hashCode() {\r\n");
                fileHeader.append("\t\treturn Objects.hash(" + sHashCode.substring(1) + ");\r\n");
                fileHeader.append("\t}\r\n");
                fileHeader.append("}\r\n");
                // System.out.println(fileHeader);

                BuildFile(sPackage, sClassName, fileHeader);

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

    }

    public void GenerateDto() {
        for (String tableName : tables) {
            if (bCancel) break;
            String sPackage = packagename + ".dto.master";
            String sClassName = convertTableName(tableName) + "Dto";
            String sql = "select * from " + tableName;
            StringBuffer fileHeader = new StringBuffer();
            StringBuffer fileContent = new StringBuffer();
            try {
                fileHeader.append(sPackage + ";\r\n");
                fileHeader.append("\r\n");
                fileHeader.append("import java.io.Serializable;\r\n");
                fileHeader.append("import java.util.Date;\r\n");
                fileHeader.append("import java.sql.Blob;\r\n");
                fileHeader.append("\r\n");

                //注释部分
                fileHeader.append("   /**\r\n");
                fileHeader.append("    * " + tableName.toUpperCase() + " DTO\r\n");
                fileHeader.append("    * " + new Date() + "  " + author + "\r\n");
                fileHeader.append("    */ \r\n");

                fileHeader.append("public class " + sClassName + " implements Serializable {\r\n");

                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();
                ResultSetMetaData meta = rs.getMetaData();
                int columeCount = meta.getColumnCount();
                // System.out.println("表 "+ tableName + "共有 "+columeCount+" 个字段。字段信息如下:");
                for (int i = 1; i < columeCount + 1; i++) {
                    String sRawFieldName = meta.getColumnName(i);
                    String sFieldName = convertFieldName(sRawFieldName, false);
                    String sFieldTypeName = sqlType2JavaType(meta.getColumnTypeName(i));
                    String sGSFieldName = convertFieldName(sRawFieldName, true);
                    fileHeader.append("\tprivate " + sFieldTypeName + " " + sFieldName + ";\r\n");

                    fileContent.append("\tpublic " + sFieldTypeName + " get" + sGSFieldName + "(){\r\n");
                    fileContent.append("\t\treturn " + sFieldName + ";\r\n");
                    fileContent.append("\t}\r\n");

                    fileContent.append("\tpublic void set" + sGSFieldName + "(" + sFieldTypeName + " " + sFieldName + "){\r\n");
                    fileContent.append("\t\tthis." + sFieldName + "=" + sFieldName + ";\r\n");
                    fileContent.append("\t}\r\n");

                }
                fileHeader.append("\r\n");
                fileHeader.append(fileContent);
                fileHeader.append("}\r\n");
                // System.out.println(fileHeader);

                BuildFile(sPackage, sClassName, fileHeader);

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

    }

    public void GenerateDao() {
        for (String tableName : tables) {
            if (bCancel) break;
            String sPackage = packagename + ".repository.master";
            String sClassName = convertTableName(tableName) + "Dao";
            String sEntityName = convertTableName(tableName) + "Entity";
            StringBuffer fileHeader = new StringBuffer();
            try {
                fileHeader.append(sPackage + ";\r\n");
                fileHeader.append("\r\n");
                fileHeader.append("import org.springframework.data.domain.Page;\r\n");
                fileHeader.append("import org.springframework.data.domain.Pageable;\r\n");
                fileHeader.append("import org.springframework.data.jpa.repository.JpaRepository;\r\n");
                fileHeader.append("import org.springframework.data.jpa.repository.Modifying;\r\n");
                fileHeader.append("import org.springframework.data.jpa.repository.Query;\r\n");
                fileHeader.append("import org.springframework.stereotype.Repository;\r\n");
                fileHeader.append("import " + packagename.substring(8) + ".entity.master." + sEntityName + ";\r\n");
                fileHeader.append("\r\n");
                fileHeader.append("import java.util.List;");
                fileHeader.append("\r\n");
                //注释部分
                fileHeader.append("   /**\r\n");
                fileHeader.append("    * " + tableName.toUpperCase() + " DAO\r\n");
                fileHeader.append("    * " + new Date() + "  " + author + "\r\n");
                fileHeader.append("    */ \r\n");

                fileHeader.append("@Repository\r\n");
                fileHeader.append("public interface " + sClassName + " extends JpaRepository<" + sEntityName + ",Integer> {\r\n");


                fileHeader.append("\r\n");
                fileHeader.append("}\r\n");
                // System.out.println(fileHeader);

                BuildFile(sPackage, sClassName, fileHeader);

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

    }

    private void BuildFile(String sPackageName, String sFileName, StringBuffer fileContent) {
        try {

            String sLongFileName = sRootPath + "src\\main\\java\\" + sPackageName.replace(".", "\\").substring(8) + "\\" + sFileName + ".java";
            File file = new File(sLongFileName);
            if (!bWhole && file.exists()) {
                System.out.print("file " + sFileName + ".java already exist,Enter (a all overwrite, y overwrite , n skip or q quit):");
                Scanner sc = new Scanner(System.in);
                String x = sc.nextLine();

                if (x.trim().compareTo("q") == 0) {
                    bCancel = true;
                    return;
                }

                if (x.trim().compareTo("a") == 0) {
                    bWhole = true;
                } else if (x.trim().compareTo("y") != 0) return;
            }

            System.out.println(sLongFileName);
            FileWriter fw = new FileWriter(sLongFileName);
            PrintWriter pw = new PrintWriter(fw);
            pw.println(fileContent);
            pw.flush();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 功能:转换表名称为类名称,去掉前缀
     *
     * @param str
     * @return
     */
    private String convertTableName(String str) {
        String sTableName = "";
        String[] arr = str.split("_");
        for (int i = 1; i < arr.length; i++) {
            sTableName += FirstCase(arr[i]);
        }
        return sTableName;
    }


    /**
     * 转换字段将字段以“_”进行切分跳过第一个元素
     *  bFirstCase 要求第一个单词首字母大写 通常是用于 get set 方法
     * @param str
     * @return
     */
    private String convertFieldName(String str, boolean bFirstCase) {
        String[] arr = str.split("_");
        String sFieldName = arr[0];
        if (bFirstCase) {
            if (sFieldName.compareToIgnoreCase("f") != 0)  //外键 f 为首单词时不大写
                sFieldName = FirstCase(sFieldName);
        }
        for (int i = 1; i < arr.length; i++) {
            sFieldName += FirstCase(arr[i]);
        }
        return sFieldName;
    }

    /**
     * 首字母大写转换
     *
     * @param str
     * @return
     */
    private String FirstCase(String str) {
        char[] ch = str.toCharArray();
        if (ch[0] >= 'a' && ch[0] <= 'z') {
            ch[0] = (char) (ch[0] - 32);
        }
        return new String(ch);
    }

    /**
     * 功能:获得列的数据类型
     *
     * @param sqlType
     * @return
     */
    private String sqlType2JavaType(String sqlType) {
        if (sqlType.equalsIgnoreCase("bit")) {
            return "boolean";
        } else if (sqlType.equalsIgnoreCase("tinyint")) {
            return "byte";
        } else if (sqlType.equalsIgnoreCase("smallint")) {
            return "short";
        } else if (sqlType.equalsIgnoreCase("int")|| sqlType.equalsIgnoreCase("INT UNSIGNED")) {
            return "int";
        } else if (sqlType.equalsIgnoreCase("bigint")) {
            return "long";
        } else if (sqlType.equalsIgnoreCase("float")) {
            return "float";
        } else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")
                || sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")
                || sqlType.equalsIgnoreCase("smallmoney")|| sqlType.equalsIgnoreCase("DECIMAL UNSIGNED")) {
            return "double";
        } else if (sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")
                || sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar")
                || sqlType.equalsIgnoreCase("text")|| sqlType.equalsIgnoreCase("longtext")
                || sqlType.equalsIgnoreCase("MEDIUMTEXT")) {
            return "String";
        } else if (sqlType.equalsIgnoreCase("datetime")) {
            return "Date";
        } else if (sqlType.equalsIgnoreCase("image") || sqlType.equalsIgnoreCase("GEOMETRY")) {
            return "Blod";
        }

        System.out.println(sqlType);
        return null;
    }

    private boolean sqlType2equals(String sqlType) {
        if (sqlType.equalsIgnoreCase("bit")) {
            return false;
        } else if (sqlType.equalsIgnoreCase("tinyint")) {
            return false;
        } else if (sqlType.equalsIgnoreCase("smallint")) {
            return false;
        } else if (sqlType.equalsIgnoreCase("int") || sqlType.equalsIgnoreCase("INT UNSIGNED")) {
            return false;
        } else if (sqlType.equalsIgnoreCase("bigint")) {
            return false;
        } else if (sqlType.equalsIgnoreCase("float")) {
            return false;
        } else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric")
                || sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money")
                || sqlType.equalsIgnoreCase("smallmoney")|| sqlType.equalsIgnoreCase("DECIMAL UNSIGNED")) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) throws Exception {
        try {
            DBTools TmpTool = new DBTools();
            TmpTool.InitConnection();
            TmpTool.addTableName();
            TmpTool.GenerateEntity();
            TmpTool.GenerateDto();
            TmpTool.GenerateDao();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}
  java   springboot   entity   mysql  

给我留言

个人介绍

about me

奕华

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

联系方式