2014-09-03 4 views
3

Прежде всего, я не уверен в правильности названия или тегов. Если нет, кто-то, пожалуйста, поправьте меняJava: Способы автозаполнения исходного кода на netbeans с внешним источником

Мой вопрос в том, есть ли какие-либо инструменты или способы создания списка автозаполнения с элементами из внешнего источника, с чистыми сетями и предупреждениями, если есть какие-либо ошибки.

- Проблема: Я использую JDBC, и я хочу каким-то образом смоделировать все свои схемы, таблицы и столбцы, чтобы netbeans могли его разобрать и предупредить, если у меня что-то не так. Например, при нормальном использовании JDBC я бы имел функцию:

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

Проблема заключается в том, что кто-то должен точно знать, какие имеющиеся PARAMS для того, чтобы передавать правильные строки.

Я хочу, чтобы netbeans показывал мне как-то список автозаполнения со всеми доступными параметрами.

PS. У меня была точно такая же проблема, когда я строил веб-приложение, и я хотел как-то, чтобы получить все пути для моих внешних ресурсов, например, изображений, .js файлы .css файлов и т.д.

- Мысли до сих пор:
Мои мысли до сих пор заключались в том, чтобы поместить файл .java с публичными статическими финальными строковыми строками с некоторыми вложенными статическими классами, чтобы я мог получить доступ из любой точки. Например:

DatabaseModel.MySchema.TableName1.ColumnName2 

будет строка varialble со столбцом «имя_столбца2» и «таблицы TableName1». Это помогло бы мне с автозаполнениями, но проблема в том, что проверки типов нет. Другими словами, кто-то может использовать любую строку, глобальную определенную или не как таблицу, и как колонку, которая также неверна. Я собираюсь использовать вложенные перечисления как-то, чтобы освещать эти случаи проверки типов, но я не уверен, что это будет хорошим решением в любом случае.

Любые мысли?

ответ

0

Наконец-то я придумал написание «скрипта», который подключается к mysql, получает все метаданные (каждый столбец каждой таблицы каждой схемы) и создает Java-файл с предопределенными классами и строками, которые описывают модель. Например:
- Если вы хотите, чтобы имя столбца C1 из таблицы T1 из схемы S1, вы должны ввести DatabaseModel.S1.T1.C1._, который является публичной статической конечной строкой с именем столбца.
- Если вам нужна таблица T2 из схемы S2, вы должны ввести 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. В случае с ресурсами в веб-приложении, я думаю, кто-то мог бы рекурсивно получить все файлы из папки «resources» и заполнить модельную переменную. Это создаст файл java с файловыми путями. В этом случае интерфейсами могут быть типы файлов или любой другой «вид файла», который вы хотите.

Я также подумал, что было бы полезно создать файл .java из XML-файла для любого случая, так что каждый мог бы просто создать некоторую дефиницию в XML-файле для этой цели. Если кто-то реализует что-либо подобное, можете опубликовать его здесь.

Любые комментарии/улучшения будут приветствоваться.

Смежные вопросы