Как обобщить запросы результатов?

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

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

PS: Пробовал искать.

Теги:
sqlite3
resultset

3 ответа

1

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

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

1

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

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

0

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

ресурс: официальные документы

  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
    }
  }

Надеюсь, я дал тебе свет.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню