解答例 - 実習課題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 ==============