sql >> Databasteknik >  >> RDS >> Mysql

Returnera en resultatuppsättning

Du bör aldrig skicka ett ResultSet runt genom offentliga metoder. Detta är benäget att resursläcka eftersom du är tvungen att hålla uttalandet och anslutningen öppna. Att stänga dem skulle implicit stänga resultatuppsättningen. Men att hålla dem öppna skulle få dem att dingla runt och få DB att ta slut på resurser när det finns för många av dem öppna.

Mappa den till en samling Javabeans som så och returnera den istället:

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;
}

Eller, om du redan använder Java 7, använd bara prova-med-resurser uttalande som automatiskt stänger dessa resurser:

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;
}

Förresten, du bör inte deklarera Connection , Statement och ResultSet som instansvariabler alls (stort trådsäkerhetsproblem!), inte heller svälja SQLException vid den tidpunkten alls (uppringaren kommer inte att ha någon aning om att ett problem uppstod), och inte heller stänga resurserna i samma try (om t.ex. resultatuppsättningen nära ger ett undantag, är satsen och anslutningen fortfarande öppna). Alla dessa problem åtgärdas i ovanstående kodavsnitt.



  1. Ladda CSV-data till MySQL i Python

  2. SQL Server - Ta bort alla icke-utskrivbara ASCII-tecken

  3. Bästa sättet att kontrollera om mysql_query gav några resultat?

  4. Vad är skillnaden mellan MySQL och SQL?