JDBC, Oracle SQL, добавление и отображение изображения на этикетке

У меня есть картинка "osta.jpg" на рабочем столе, и я хочу добавить ее в свою базу данных Oracle SQL, а затем загрузить эту картинку из базы данных в приложении Java (JDBC) и показать на этикетке с помощью JLabel lblFilm = new JLabel(new ImageIcon( "picture_from_SQL") (Качели библиотеки)

Я пытаюсь добавить изображение в базу данных:

ALTER TABLE film ADD bfile_loc bfile, bfile_type varchar2(4);
UPDATE film SET bfile_type = 'JPEG';
UPDATE film SET bfile_loc = bfilename('GIF_FILES','C:\Users\Maciej\Desktop\osta.jpg') WHERE kategoria IN 'thriller';

Тем не менее, я не знаю, как загрузить его в приложение Java.

1 ответ

Решение

Прежде всего, чтобы создать действительный BFILE, вам нужно указать каталог Oracle, а затем местоположение файла в этом каталоге. Я не знаю, что ты GIF_FILES каталог есть, но если он был создан с помощью

CREATE DIRECTORY GIF_FILES AS 'C:\Users\Maciej\Desktop';

тогда вы бы использовали следующее для установки BFILE:

UPDATE film SET bfile_loc = bfilename('GIF_FILES', 'osta.jpg') WHERE kategoria IN 'thriller';

Во-вторых, чтобы считывать BFILE из Oracle с использованием JDBC, вам нужно использовать некоторые специфичные для Oracle классы. Во-первых, вам нужно привести ResultSet к oracle.jdbc.OracleResultSetтак что вы можете использовать getBFILE() метод для получения локатора BFILE из ResultSet. Затем откройте BFILE, получите InputStream от BFILE binaryStreamValue() метод и читать данные из этого.

Вот пример кода (обработка ошибок может быть улучшена):

import java.io.*;
import java.sql.*;
import oracle.sql.BFILE;
import oracle.jdbc.OracleResultSet;

// ...

    // 'connection' here is your Oracle database connection.
    Statement stmt = connection.createStatement();
    OracleResultSet rSet = (OracleResultSet)stmt.executeQuery(
                                                 "SELECT bfile_loc FROM film");
    if (rSet.next()) {
        BFILE bfile = rSet.getBFILE(1);
        System.out.println("Length: " + bfile.length());
        bfile.open();
        InputStream is = bfile.binaryStreamValue();
        // Read data from input stream...
        is.close();
        bfile.close();
    }

В приведенном выше коде я также извлекаю длину файла, которая не является существенной, но она не будет выполнена, если файл не найден.

В-третьих, вам нужно преобразовать InputStream в ImageIcon. Класс ImageIcon имеет конструктор, который принимает байтовый массив, и вы можете использовать ответы на этот вопрос для преобразования InputStream в байтовый массив.

Другие вопросы по тегам