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 в байтовый массив.