JDBCUtils,根據當前MySQL數據庫下面的表生成java實體類


自己簡單寫的JDBCUtils,可以根據當前數據庫下面的表生成java實體類,代碼萌新,請多多包涵。

初始化配置:

  //驅動程序名//不固定,根據驅動
    static String driver = "com.mysql.jdbc.Driver";
    // URL指向要訪問的數據庫名******,8.0jar包新增時區。
    static String url = "jdbc:mysql://localhost/你的數據庫名?serverTimezone=GMT%2B8";
    // MySQL配置時的用戶名
    static String user = "你的帳號";
    // Java連接MySQL配置時的密碼******
    static String password = "你的密碼";
    
    private static String[] colnames; // 列名數組

    private static String[] colTypes; // 列名類型數組
    
    private static String[] upperColnames; //駝峰命名的字段
    
    private static List<StringBuffer> listArr=new ArrayList<StringBuffer>(); //存儲最終的數據
    
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

打開與關閉數據庫連接:

public static Connection mySQLOpen() {
        Connection con = null;
        try {
            con = DriverManager.getConnection(url, user, password);
            System.out.println("succeed to connection mysql!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    public static void mySQLClose(ResultSet rs, Statement st, Connection con) {
           try {
               try {
                   if (rs != null) {
                       rs.close();
                   }
               } finally {
                   try {
                       if (st != null) {
                           st.close();
                       }
                   } finally {
                       if (con != null)
                           con.close();
                   }
               }
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }

獲得當前數據庫下的所有表名:

 /**
     * 獲得當前數據庫生成數據庫下所有的表名
     * @author one
     * 
     * */
    public static List<String> getTableFromNowConnectDB(){
        Connection conn=null;
        DatabaseMetaData dbmd = null;
        List<String> list = null;
        try {
            conn=mySQLOpen();
            dbmd=(DatabaseMetaData) conn.getMetaData();
            //conn.getCatalog():獲得當前目錄
            ResultSet rs = dbmd.getTables(conn.getCatalog(), "%", "%", new String[] { "TABLE" });
            if (rs != null) {
                list = new ArrayList<String>();
            }
            while(rs.next()){
                //System.out.println(rs.getString("TABLE_NAME"));
                list.add(rs.getString("TABLE_NAME"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

生成每個表名的所有字段:

   /**
     * 生成所有的字段
     * 
     * @param sb,把stringbuffer 對象傳進來繼續append
     * @return 
     */
    private static void processAllField(StringBuffer sb) {
        for (int i = 0; i < colnames.length; i++) {
             sb.append("\tprivate " + colTypes[i] + " " + colnames[i] + ";\r\n");
        }     
    }

生成每個表名的set(),get()訪問器:

 /**
     * 生成所有的set(),get()
     * 
     * @param sb,把stringbuffer 對象傳進來繼續append
     */
    private static void processAllMethod(StringBuffer sb) {
        for (int i = 0; i < colnames.length; i++) {
            sb.append("\tpublic void set" + upperColnames[i] + "(" + colTypes[i] + " " + colnames[i] + "){\r\n");
            sb.append("\t\tthis." + colnames[i] + " = " + colnames[i] + ";\r\n");
            sb.append("\t}\r\n");

            sb.append("\tpublic " + colTypes[i] + " get" + upperColnames[i] + "(){\r\n");
            sb.append("\t\treturn this." + colnames[i] + ";\r\n");
            sb.append("\t}\r\n");
        }
    }

生成每個表名的構造函數:

  /**
     * @author one
     * 該方法用於生成構造函數
     * @param sb,把stringbuffer 對象傳進來繼續append
     * @see 默認生成一個無參數構造和帶全部參數構造
     * 
     * public UserInfo(){}
        public UserInfo(int uid, String uname, String usex) {
        super();
        this.uid = uid;
        this.uname = uname;
        this.usex = usex;
    }
     * */
    private static void processConstructor(StringBuffer sb,String tableName) {
        sb.append("\tpublic "+tableName+"(){}\r\n");
        sb.append("\tpublic "+tableName+"(");
        String link="";
        for (int i = 0; i < colnames.length; i++) {
            sb.append(link + colTypes[i] + " " + colnames[i]);
            link=",";
        }
        sb.append("){\r\n");
        for (int i = 0; i < colnames.length; i++) {
            sb.append("\t\tthis."+colnames[i]+"="+colnames[i]+";\r\n");
        }
        sb.append("\t}\r\n");
    }

數據類型轉換的方法:

 /**
     * 該方法用於類型轉換
     * @param dbType:傳入的數據類型
     * @author one
     * */
    private static String sqlTypeToJava(String dbType) {
        dbType = dbType.toUpperCase();
        switch (dbType) {
        case "VARCHAR":
        case "VARCHAR2":
        case "CHAR":
            return "String";
        case "NUMBER":
        case "DECIMAL":
            return "double";
        case "INT":
        case "SMALLINT":
        case "INTEGER":
            return "int";
        case "BIGINT":
            return "int";
        case "DATETIME":
        case "TIMESTAMP":
        case "DATE":
            return "Date";
        default:
            return "Object";
        }
    }

創建文件夾,寫入項目:

 /**
     * 創建java 文件 將生成的屬性 get/set 方法 保存到 文件中
     * 
     * @author one
     * @param className
     *            類名稱
     * @param content
     *            類內容 包括屬性 getset 方法
     */
    public static void createFloder(String className, String content, String packageName) {
        String folder = System.getProperty("user.dir") + "/src/" + packageName + "/";

        File file = new File(folder);
        if (!file.exists()) {
            file.mkdirs();
        }
        String fileName = folder + className + ".java";

        try {
            File newdao = new File(fileName);
            FileWriter fw = new FileWriter(newdao);
            fw.write("package\t" + packageName.replace("/", ".") + ";\r\n");
            fw.write(content);
            fw.flush();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

生成實體類:

 /**
     * 該方法生成Entity
     * @param tablename:表名集合
     * @param packname:要生成的路徑
     * @author one
     * */
    public static List<StringBuffer> createEntity(List<String> tableNames,String packname) throws Exception{
        Connection conn=null;
        PreparedStatement pstmt=null;
        ResultSetMetaData rsmd = null;
        //每個表的表名
        String eveTableName="";
        conn=mySQLOpen();
 
        //System.out.println("當前數據庫下的表的總數:"+tableNames.size());
        for (int i = 0; i < tableNames.size(); i++) {
            //用StringBuffer的形式先輸出測試一下
            StringBuffer sb=new StringBuffer("");
            //表名首字母轉大寫
            eveTableName=tableNames.get(i).substring(0, 1).toUpperCase()+tableNames.get(i).substring(1,tableNames.get(i).length());
            sb.append("public class "+eveTableName+" {\n\n");
            //查詢語句
            String sql="select * from "+eveTableName;
            
            pstmt=conn.prepareStatement(sql);
            //獲得表的元數據
            rsmd=pstmt.getMetaData();
             // 每個表共有多少列
            int size = rsmd.getColumnCount();
            //把字段放在集合里面
            colnames = new String[size];
            colTypes = new String[size];
            upperColnames = new String[size];
            
            for (int j = 0; j < size; j++) {
                 String columnName = rsmd.getColumnName(j+1);//每列的字段名
                 colnames[j]=columnName;
                 String colunmType=sqlTypeToJava(rsmd.getColumnTypeName(j+1));//每列的類型
                 colTypes[j]=colunmType;
                 //接下來做駝峰命名的字段
                 String upperColumnNam= rsmd.getColumnName(j+1).substring(0,1).toUpperCase()+
                         rsmd.getColumnName(j+1).substring(1,rsmd.getColumnName(j+1).length());
                 upperColnames[j]=upperColumnNam;
            }
            processAllField(sb); //生成字段
            processAllMethod(sb); //生成set,get方法
            processConstructor(sb,eveTableName); //生成構造函數 
            //添加最后一個括號
            sb.append("}");
            //創建文件夾,sb.toString(),把數據加進去
            createFloder(eveTableName,sb.toString(),packname);
            listArr.add(sb);
        }
        //關閉連接
        mySQLClose(null,pstmt,conn);
        return listArr;
    }

展示數據的方法:

 /**
     * 展示
     * */   
    public static void goCreate(){
        try {
            List<StringBuffer> result=createEntity(getTableFromNowConnectDB(),"vo2");
            for (int i = 0; i < result.size(); i++) {
                System.out.println("============第"+(i+1)+"個表的實體類生成============");
                System.out.println(result.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

效果如下:

文件夾創建效果:

 


免責聲明!

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



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