JDBC,Oracle SQL,在标签上添加和显示图片

时间:2014-12-20 02:19:22

标签: oracle jdbc label bfile

我的桌面上有'osta.jpg'图片,我想将它添加到我的数据库Oracle SQL中,然后从Java应用程序(JDBC)中的数据库加载这张图片,并在标签上显示JLabel lblFilm = new JLabel(new ImageIcon( "picture_from_SQL")( Swing library)

我尝试将图片添加到数据库:

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 个答案:

答案 0 :(得分:0)

首先,为了创建有效的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';

其次,为了使用JDBC从Oracle读取BFILE,您需要使用一些特定于Oracle的类。首先,您需要将ResultSet强制转换为oracle.jdbc.OracleResultSet,这样您就可以使用getBFILE()方法从ResultSet中获取BFILE定位符。然后打开BFILE,从BFILE的binaryStreamValue()方法中获取一个InputStream并从中读取数据。

这里有一些示例代码(可以改进错误处理):

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类有一个构造函数,它接受一个字节数组,您可以使用answers to this question将InputStream转换为字节数组。