Почему ResultSet не возвращает данные из MySQL - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь получить изображение из базы данных MySQL и показать в JLabel, но когда я выполняю запрос и пытаюсь получить байты из ResultSet, он возвращает пустой массив.

Я проверил соединение, и оно работает, проверил запрос и оно также работает.

try {
    conn = getConnection();
    pst = conn.prepareStatement("select * from imagem where serial_imagem = 123658");
    rs = pst.executeQuery()

    if (rs.next()) {
        image = rs.getBytes("img_imagem");
    }
}catch (Exception e) {
    e.printStackTrace();
}   

1 Ответ

0 голосов
/ 18 октября 2019

Код не закрывается и, таким образом, утечка ресурсов. Несколько уродливый синтаксис Try-With-Resources обеспечивает закрытие соединения, оператора и набора результатов даже при возврате / исключении.

Можно указать с помощью Optional явное, было ли изображение найдено в таблице.

Optional.of также гарантирует, что поле в базе данных не должно содержать значение SQL NULL.

Optional<byte[]> loadImageFromDatabase(String imageM) throws SQLException {
   String sql = "select img_imagem from imagem where serial_imagem = ?";
   try (Connection conn = getConnection();
           PreparedStatement pst = conn.prepareStatement(sql)) {
       pst.setString(1, imageM);
       try (ResultSet rs = pst.executeQuery()) {
           if (rs.next()) {
               return Optional.of(rs.getBytes(1)); // ofNullable
           } else {
               return Optional.empty();
           }
       }
    }
}

Использование:

    try {
        Optional<byte[]> img = loadImageFromDatabase(jtextField1.getText().trim());
        img.ifPresent(image -> {
                ...
            });
    } catch (SQLException e) {

Еще есть замечание, что я личноне часто используют ResultSet.getBytes, а скорее getInputStream. Зависит от размера изображения и кода создания.

...