将图像blob插入MySQL - NullPointerException

时间:2015-08-10 23:03:03

标签: java mysql nullpointerexception

我正在研究一个数据库应用程序,我将图像插入到数据库中。我将InputStreams作为BLOB存储在数据库中,我在检索它们并将它们设置为ImageIcon时遇到问题。

try{
    // Return a resultset That contains 
    // the photos from the hashtags the user is following.

    preparedStatement = conn.prepareStatement("SELECT * FROM PHOTOS WHERE CARID=?");
    preparedStatement.setInt(1, 1);
    resultSet = preparedStatement.executeQuery();
    while(resultSet.next()){
        newPhoto = new Photo(resultSet.getInt(1), resultSet.getInt(2), 
                             resultSet.getLong(3), resultSet.getBinaryStream(4));
        System.out.println(resultSet.getBinaryStream(4));
        photos.add(newPhoto);
        System.out.println("Retrieving a photo");
    }
}

照片是一个使用我的Photo类的ArrayList,我将返回。每当我尝试显示图像时,我都会收到以下错误...

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at business.appdev.Home.paintEditFrame(Home.java:577)

来自以下代码..

editImageLabel[i].setIcon(
        new ImageIcon(img.getScaledInstance(imageSize, imageSize, imageSize)));

我有一些基本的println命令,它们显示了从MySQL数据库返回的内容,这是

java.io.ByteArrayInputStream@2c0213a5
Retrieving a photo
java.io.ByteArrayInputStream@252ab7be
Retrieving a photo

其中img是BufferedImage。任何帮助将不胜感激,谢谢!

处理从resultSet返回的InputStream的代码

for(int i = 0; i < photos.size(); i++){         
img = ImageIO.read(photos.get(i).getInputStream());
editImageLabel[i] = new JLabel("");
editImageLabel[i].setIcon(new ImageIcon(img.getScaledInstance(imageSize, imageSize, imageSize)));

使用byte []数据更新了Photo类 基于我读过的其他一些帖子,我将byte []存储到MySQL中的varbinary中。之后,我使用

从我的数据库中获取照片数据
InputStream in = resultSet.getBinaryStream(4);
byte[] photoData = new byte[(int) resultSet.getLong(3)];
ByteArrayOutputStream os = new ByteArrayOutputStream();
for (int len; (len = in.read(photoData)) != -1;)
    os.write(photoData, 0, len);
    os.flush();

然后我创建我的照片对象并返回照片的ArrayList。这消除了NullPointerException,但我现在无法显示ImageIcon JLabel。我使用以下代码将它们添加到JPanel,

InputStream in = new ByteArrayInputStream(photos.get(i).getData());
BufferedImage newImage = ImageIO.read(in);
editImageLabel[i] = new JLabel("");
editImageLabel[i].setIcon(new ImageIcon(newImage.getScaledInstance(imageSize, imageSize, Image.SCALE_DEFAULT)));

然后我将Label放在JPanel上。

1 个答案:

答案 0 :(得分:0)

通过将图像存储在文件系统中,而不仅仅是数据库中图像的路径,避免了编码和解码图像的麻烦。这有助于降低数据库大小,从而有助于提高事务效率。您可以编写一些快速代码,为服务器上的文件创建数字文件名。