2009-07-19 11 views
5

Ho troppi metodi che più volte fare qualcosa di similePulire configurazione ripetitiva e la pulizia del codice Java (JDBC)

Statement stmt = null; 
ResultSet rstmt = null; 
try { 
    stmt = conn.createStatement(); 
    rstmt = stmt.executeQuery(...); 
    while (rstmt.next()) { 
     //handle rows 
    } 


} catch (SQLException e) { 
    //handle errors 

} finally { 
    try {rstmt.close();} catch (SQLException ex) {} 
    try {stmt.close();} catch (SQLException ex) {} 
} 

Questa configurazione/teardown/pulizia delle dichiarazioni e di risultati è repetive e nasconde i pezzi interessanti codice.

C'è un motivo o linguaggio per la manipolazione di questo (senza introdurre un quadro esterno)?

+1

Uno dei veri valori dell'astrazione di questo tipo di rifiuto del codice è che ci si assicurerà che la propria istruzione di chiusura non sia NPE (si spera che usi l'idioma 'acquisisci; try {use;} finally {release;}' –

+0

Duplicato: http://stackoverflow.com/questions/1072925/remove-boilerplate-from-db-code/1072949#1072949 –

risposta

4

è possibile creare un metodo che riceve la query SQL e un oggetto per gestire il ResultSet. per esempio:

private void executeSql(String sql, ResultSetHandler handler) { 
    Statement stmt = null; 
    ResultSet rstmt = null; 
    try { 
    stmt = conn.createStatement(); 
    rstmt = stmt.executeQuery(sql); 
    while (rstmt.next()) { 
     handler.handle(rstmt); 
    } 
    } 
    catch (SQLException e) { 
    //handle errors 
    } 
    finally { 
    try {rstmt.close();} catch (SQLException ex) {} 
    try {stmt.close();} catch (SQLException ex) {} 
    } 
} 

con ResultSetHandler essendo un'interfaccia:

public interface ResultSetHandler { 
    void handle(ResultSet rs) throws SQLException; 
} 

ed è possibile creare un oggetto di una classe anonima attuazione di tale interfaccia, in modo da non ingombrare troppo.

+1

Probabilmente vuoi rendere questo metodo di interfaccia almeno SQLException. –

+0

buona idea, Tom. – cd1

10

dare un'occhiata a SimpleJDBCTemplate in Spring Framework. Questo fa esattamente quello che vuoi.

Se non si vuole introdurre un quadro esterno poi basta usarlo per qualche ispirazione per implementare il proprio.

+0

+1 da parte mia. Questa è esattamente la cosa giusta da fare. incorporarlo nel progetto sarà utile. – duffymo

+0

Oltre a nascondere questo programma disordinato \ teardown, Spring migliorerà la gestione delle eccezioni in 2 modi: 1) gestirà SQLException e 'rigurgiterà' come qualcosa di più significativo 2) l'eccezione che è 'rigurgitato' sarà essere deselezionata, in modo da non dover prendere o lanciare nulla. – javamonkey79

+0

+1. Ama il modo in cui jdbc viene gestito con la molla. –

1

si dovrebbe riconsiderare utilizzando Java manager di persistenza come iBatis e Hibernate. Questi automatizzano gran parte del boilerplate. Ho utilizzato iBatis, in cui le istruzioni SQL sono tutte ordinatamente impacchettate e denominate in file XML e il volume del codice deve essere circa il 25% di un approccio JDBC non elaborato. È possibile riorganizzare gradualmente il sistema per utilizzare iBatis.

0

Anche se non elimina il set-up e la logica tear-down, spesso preferiscono questo stile per rendere le interazioni JDBC più piacevole:

Statement statement = connection.createStatement(); 
try { 
    ResultSet results = statement.executeQuery(...); 
    try { 
     while (results.next()) { 
      //handle rows 
     } 
    } finally { 
     results.close(); 
    } 
} finally { 
    statement.close(); 
} 

Nidificando le try blocchi, si garantisce automaticamente che sia results e statement avranno i loro close() metodi chiamati senza ricorrere ai try/catch dichiarazioni nel finally blocco. Inoltre, avviando i blocchi try subito dopo aver acquisito gli oggetti, non è necessario preoccuparsi di verificare i valori null (a meno che, ovviamente, connection.createStatement() o statement.executeQuery(...) restituisca null - In tal caso, si riscontrano problemi più grandi).

+1

Questo codice non ti colpisce come, beh ..., brutto? –

+0

Suppongo che la bellezza sia negli occhi di chi guarda. Personalmente trovo questa forma più "attraente" rispetto al modulo presentato nella domanda. –

Problemi correlati