解答例 - 実習課題2 - 5.ResultSetを用いた更新処理
(実習課題2)
以下のコンソールアプリケーションを作成しなさい。
- まず「product」テーブルの値を表示する。
- 表示後、新しいデータの挿入を行う。挿入する値は、コンソールからの入力によって指定するようにする事。
- プログラム実行後、入力したデータがテーブルに挿入されている事を確認する事。
解答例
▼データベースアクセス用クラスのソース
package com.techscore.jdbc.chapter5.exercise2;
/**
* ProductDAO.java
* TECHSCORE JDBC5章 実習課題2
*
* Copyright (c) 2004 Four-Dimensional Data, Inc.
*/
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.util.LinkedList;
import java.util.List;
public class ProductDAO{
private ResultSet result = null;
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 List loadSummary() throws SQLException,ClassNotFoundException{
List list = new LinkedList();
conn = getConnection();
final String sql = "select p_num, p_name, type, price" +
" from product order by p_num";
statement = conn.prepareStatement(
sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
result = statement.executeQuery();
while (result.next()){
Product data = new Product(
result.getInt(1),
result.getString(2),
result.getString(3),
result.getInt(4));
list.add(data);
}
return list;
}
public void insert(Product product) throws SQLException{
result.moveToInsertRow();
result.updateInt(1,product.getPNum());
result.updateString(2,product.getPName());
result.updateString(3,product.getType());
result.updateInt(4,product.getPrice());
result.insertRow();
result.moveToCurrentRow();
}
public void finishTransaction() throws SQLException{
try{
result.close();
statement.close();
conn.commit();
statement.close();
}finally{
if (conn != null){
conn.close();
}
}
}
}
▼Product(製品)情報管理クラスのソース
▼テーブル表示ウィンドウ作成クラスのソース
package com.techscore.jdbc.chapter5.exercise2;
/**
* DisplayProductTable.java
* TECHSCORE JDBC5章 実習課題2
*
* Copyright (c) 2004 Four-Dimensional Data, Inc.
*/
import java.util.Iterator;
import java.util.List;
import java.io.DataInputStream;
import java.io.IOException;
import java.sql.SQLException;
public class DisplayProductTable{
private static ProductDAO productDAO = null;
private static void displayData() {
//テーブルのタイトル
String[] columnNames = {"番号",
"名前",
"タイプ",
"価格"};
try{
productDAO = new ProductDAO();
List list = (List)productDAO.loadSummary();
//テーブルデータ内容
Object[][] data = new Object[list.size()][4];
Iterator ite=list.iterator();
for(int i=0; ite.hasNext(); i++){
Product product = (Product)ite.next();
System.out.println(columnNames[0] + ":"
+ product.getPNum()
+ "\t"
+ columnNames[1] + ":"
+ product.getPName()
+ "\t"
+ columnNames[2] + ":"
+ product.getType()
+ "\t"
+ columnNames[3] + ":"
+ product.getPrice());
}
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
private static Product inputData(){
Product product = new Product();
try{
DataInputStream input = new DataInputStream(System.in);
System.out.println("■新データ入力");
System.out.println("製品番号入力:");
product.setPNum(Integer.parseInt(input.readLine()));
System.out.println("製品名入力 :");
product.setPName(input.readLine());
System.out.println("製品型入力 :");
product.setType(input.readLine());
System.out.println("製品価格入力:");
product.setPrice(Integer.parseInt(input.readLine()));
System.out.println("挿入しました");
}catch(IOException e){
e.printStackTrace();
}
return product;
}
public static void main(String[] args) {
System.out.println("■最初のデータベースの内容");
displayData();
//データ入力
Product product = inputData();
try{
productDAO.insert(product);
productDAO.finishTransaction();
System.out.println("■変更後データベースの内容");
displayData();
productDAO.finishTransaction();
}catch(SQLException e){
System.out.println("■入力された製品番号は既にあります");
e.printStackTrace();
}
}
}
▼データベースの指定
▼実行結果例
============== ■最初のデータベースの内容 番号:101 名前:Accort タイプ:sedan 価格:230 番号:102 名前:Accort Wagon タイプ:RV 価格:280 番号:103 名前:Insphire タイプ:sedan 価格:500 番号:104 名前:Hodyssey タイプ:RV 価格:280 番号:105 名前:Shtep Wagon タイプ:RV 価格:200 番号:107 名前:Accort タイプ:sedan 価格:290 ■新データ入力 製品番号入力: 108 製品名入力 : MarlX 製品型入力 : sedan 製品価格入力: 400 挿入しました ■変更後データベースの内容 番号:101 名前:Accort タイプ:sedan 価格:230 番号:102 名前:Accort Wagon タイプ:RV 価格:280 番号:103 名前:Insphire タイプ:sedan 価格:500 番号:104 名前:Hodyssey タイプ:RV 価格:280 番号:105 名前:Shtep Wagon タイプ:RV 価格:200 番号:107 名前:Accort タイプ:sedan 価格:290 番号:108 名前:MarlX タイプ:sedan 価格:400 ==============

