2014-11-27 3 views
1

В настоящий момент я работаю над скриптом, который считывает несколько значений из разных таблиц одной базы данных. Каждый раз, когда я запускаю запрос, я должен открыть инструкцию и создать новый набор результатов, который приведет к ужасному, повторяющемуся коду. Что было бы хорошим способом обобщить это и как это можно сделать?Как обобщать запросы результатов?

Некоторые элементы из моего кода. На данный момент есть только один оператор, и закрытие должно быть вставлено. Одна из основных причин я задаю этот вопрос.

public static void main(String[] args) throws Exception 
{   
    Connection c = null; 
    Statement stmt = null; 

    try 
    { 
     //set up database connection 
     Class.forName("org.sqlite.JDBC"); 
     c = DriverManager.getConnection("jdbc:sqlite:/nfs/home/mals/p/pu2002/workspace/Database2"); 
     c.setAutoCommit(false);  
     stmt = c.createStatement(); 
     //end 

     //get task id to work with 
     String Task_id = null; 
     if(args.length != 0) //if an argument was passed, Task_id will be the first element of the array args (arguments) 
     { 
      Task_id = args[0]; 
     } 
     else if(args.length == 0) //if no arguments were passed, the highest number in the column id from tasks_task will be selected and set as Task_id 
     { 
      ResultSet TTask_id = stmt.executeQuery("SELECT max(id) FROM tasks_task"); 
      int t_id = TTask_id.getInt(1); 
      Task_id = String.valueOf(t_id); 
      TTask_id.close(); 
     } 
     //end 

     //get solution IDs from taks_ids 
     ArrayList<Integer> List_solIDs = new ArrayList<Integer>(); //create an empty array list 
     ResultSet SSolution_task_id = stmt.executeQuery("SELECT id FROM solutions_solution WHERE task_id ="+Task_id + " AND final = 1;"); //Sqlite3-Ausdruck SELECT..., Task IDs verändern pro Aufgabe - "SELECT * FROM solutions_solution where task_id ="+Task_id +";" 
     while (SSolution_task_id.next()) //loops through all elements of SSolution_task_id 
     { 
       List_solIDs.add(SSolution_task_id.getInt("id")); //adds all elements of the resultset SSolution_task_id to the list List_solIDs 
     } 
     SSolution_task_id.close(); 
     //end 




     //get logs according to content type 
     int count = List_solIDs.size(); 
     String log_javaBuilder = null; 
     List<String> log_JunitChecker = new ArrayList<String>(); 

     for (int i = 0; i < count; i++) 
     { 
      boolean sol_id_valid = false; 
      String solID = String.valueOf(List_solIDs.get(i)); 

      try 
      { 
       ResultSet AAttestation_sol_id = stmt.executeQuery("SELECT * FROM attestation_attestation WHERE solution_id =" +solID+";"); 
       int Returned = AAttestation_sol_id.getInt("final_grade_id"); 
      } 
      catch(Exception e) 
      { 
       sol_id_valid = true; 
      } 

      if(sol_id_valid ==true) 
      { 
      try 
      { 
       ResultSet CCresult_javaBuilder = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " +solID+ " AND content_type_id = 22;"); //"SELECT id FROM checker_checkerresult where solution_id = " +List_solIDs.get(i)+ ";" 
       log_javaBuilder = CCresult_javaBuilder.getString("log"); 
       CCresult_javaBuilder.close(); 


       ResultSet CCresult_Junit_checker = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " +solID+ " AND content_type_id = 24;"); 

       while (CCresult_Junit_checker.next()) 
       { 
        log_JunitChecker.add(CCresult_Junit_checker.getString("log")); 
       } 
       CCresult_Junit_checker.close(); 
      } 

      catch (Exception e) 
      { 
       log_JunitChecker.add(null); 
      } 
     //end 

Все виды потенциальных улучшений будут приветствоваться.

P.S .: Пробовал поиск в Интернете.

ответ

1

Лучше, чем писать общий метод самостоятельно, всегда лучше использовать некоторую структуру. Существует много вариантов реализации JPA, которые решают не только эту проблему, но и заботятся о нескольких кодах плиты с постоянным слоем. Запустите JPA от Here. Вы также можете использовать шаблон Spring JDBC, чтобы решить указанную выше проблему Spring JDBC Documentation.

Теперь, если вы действительно не хотите какой-либо зависимости от структуры и довольно быстро закончите этот код, вы можете определить свой собственный класс JDBCTemplate, который принимает запрос и карту параметров и возвращает ResultSet. Этот класс может обрабатывать открытое соединение, выполнение запроса и закрытие соединения и т. Д.

1

Кажется, вы хотите посмотреть на использование некоторого слоя ORM, например. http://hibernate.org/orm/

Что вы ищете, вероятно, более высокий уровень слой, который
абстрагирует вас от базового нижнего уровня JDBC типа кодирования.

0

Что делать, если вы пытаетесь использовать дженерики на методах? это быстрый пример, только для иллюстрации, вы должны улучшить все это :)

ресурс: official docs

public static <T> List<T> getSingleValueList(ResultSet rs, Class<T> clazz, String colName) throws Exception { 
    ArrayList<T> list = new ArrayList<T>(); 
    while (rs.next()) {//loops through all elements of generic list 
     list.add((T) rs.getObject(colName)); //adds all elements of the resultset rs to the list 
    } 
    rs.close(); 

    return list; 
    } 

    public static <T> T getSingleValue(ResultSet rs, Class<T> clazz, String colName) throws Exception { 
    try { 
     if (rs.next()) {//loops through all elements of generic list 
     return (T) rs.getObject(colName); 
     } else { 
     throw new Exception("no value found."); 
     } 
    } finally { 
     rs.close(); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Connection c = null; 
    Statement stmt = null; 

    try { 
     //set up database connection 
     Class.forName("org.sqlite.JDBC"); 
     c = DriverManager.getConnection("jdbc:sqlite:/nfs/home/mals/p/pu2002/workspace/Database2"); 
     c.setAutoCommit(false); 
     stmt = c.createStatement(); 
    //end 

     //get task id to work with 
     String Task_id = null; 
     if (args.length != 0) //if an argument was passed, Task_id will be the first element of the array args (arguments) 
     { 
     Task_id = args[0]; 
     } else if (args.length == 0) //if no arguments were passed, the highest number in the column id from tasks_task will be selected and set as Task_id 
     { 
     ResultSet TTask_id = stmt.executeQuery("SELECT max(id) FROM tasks_task"); 
     int t_id = TTask_id.getInt(1); 
     Task_id = String.valueOf(t_id); 
     TTask_id.close(); 
     } 
    //end 

     //get solution IDs from taks_ids 
     ResultSet SSolution_task_id = stmt.executeQuery("SELECT id FROM solutions_solution WHERE task_id =" + Task_id + " AND final = 1;"); //Sqlite3-Ausdruck SELECT..., Task IDs verändern pro Aufgabe - "SELECT * FROM solutions_solution where task_id ="+Task_id +";" 
     List<Integer> List_solIDs = getSingleValueList(SSolution_task_id, Integer.class, "id"); //create an empty array list 
     //end 

     //get logs according to content type 
     int count = List_solIDs.size(); 
     String log_javaBuilder = null; 
     List<String> log_JunitChecker = new ArrayList<String>(); 
     List<String> tmplog_JunitChecker; 

     for (int i = 0; i < count; i++) { 
     boolean sol_id_valid = false; 
     String solID = String.valueOf(List_solIDs.get(i)); 

     try { 
      ResultSet AAttestation_sol_id = stmt.executeQuery("SELECT * FROM attestation_attestation WHERE solution_id =" + solID + ";"); 
      Integer Returned = getSingleValue(AAttestation_sol_id, Integer.class, "final_grade_id"); 
     } catch (Exception e) { 
      sol_id_valid = true; 
     } 

     if (sol_id_valid == true) { 
      try { 
      ResultSet CCresult_javaBuilder = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " + solID + " AND content_type_id = 22;"); //"SELECT id FROM checker_checkerresult where solution_id = " +List_solIDs.get(i)+ ";" 
      log_javaBuilder = getSingleValue(CCresult_javaBuilder, String.class, "log"); 

      ResultSet CCresult_Junit_checker = stmt.executeQuery("SELECT log FROM checker_checkerresult WHERE solution_id = " + solID + " AND content_type_id = 24;"); 

      tmplog_JunitChecker = getSingleValueList(CCresult_Junit_checker, String.class, "log"); 
      log_JunitChecker.addAll(tmplog_JunitChecker); 
      } catch (Exception e) { 
      log_JunitChecker.add(null); 
      } 
      //end 
     } 
     } 
    } catch (Exception eeee) { 
     //handle it 
    } 
    } 

Я надеюсь, что я дал вам свет.

В любом случае, рамки практически во всех случаях помогают.

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