2009-07-19 10 views
5

tengo demasiados métodos que hacen repetidamente algo así comoLimpiar configuración repetitiva y Java código de limpieza (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) {} 
} 

Esta instalación/desmontaje/la limpieza de las declaraciones y conjuntos de resultados es repetive y oculta las interesantes piezas de código.

¿Hay algún patrón o idioma para manejar esto (sin introducir ningún marco externo)?

+1

Uno de los valores reales de abstraer este tipo de desperdicio de su código es que se asegurará de que su declaración cerrada no incluya NPE (es de esperar que use la expresión 'acquire; try {use;} finally {release;}' –

+0

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

Respuesta

4

puede crear un método que reciba la consulta SQL y un objeto para manejar el ResultSet. por ejemplo:

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 siendo una interfaz:

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

y se puede crear un objeto de una clase anónima aplicación de dicha interfaz, por lo que no saturar demasiado.

+1

Probablemente quiera hacer que ese método de interfaz arroje al menos SQLException. –

+0

buena idea, Tom. – cd1

10

echar un vistazo a SimpleJDBCTemplate en Spring Framework. Esto hace exactamente lo que quieres.

Si no desea presentar un marco externo, simplemente utilícelo como inspiración para implementar el suyo.

+0

+1 de mi parte. Esto es exactamente lo que se debe hacer. Usar Spring como inspiración o incorporarlo en su proyecto será beneficioso. – duffymo

+0

Además de ocultar este desordenado código setup \ desmontable, Spring mejorará el manejo de excepciones de 2 formas: 1) manejará la SQLException y 'regurgitará' como algo más significativo 2) la excepción que es 'regurgitado' lo hará desmarque, para que no tenga que atrapar ni arrojar nada. – javamonkey79

+0

+1. AMAR la forma en que jdbc se maneja con la primavera. –

1

Debería reconsiderar el uso de administradores de persistencia de Java como iBatis e Hibernate. Estos automatizan una gran cantidad de repetición. He estado usando iBatis, donde las sentencias de SQL están todas cuidadosamente empaquetadas y nombradas en archivos XML, y el volumen del código debe ser aproximadamente el 25% de un enfoque JDBC sin formato. Podría refactorizar gradualmente su sistema para usar iBatis.

0

A pesar de que no elimina la puesta a punto y la lógica desmontaje, a menudo prefieren este estilo para hacer las interacciones JDBC más agradable:

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

Al anidar los try bloques, se asegura automáticamente que tanto results y statement tendrán sus métodos close() llamados sin recurrir a las instrucciones try/catch en su bloque finally. Además, al iniciar los bloques try inmediatamente después de adquirir sus objetos, no necesita preocuparse por verificar los valores null (a menos, por supuesto, connection.createStatement() o statement.executeQuery(...) devolver null - En ese caso, tiene problemas mayores).

+1

¿No te parece este código como, bueno ..., feo? –

+0

Supongo que la belleza está en el ojo del espectador. Personalmente encuentro este formulario más "atractivo" que el formulario presentado en la pregunta. –