Mysql
 sql >> Database >  >> RDS >> Mysql

Restituzione di un set di risultati

Non dovresti mai passare un ResultSet in giro attraverso metodi pubblici. Questo è soggetto a perdite di risorse perché sei costretto a mantenere aperta la dichiarazione e la connessione. La loro chiusura chiuderebbe implicitamente il set di risultati. Ma tenerli aperti li farebbe penzolare e farebbe esaurire le risorse del DB quando ce ne sono troppe aperte.

Mappalo su una raccolta di Javabean in questo modo e restituiscilo invece:

public List<Biler> list() throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Biler> bilers = new ArrayList<Biler>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return bilers;
}

Oppure, se utilizzi già Java 7, utilizza prova con le risorse dichiarazione che chiuderà automaticamente tali risorse:

public List<Biler> list() throws SQLException {
    List<Biler> bilers = new ArrayList<Biler>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    }

    return bilers;
}

A proposito, non dovresti dichiarare la Connection , Statement e ResultSet come variabili di istanza (importante problema di threadsafety!), né ingoiare la SQLException a quel punto (il chiamante non avrà idea che si sia verificato un problema), né chiuderà le risorse nello stesso try (se, ad esempio, il set di risultati close genera un'eccezione, l'istruzione e la connessione sono ancora aperte). Tutti questi problemi sono stati risolti negli snippet di codice precedenti.