java自動生成entity文件


 網上關於自動生成entity文件的代碼很多,看了很多代碼后,在先輩們的基礎上再完善一些功能(指定多個表,全部表).

為了使用方便所以把兩個類寫在一個java文件中,所以大家可以直接拿這個java文件,修改下配置后就可以使用了,傳送門

1.把字段抽象為一個類

/**
 * 字段信息表
 */
class FieldMeta {
    private String fieldName;    //字段
    private String fieldDataType;   //字段類型
    private int fieldLength;    //字段長度
    private String fieldComment;    //字段備注

    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldDataType() {
        if(fieldDataType.equalsIgnoreCase("bit")){  
            return "boolean";  
        }else if(fieldDataType.equalsIgnoreCase("tinyint")){  
            return "byte";  
        }else if(fieldDataType.equalsIgnoreCase("smallint")){  
            return "short";  
        }else if(fieldDataType.equalsIgnoreCase("int")){  
            return "int";  
        }else if(fieldDataType.equalsIgnoreCase("bigint")){  
            return "long";  
        }else if(fieldDataType.equalsIgnoreCase("float")){  
            return "float";  
        }else if(fieldDataType.equalsIgnoreCase("decimal") || fieldDataType.equalsIgnoreCase("numeric")   
                || fieldDataType.equalsIgnoreCase("real") || fieldDataType.equalsIgnoreCase("money")   
                || fieldDataType.equalsIgnoreCase("smallmoney")){  
            return "double";  
        }else if(fieldDataType.equalsIgnoreCase("varchar") || fieldDataType.equalsIgnoreCase("char")   
                || fieldDataType.equalsIgnoreCase("nvarchar") || fieldDataType.equalsIgnoreCase("nchar")   
                || fieldDataType.equalsIgnoreCase("text") || fieldDataType.equalsIgnoreCase("LONGTEXT")){  
            return "String";  
        }else if(fieldDataType.equalsIgnoreCase("datetime")){  
            return "Date";  
        }else if(fieldDataType.equalsIgnoreCase("image")){  
            return "Blod";  
        }  
        return fieldDataType;
    }
    public void setFieldDataType(String fieldDataType) {
        if(fieldDataType.equalsIgnoreCase("bit")){  
            this.fieldDataType = "boolean";  
        }else if(fieldDataType.equalsIgnoreCase("tinyint")){  
            this.fieldDataType = "byte";  
        }else if(fieldDataType.equalsIgnoreCase("smallint")){  
            this.fieldDataType = "short";  
        }else if(fieldDataType.equalsIgnoreCase("int")){  
            this.fieldDataType = "int";  
        }else if(fieldDataType.equalsIgnoreCase("bigint")){  
            this.fieldDataType = "long";  
        }else if(fieldDataType.equalsIgnoreCase("float")){  
            this.fieldDataType = "float";  
        }else if(fieldDataType.equalsIgnoreCase("decimal") || fieldDataType.equalsIgnoreCase("numeric")   
                || fieldDataType.equalsIgnoreCase("real") || fieldDataType.equalsIgnoreCase("money")   
                || fieldDataType.equalsIgnoreCase("smallmoney")){  
            this.fieldDataType = "double";  
        }else if(fieldDataType.equalsIgnoreCase("varchar") || fieldDataType.equalsIgnoreCase("char")   
                || fieldDataType.equalsIgnoreCase("nvarchar") || fieldDataType.equalsIgnoreCase("nchar")   
                || fieldDataType.equalsIgnoreCase("text") || fieldDataType.equalsIgnoreCase("LONGTEXT") 
                || fieldDataType.equalsIgnoreCase("TIMESTAMP")){  
            this.fieldDataType = "String";  
        }else if(fieldDataType.equalsIgnoreCase("datetime") || fieldDataType.equalsIgnoreCase("date")){  
            this.fieldDataType = "Date";  
        }else if(fieldDataType.equalsIgnoreCase("image")){  
            this.fieldDataType = "Blod";  
        }else {
            this.fieldDataType = fieldDataType;
        }
    }
    
    public int getFieldLength() {
        return fieldLength;
    }
    public void setFieldLength(int fieldLength) {
        this.fieldLength = fieldLength;
    }

    public String getFieldComment() {
        return fieldComment;
    }
    public void setFieldComment(String fieldComment) {
        this.fieldComment = fieldComment;
    }
    
}

