2014-09-03 45 views
3

首先,我不確定標題或標籤是否正確。如果沒有,請有人糾正我Java:在具有外部源的NetBeans上源代碼自動完成的方式

我的問題是,如果有任何工具或方法來創建一個自動完成列表與外部來源的項目,netbeans解析它,並警告我,如果有任何錯誤。

- 問題:我使用JDBC,我想以某種方式模擬我的所有模式,表和列,以便NetBeans可以解析它並在出現錯誤時警告我。例如與正常使用JDBC的我有一個功能:

ResultSet execSelect(String cols, String table){ 
    return statement.executeQuery("SELECT "+cols+" FROM "+table); } 

的問題是,應該有人確切地知道什麼是可用的PARAMS爲傳遞正確的字符串。

我想NetBeans以某種方式向我展示一個自動完成列表以及所有可用的選項。

PS。我什麼時候我是建設一個Web應用程序相同的問題,我想以某種方式得到我的圖像等外部資源的所有路徑,.js文件,.css文件等

- 思想至今
我的想法,直到現在是把一個.java文件與公共靜態最終字符串變量與一些如何嵌套靜態類,以便我可以從任何地方訪問。例如:

DatabaseModel.MySchema.TableName1.ColumnName2 

將是'ColumnName2'列和'TableName1'表的字符串變量。這將幫助我autocompletes但問題是,沒有類型檢查。換句話說,有人可以使用任何字符串,全局定義或不作爲表和不正確的列。我想用某種方式使用嵌套的枚舉來覆蓋這些關於類型檢查的情況,但我不確定在任何情況下這是否是一個好的解決方案。

有什麼想法?

回答

0

最後我想出了一個連接到mysql的「腳本」獲取所有元數據(每個模式的每個表的每一列),並創建一個帶有預定義類和字符串的java文件來描述模型。例如:
- 如果要從模式S1的表T1中選擇列C1的名稱,則應鍵入DatabaseModel.S1.T1.C1._,它是具有列名稱的公共靜態最終字符串。
- 如果你想從模式S2得到表T2,你可以鍵入DatabaseModel.S2.T2,它是一個實現DatabaseTable接口的類。所以函數:execSelect可以將DatabaseTable和DatabaseColumn作爲參數。

這裏是代碼(未經測試,但想法很清楚,我認爲)。

public static void generateMysqlModel(String outputFile) throws IOException, SQLException{ 
    //** Gather the database model 
    // Maps a schema -> table -> column 
    HashMap<String,HashMap<String,ArrayList<String>>> model = 
      new HashMap<String,HashMap<String,ArrayList<String>>>(); 

    openDatabase(); 
    Connection sqlConn = DriverManager.getConnection(url, username, password); 
    DatabaseMetaData md = sqlConn.getMetaData(); 

    ResultSet schemas = md.getSchemas(); // Get schemas 
    while(schemas.next()){ // For every schema 
     String schemaName = schemas.getString(1); 
     model.put(schemaName, new HashMap<String,ArrayList<String>>()); 
     ResultSet tables = md.getTables(null, null, "%", null); // Get tables 
     while (tables.next()) { // For every table 
      String tableName = tables.getString(3); 
      model.get(schemaName).put(tableName, new ArrayList<String>()); 
      // Get columns for table 
      Statement s = sqlConn.createStatement(); // Get columns 
      s.execute("show columns in "+tables.getString(3)+";"); 
      ResultSet columns = s.getResultSet(); 
      while(columns.next()){ // For every column 
       String columnName = columns.getString(1); 
       model.get(schemaName).get(tableName).add(columnName); 
      } 
     } 
    } 

    closeDatabase(); 


    //** Create the java file from the collected model 
    new File(outputFile).createNewFile(); 
    BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile)) ; 

    bw.append("public class DatabaseModel{\n"); 
    bw.append("\tpublic interface DatabaseSchema{};\n"); 
    bw.append("\tpublic interface DatabaseTable{};\n"); 
    bw.append("\tpublic interface DatabaseColumn{};\n\n"); 
    for(String schema : model.keySet()){ 
     HashMap<String,ArrayList<String>> schemaTables = model.get(schema); 
     bw.append("\tpublic static final class "+schema+" implements DatabaseSchema{\n"); 
     //bw.append("\t\tpublic static final String _ = \""+schema+"\";\n"); 
     for(String table : schemaTables.keySet()){ 
      System.out.println(table); 
      ArrayList<String> tableColumns = schemaTables.get(table); 
      bw.append("\t\tpublic static final class "+table+" implements DatabaseTable{\n"); 
      //bw.append("\t\t\tpublic static final String _ = \""+table+"\";\n"); 
      for(String column : tableColumns){ 
       System.out.println("\t"+column); 
       bw.append("\t\t\tpublic static final class "+column+" implements DatabaseColumn{" 
         + " public static final String _ = \""+column+"\";\n" 
         + "}\n"); 
      } 
      bw.append("\t\t\tpublic static String val(){ return this.toString(); }"); 
      bw.append("\t\t}\n"); 
     } 
     bw.append("\t\tpublic static String val(){ return this.toString(); }"); 
     bw.append("\t}\n"); 
    } 
    bw.append("}\n"); 

    bw.close(); 
} 

PS。對於Web應用程序中的資源案例,我想有人可以從「resources」文件夾中遞歸地獲取所有文件並填寫模型變量。這將創建一個包含文件路徑的java文件。在這種情況下的接口可能是文件類型或任何其他「文件視圖」你想要的。

我也認爲從任何情況下爲XML文件創建.java文件都很有用,所以任何人都可以在xml文件中爲此目的創建某種定義。 如果有人實現了類似的東西可以在這裏發佈。

任何意見/改進將受到歡迎。