Il semble que chaque fois que je souhaite effectuer une requête de DB, je dois écrire ce qui suit:
Connection conn = null; Statement stmt = null; ResultSet rset = null; try { conn = dataSource.getConnection(); stmt = conn.prepareStatement(sql); // ...set stmt params rset = stmt.executeQuery(); while(rset.next()) { // Do something interesting } } finally { try { if (rset != null) rset.close(); } catch(SQLException e) { } try { if (stmt != null) stmt.close(); } catch(SQLException e) { } try { if (conn != null) conn.close(); } catch(SQLException e) { } }
5 Réponses :
Oui, utilisez les classes de modèle JDBC SPING ( http: / /static.springsource.org/spring/docs/2.0.x/reference/jdbc.html ). P>
ou si vous n'utilisez pas la copie de printemps, le modèle de modèle qu'elles utilisent dans votre propre code. P>
Si vous avez déjà une source de données, vous pouvez utiliser Spring JDBCtemplate pour: p>
Si cela semble trop lourd pour le moment, vous pouvez implémenter des classes et des méthodes utilitaires pour la "partie de la chaudière". Étudier la source de JDBCTemplate devrait aider dans ce cas. p>
La hiérarchie de la hiérarchie des exceptions SQL du printemps. Le support JDBC au printemps est quelque chose que j'essaie d'utiliser si possible, ou du moins copier, si le printemps n'est pas dans le projet.
faire une méthode d'assistance?
public class DBHelper { public static Object run(string sql, List params, ResultHandler rhandler) { Connection conn = null; Statement stmt = null; ResultSet rset = null; try { conn = dataSource.getConnection(); stmt = conn.prepareStatement(sql); int i = 0; for(Object p in params) { stmt.setObject(++i, p); } rset = stmt.executeQuery(); return rhandler.handle(rset); } finally { try { rset.close(); } catch(Exception e) { } try { stmt.close(); } catch(Exception e) { } try { conn.close(); } catch(Exception e) { } } } } public interface ResultHandler { public Object handle(ResultSet) } public class Test { public static void main(String[] args) { String s = (String)DBHelper.run("select * from mytable where col = ?", Arrays.asList({"foo"}), new ResultHandler { public Object handle(ResultSet r) { r.first(); return r.getString("col2"); } }(); } }
dbutils est un cadre très utile, je l'ai utilisé pour des projets plus petits où le printemps et l'hibernation sont surchargés. Il est également capable de faire de la cartographie d'objet aussi. P>
+1 belle prise - j'aime ça! On dirait qu'ils ont essentiellement emballé l'approche "Helper" que j'ai décrite. Je vais devoir garder à l'esprit la prochaine fois. :-)
Au fait, vous devriez vérifier chacun d'être nul avant la fermeture.
@ROBERT - Pas que c'est bien et que je suis d'accord, une vérification nulle devrait être ajoutée, mais la NullPointerException sera prise dans le bloc de captures (avec OutofMemoryError et toutes les autres exceptions de Rumtime pouvant survenir).
Si vous allez faire le code JDBC vous-même, il vaut la peine d'écrire une classe JDBCTILS qui contient des méthodes SafeClose pour chaque classe JDBC. Ces méthodes doivent vérifier pour NULL et CATCH / LOG SQLEXPECTION.
Ne vous connectez pas que vous enregistrer des exceptions, mais laissez appeler sachez que l'erreur s'est produite, sinon l'appelant ne peut pas réagir à un problème (et dans certains cas, cela peut vouloir). Le modèle Spring JDBC résout correctement en convertissant des exceptions à la hiérarchie des exceptions d'exécution.