解答例 - 実習課題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();
}
}
}
▼データベースの指定

