Удаление дубликата кода 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);
}
... или вы можете пойти на более рефакторинг и применить шаблон проектирования, такой как "шаблонный метод".