7
votes

Supprimer la plaque chauffante du code DB

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) { }
}


4 commentaires

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.


5 Réponses :


11
votes

Oui, utilisez les classes de modèle JDBC SPING ( http: / /static.springsource.org/spring/docs/2.0.x/reference/jdbc.html ).

ou si vous n'utilisez pas la copie de printemps, le modèle de modèle qu'elles utilisent dans votre propre code.


0 commentaires

8
votes

Si vous avez déjà une source de données, vous pouvez utiliser Spring JDBCtemplate pour:

  • Code de la chaudière grandement réduit
  • avoir un bon Hiérarchie d'exception SQL pour gérer des problèmes de base de données courants avec des exceptions d'exécution spécifiques
  • (plus tard avec une utilisation ultérieure de printemps) Utilisez la gestion des transactions déclaratives

    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.


1 commentaires

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.



4
votes

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");
                    }
                }();
    }
}


0 commentaires

0
votes

J'utiliserais Hibernate ou JPA pour réduire le fouillis ...


0 commentaires

6
votes

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.


1 commentaires

+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. :-)