zoukankan      html  css  js  c++  java
  • 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+";
    
    ");
            // 判断是否导入工具包
            if (f_util) {
                sb.append("import java.util.Date;
    ");
            }
            if (f_sql) {
                sb.append("import java.sql.*;
    ");
            }
            // 注释部分
            sb.append("/**
    ");
            sb.append(" * 名   称:" + tableName + "
    ");
            sb.append(" * 描   述:
    ");
            sb.append(" * 作   者:" + this.authorName + "
    ");
            sb.append(" * 时   间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()) + "
    ");
            sb.append(" * --------------------------------------------------" + "
    ");
            sb.append(" * 修改历史" + "
    ");
            sb.append(" * 序号    日期    修改人     修改原因 "+ "
    ");
            sb.append(" * 1" + "
    ");
            sb.append(" * **************************************************" + "
    ");
            sb.append(" */
    ");
            // 实体部分
            sb.append("public class " + upFirstChar(tableName) + "{
    ");
            //字段部分
            genAttrs(sb, fmls);
            //方法部分
            genMethods(sb, fmls);
            sb.append("}
    ");
            return new String(sb);
        }
        /**
         * 功能:生成所有属性
         */
        private void genAttrs(StringBuilder sb,List<FieldMeta> fmls) {
            for (int i = 0; i < fmls.size(); i++) {
                sb.append("	");
                sb.append("private " + fmls.get(i).getFieldDataType() + " "
                        + fmls.get(i).getFieldName() + ";");
                sb.append("	/*"+fmls.get(i).getFieldComment()+"	len: "+fmls.get(i).getFieldLength()+"*/
    ");
            }
            sb.append("
    ");
        }
        /**
         * 功能:生成所有方法
         */
        private void genMethods(StringBuilder sb,List<FieldMeta> fmls){
            for (int i = 0; i < fmls.size(); i++) {
                sb.append("	public void set"+upFirstChar(fmls.get(i).getFieldName())+"("+fmls.get(i).getFieldDataType()+" "+fmls.get(i).getFieldName()+"){
    ");
                sb.append("		this."+fmls.get(i).getFieldName()+"="+fmls.get(i).getFieldName()+";
    ");
                sb.append("	}
    ");
                sb.append("	public "+fmls.get(i).getFieldDataType()+" get"+upFirstChar(fmls.get(i).getFieldName())+"(){
    ");
                sb.append("		return "+fmls.get(i).getFieldName()+";
    ");
                sb.append("	}
    ");
                sb.append("
    ");
            }
            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("
    ", "  "));   //注释中的换行改为空格
                    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);
        }

    源码

  • 相关阅读:
    编译原理笔记 2
    编译原理笔记 1
    初步学习计算机图形学 [闫令琪]
    复杂 Web 前端的设计
    使用 GitHub Actions 部署 .Net 5 程序
    ES 2020 Optional Chain (可选链)
    2020 Web 前端学习记录
    WPF TreeView 支持多选
    linux (CentOS 7)报错:yum 命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”
    node.js 报错
  • 原文地址:https://www.cnblogs.com/aeolian/p/7989891.html
Copyright © 2011-2022 走看看