Удаление дубликата кода Java

У меня есть класс, написанный в ~1000 строк кода Java, который переносит одну базу данных в другую. Он имеет 19 методов для каждой копируемой таблицы и 1, который загружает специальный драйвер JDBC для Filemaker.

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

Итак, вот суть:

public static void companyInsert() throws SQLException{
// This loads the JDBC drivers, gets the connections, turns off auto commit and returns a createStatement()
query = classname.Connect();

try {
  results = query.executeQuery("SELECT * from table");

  // Iterate through the results and print them to standard output
System.out.println("Starting Customers");

stmt = con.prepareStatement("INSERT ignore INTO table (idone, idtwo) values (?, ?)");

while (results.next()) {
    String fname = results.getString("field 1");
    String lname = results.getString("field 2");
 // System.out.println("Found user \"" + fname + " " + lname + "\"");
     stmt.setString(1, fname);
  stmt.setString(2, lname);
  stmt.addBatch();
  }
  // submit the batch for execution
   int[] updateCounts = stmt.executeBatch();
   System.out.println("Update count: " + updateCounts);
  con.commit();
  stmt.close();
  System.out.println("Completed Customers");
}
catch (BatchUpdateException be) {
//handle batch update exception
int[] counts = be.getUpdateCounts();
for (int i = 0; i < counts.length; i++) {
    System.out.println("Statement["+i+"] :"+counts[i]);
}
con.rollback();
}catch (SQLException e) {

//handle SQL exception
con.rollback();
}
 }

Существует 19 таких методов, с изменением только частей sql (есть также больше полей, устанавливаемых для других записей, причем некоторые также извлекаются как даты). Надеюсь, у кого-то есть отличная идея - если бы я мог просто оторвать этот раздел catch (это всегда одно и то же), этого было бы достаточно!

2 ответа

Решение

Взгляните на шаблонный шаблон или, как предложил BalusC, Hibernate.

Простой подход будет иметь обработчик исключений...

private void handleException(Exception e, Connection con) throws SQLException {
    if (e instanceof BatchUpdateException) {
        BatchUpdateException be = (BatchUpdateException) e;
        //handle batch update exception
        int[] counts = be.getUpdateCounts();
        for (int i = 0; i < counts.length; i++) {
            System.out.println("Statement["+i+"] :"+counts[i]);
        }
        con.rollback();
    }
    else if (e instanceof SQLException) {
        con.rollback();
    }
}

... а затем ваш код делает это:

try {
    //... jdbc code
}
catch (Exception e) {
    handleException(e, con);
}

... или вы можете пойти на более рефакторинг и применить шаблон проектирования, такой как "шаблонный метод".

Другие вопросы по тегам