Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Trả lại tập hợp kết quả

Bạn không bao giờ được vượt qua ResultSet xung quanh thông qua các phương pháp công khai. Điều này dễ bị rò rỉ tài nguyên vì bạn buộc phải giữ câu lệnh và kết nối mở. Việc đóng chúng sẽ hoàn toàn đóng tập kết quả. Nhưng giữ chúng ở trạng thái mở sẽ khiến chúng lơ lửng và khiến DB cạn kiệt tài nguyên khi có quá nhiều tài nguyên đang mở.

Ánh xạ nó với một bộ sưu tập Javabeans như vậy và trả lại nó thay thế:

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

Hoặc, nếu bạn đã sử dụng Java 7, chỉ cần sử dụng thử với tài nguyên câu lệnh sẽ tự động đóng các tài nguyên đó:

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

Nhân tiện, bạn không nên khai báo Connection , StatementResultSet dưới dạng các biến phiên bản (vấn đề an toàn chuỗi chính!), cũng như không nuốt SQLException tại thời điểm đó (người gọi sẽ không có manh mối nào cho thấy sự cố đã xảy ra), cũng như không đóng các tài nguyên trong cùng một try (nếu ví dụ:tập kết quả đóng ném một ngoại lệ, thì câu lệnh và kết nối vẫn mở). Tất cả những vấn đề đó đã được khắc phục trong các đoạn mã trên.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để khôi phục tệp kết xuất từ ​​mysqldump?

  2. Làm cách nào để trích xuất từ ​​thứ n và đếm số lần xuất hiện của từ trong một chuỗi MySQL?

  3. tham gia có điều kiện trong mysql

  4. MySQL:Sử dụng hàm nhóm không hợp lệ

  5. Làm cách nào để sử dụng đúng CASE..WHEN trong MySQL