解答例 - 実習課題2 - 4.ラージオブジェクト
(実習課題2)
以下のプログラムを作成しなさい。
- 「product_photo」テーブルにある画像データを表示するウィンドウプログラム。
- 製品番号を指定すると、それに対応する画像データがウィンドウに表示されるようにする事。
解答例
▼データベースアクセス用クラスのソース
package com.techscore.jdbc.chapter4.exercise2; /** * ProductPhotoDAO.java * TECHSCORE JDBC4章 実習課題2 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.DriverManager; import java.io.InputStream; import java.sql.ResultSet; public class ProductPhotoDAO{ private PreparedStatement statement = null; private Connection conn = null; private Connection getConnection() throws SQLException,ClassNotFoundException{ Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection("jdbc:postgresql://dbserver:5432/Training" ,"postgres" //ユーザ名 ,""); //パスワード conn.setAutoCommit(false); //自動コミットモード解除 return conn; } public InputStream loadImage(int pNum) throws SQLException,ClassNotFoundException{ conn = getConnection(); InputStream input = null; final String sql = "select p_photo from product_photo where p_num=?"; statement = conn.prepareStatement(sql); statement.setInt(1,pNum); ResultSet result = statement.executeQuery(); if (!result.next()) { System.out.println("製品番号" + pNum + "の画像はありません"); throw new SQLException(); }else{ input = result.getBinaryStream(1); } conn.commit(); return input; } public void finishTransaction() throws SQLException{ try{ statement.close(); }finally{ if (conn != null){ conn.close(); } } } }
▼データ挿入測定クラスのソース
package com.techscore.jdbc.chapter4.exercise2; /** * DisplayImageData.java * TECHSCORE JDBC4章 実習課題2 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel;import java.io.InputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.SQLException; public class DisplayImageData extends JFrame { protected static final String OUTFILE = "outImage.gif"; public DisplayImageData(){ super("データベースから読み込んだ画像"); setDefaultCloseOperation(EXIT_ON_CLOSE); JLabel label = new JLabel(new ImageIcon(OUTFILE)); getContentPane().add(label); pack(); } public static void main(String[] args) { try { ProductPhotoDAO photoDAO = new ProductPhotoDAO(); int pNum =Integer.parseInt(args[0]); InputStream input = photoDAO.loadImage(pNum); //表示用ファイルへ保存 FileOutputStream output = new FileOutputStream(OUTFILE); int bdata; while ((bdata = input.read()) != -1) { output.write(bdata); } output.close(); input.close(); photoDAO.finishTransaction(); //画像表示 new DisplayImageData().setVisible(true); }catch(SQLException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch (ArrayIndexOutOfBoundsException e) { System.out.println("Usage:java InsertImageData [製品番号] [画像ファイル名]"); }catch(FileNotFoundException e){ e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } }
▼データベースの指定