2.通用方法,jdbc的創建與關閉,首字母大寫方法.

   /** 
     * 功能:將輸入字符串的首字母改成大寫 
     * @param str 
     * @return 
     */  
    private String upFirstChar(String str) {
        if (str!=null&&str.length()>0) {
            char[] ch = str.toCharArray();  
            if(ch[0] >= 'a' && ch[0] <= 'z'){
                ch[0] = (char)(ch[0] - 32);  
            }
            return new String(ch);  
        }
        return null;
    }
    
    /**
     * 獲取jdbc連接 
     */
    private Connection getJdbcCon(){
        try {
            Class.forName(DRIVER);
            return DriverManager.getConnection(URL,NAME,PASS);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**  
     * 關閉所有資源  
     */    
    private void closeAll(ResultSet resultSet,PreparedStatement preparedStatement,Connection connnection,CallableStatement callableStatement) {    
        // 關閉結果集對象    
        if (resultSet != null) {    
            try {    
                resultSet.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }    
        // 關閉PreparedStatement對象    
        if (preparedStatement != null) {    
            try {    
                preparedStatement.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }    
        // 關閉CallableStatement 對象    
        if (callableStatement != null) {    
            try {    
                callableStatement.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }    
        // 關閉Connection 對象    
        if (connnection != null) {    
            try {    
                connnection.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }  
    }

3.生成類,生成字段,生成方法

   /**
     * 生成類主題框架
     */
    public String genFrame(List<FieldMeta> fmls,String tableName){
        StringBuilder sb = new StringBuilder();
        //package空間
        sb.append("package "+this.packagePath+";\r\n\r\n");
        // 判斷是否導入工具包
        if (f_util) {
            sb.append("import java.util.Date;\r\n");
        }
        if (f_sql) {
            sb.append("import java.sql.*;\r\n");
        }
        // 注釋部分
        sb.append("/**\r\n");
        sb.append(" * 名   稱:" + tableName + "\r\n");
        sb.append(" * 描   述:\r\n");
        sb.append(" * 作   者:" + this.authorName + "\r\n");
        sb.append(" * 時   間:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()) + "\r\n");
        sb.append(" * --------------------------------------------------" + "\r\n");
        sb.append(" * 修改歷史" + "\r\n");
        sb.append(" * 序號    日期    修改人     修改原因 "+ "\r\n");
        sb.append(" * 1" + "\r\n");
        sb.append(" * **************************************************" + "\r\n");
        sb.append(" */\r\n");
        // 實體部分
        sb.append("public class " + upFirstChar(tableName) + "{\r\n");
        //字段部分
        genAttrs(sb, fmls);
        //方法部分
        genMethods(sb, fmls);
        sb.append("}\r\n");
        return new String(sb);
    }
    /**
     * 功能:生成所有屬性
     */
    private void genAttrs(StringBuilder sb,List<FieldMeta> fmls) {
        for (int i = 0; i < fmls.size(); i++) {
            sb.append("\t");
            sb.append("private " + fmls.get(i).getFieldDataType() + " "
                    + fmls.get(i).getFieldName() + ";");
            sb.append("\t/*"+fmls.get(i).getFieldComment()+"\tlen: "+fmls.get(i).getFieldLength()+"*/\r\n");
        }
        sb.append("\r\n");
    }
    /**
     * 功能:生成所有方法
     */
    private void genMethods(StringBuilder sb,List<FieldMeta> fmls){
        for (int i = 0; i < fmls.size(); i++) {
            sb.append("\tpublic void set"+upFirstChar(fmls.get(i).getFieldName())+"("+fmls.get(i).getFieldDataType()+" "+fmls.get(i).getFieldName()+"){\r\n");
            sb.append("\t\tthis."+fmls.get(i).getFieldName()+"="+fmls.get(i).getFieldName()+";\r\n");
            sb.append("\t}\r\n");
            sb.append("\tpublic "+fmls.get(i).getFieldDataType()+" get"+upFirstChar(fmls.get(i).getFieldName())+"(){\r\n");
            sb.append("\t\treturn "+fmls.get(i).getFieldName()+";\r\n");
            sb.append("\t}\r\n");
            sb.append("\r\n");
        }
        sb.append("");
    }

4.其他方法,寫入文件方法,獲取所有表名方法

    /**
     * 寫入文件 
     */
    private void wirteToFile(String content,String packagePath,String tableName){
        PrintWriter pw = null;
        BufferedWriter bw = null;
        File dir = new File("");    //根據空文件獲取項目路徑
        //entity文件父文件夾全路徑
        String dirpath = dir.getAbsolutePath() + "\\src\\"+packagePath.replace(".", "\\");
        File parentDir = new File(dirpath);
        if (!parentDir.exists()) {    //判斷是否存在該路徑
            parentDir.mkdirs();     //不存在則創建
        }
        String filePath = dirpath+"\\"+upFirstChar(tableName)+".java";    //java文件路徑
        File file = new File(filePath);
        try {
            if (!file.exists()) {    //判斷是否存在java文件
                file.createNewFile();    //不存在則創建
            }else {
                System.out.print("表     "+tableName+"   的entity實體已存在於:");
            }
            pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filePath), "utf-8"));    //OutputStreamWriter為了解決亂碼
            bw = new BufferedWriter(pw);
            bw.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                if (bw!=null) {
                    bw.close();
                }
                if (pw!=null) {
                    pw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(filePath);
    }
    
    //獲取所有表名
    private String[] getAllTables(){
        List<String> stringList = new ArrayList<String>();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs =null;
        con = getJdbcCon();
        String sql = "show tables";
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                stringList.add(rs.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            closeAll(rs, ps, con, null);
        }
        return stringList.toArray(new String[stringList.size()]);
    }

5.執行

private String packagePath = "com.qy.entity";    //指定實體生成所在包的路徑
    //表名以","分隔;若為"*"則生成所有表的entity文件
    private String tableNames = "*";    
    
    private String authorName = "邱宇";    //作者名字
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/protocol";
    private static final String NAME = "qy";
    private static final String PASS = "199526";
    
    private boolean f_util = false;  // 是否需要導入包java.util.*
    private boolean f_sql = false;  // 是否需要導入包java.sql.*
    
    public static void main(String[] args) {
        new CreateEntity();
    }

    public CreateEntity(){
        
        String[] tables = null;
        if (this.tableNames=="*") {
            tables = getAllTables();
        }else {
            tables = this.tableNames.split(",");
        }
        for (int i = 0; i < tables.length; i++) {
            new CreateEntity(tables[i]);
            f_util = false;
            f_sql = false;
        }
    }
    
    public CreateEntity(String tableName){
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        DatabaseMetaData dbmd = null;
        //ResultSetMetaData rsmd= null;
        List<FieldMeta> fmls = new ArrayList<FieldMeta>();
        String sql= "select * from "+tableName;
        try {
            con=getJdbcCon();
            dbmd = con.getMetaData();
            rs = dbmd.getColumns(con.getCatalog(), null, tableName, null);
            while (rs.next()) {
                FieldMeta fm = new FieldMeta();
                fm.setFieldName(rs.getString("COLUMN_NAME"));
                if (rs.getString("TYPE_NAME").equalsIgnoreCase("datetime")
                        || rs.getString("TYPE_NAME").equalsIgnoreCase("date")) {
                    f_util = true;
                }
                if (rs.getString("TYPE_NAME").equalsIgnoreCase("image")
                        || rs.getString("TYPE_NAME").equalsIgnoreCase("text")) {
                    f_sql = true;
                }
                fm.setFieldDataType(rs.getString("TYPE_NAME"));
                fm.setFieldLength(Integer.parseInt(rs.getString("COLUMN_SIZE")));
                fm.setFieldComment(rs.getString("REMARKS").replace("\r\n", "  "));   //注釋中的換行改為空格
                fmls.add(fm);
            }
            /* 從resultSet讀取的ResultSetMetaData沒有注釋等詳細信息
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            rsmd = rs.getMetaData();
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
                FieldMeta fm = new FieldMeta();
                fm.setFieldName(rsmd.getColumnName(i+1));
                if (rsmd.getColumnTypeName(i+1).equalsIgnoreCase("datetime")) {
                    f_util = true;
                }
                if (rsmd.getColumnTypeName(i+1).equalsIgnoreCase("image")
                        || rsmd.getColumnTypeName(i+1).equalsIgnoreCase("text")) {
                    f_sql = true;
                }
                fm.setFieldDataType(rsmd.getColumnTypeName(i+1));
                fm.setFieldLength(rsmd.getColumnDisplaySize(i+1));
                //fm.setFieldComment(fieldComment);
                fmls.add(fm);
            }*/
            
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            if (con!=null) {
                closeAll(rs, ps, con, null);
            }
        }
        //生成內容
        String content = genFrame(fmls,tableName);
        //System.out.println(content);
        //寫入到文件
        wirteToFile(content,this.packagePath,tableName);
    }

源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM