解答例 - 実習課題1 - 3.トランザクション処理
(実習課題1)
2章実習課題3のプログラムを改良しなさい。
- テーブルのデータ更新をトランザクション処理に変更する。
解答例
▼データベースアクセス用クラスのソース
package com.techscore.jdbc.chapter3.exercise1; /** * CoonectDataBase.java * TECHSCORE JDBC3章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.DriverManager; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class ProductDAO{ private Connection getConnection() throws SQLException,ClassNotFoundException{ Connection conn = null; 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(); Connection conn = null; try{ conn = getConnection(); final String sql = "select p_num, p_name, type, price" + " from product order by p_num"; Statement statement = conn.createStatement(); ResultSet result = statement.executeQuery(sql); while (result.next()){ Product data = new Product( result.getInt(1), result.getString(2), result.getString(3), result.getInt(4)); list.add(data); } result.close(); statement.close(); }finally{ if (conn != null){ conn.close(); } } return list; } public void update(List list) throws SQLException,ClassNotFoundException{ Connection conn = null; try{ conn = getConnection(); PreparedStatement statement = null; Iterator ite=list.iterator(); for(int i=0; ite.hasNext(); i++){ Product product = (Product)ite.next(); final String sql = "update product set" + " p_name = ? " + ",type = ? " + ",price = ? " + " where p_num = ?"; statement = conn.prepareStatement(sql); statement.setString(1,product.getPName()); statement.setString(2,product.getType()); statement.setInt(3,product.getPrice()); statement.setInt(4,product.getPNum()); statement.addBatch(); } if (statement != null){ int result[]=statement.executeBatch(); conn.commit(); statement.close(); } }finally{ if (conn != null){ conn.close(); } } } public void delete(List list) throws SQLException,ClassNotFoundException{ Connection conn = null; try{ conn = getConnection(); PreparedStatement statement = null; Iterator ite=list.iterator(); for(int i=0; ite.hasNext(); i++){ final String sql = "delete from product " + "where p_num = ?"; statement = conn.prepareStatement(sql); statement.setInt(1,Integer.parseInt(ite.next().toString())); statement.addBatch(); } if (statement != null){ int result[]=statement.executeBatch(); conn.commit(); statement.close(); } }finally{ if (conn != null){ conn.close(); } } } public void insert(Product product) throws SQLException,ClassNotFoundException{ Connection conn = null; try{ conn = getConnection(); PreparedStatement statement = null; final String sql = "insert into product " + "values(?,?,?,?)"; statement = conn.prepareStatement(sql); statement.setInt(1,product.getPNum()); statement.setString(2,product.getPName()); statement.setString(3,product.getType()); statement.setInt(4,product.getPrice()); statement.addBatch(); if (statement != null){ int result[]=statement.executeBatch(); conn.commit(); statement.close(); } }finally{ if (conn != null){ conn.close(); } } } }
▼Product(製品)情報管理クラスのソース
▼テーブル表示ウィンドウ作成クラスのソース
package com.techscore.jdbc.chapter3.exercise1; /** * DisplayProductTable.java * TECHSCORE JDBC3章 実習課題1 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ import java.util.Iterator; import java.util.List; import java.util.LinkedList; import java.sql.SQLException; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class DisplayProductTable extends JPanel implements ActionListener { private JTable table = null; private List list = null; private Object[][] originalData; private static JFrame frame; private Object[][] data; public DisplayProductTable() { super(new GridLayout(2,1)); ProductDAO productDAO = new ProductDAO(); try{ list = (List)productDAO.loadSummary(); //テーブルデータ内容 data = new Object[list.size()][4]; originalData = new Object[list.size()][4]; Iterator ite=list.iterator(); for(int i=0; ite.hasNext(); i++){ Product product = (Product)ite.next(); data[i][0] = new Integer(product.getPNum()).toString(); data[i][1] = product.getPName(); data[i][2] = product.getType(); data[i][3] = new Integer(product.getPrice()).toString(); originalData[i][0] = new Integer(product.getPNum()).toString(); originalData[i][1] = product.getPName(); originalData[i][2] = product.getType(); originalData[i][3] = new Integer(product.getPrice()).toString(); } createParts(data); //表示する部品を生成する }catch(SQLException e){ e.printStackTrace(); System.exit(1); }catch(ClassNotFoundException e){ e.printStackTrace(); System.exit(1); } } private void createParts(Object[][] data){ //テーブルのタイトル String[] columnNames = {"製品ナンバー", "製品名", "製品のタイプ", "製品の価格"}; table = new JTable(data, columnNames); table.setPreferredScrollableViewportSize(new Dimension(400, 100)); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane); JButton bu = new JButton("更新"); bu.setVerticalTextPosition(AbstractButton.BOTTOM); bu.setHorizontalTextPosition(AbstractButton.CENTER); bu.setActionCommand("update"); bu.setSize(20,20); bu.addActionListener(this); JButton bud = new JButton("削除"); bud.setVerticalTextPosition(AbstractButton.BOTTOM); bud.setHorizontalTextPosition(AbstractButton.CENTER); bud.setActionCommand("delete"); bud.setSize(20,20); bud.addActionListener(this); JButton bui = new JButton("挿入"); bui.setVerticalTextPosition(AbstractButton.BOTTOM); bui.setHorizontalTextPosition(AbstractButton.CENTER); bui.setActionCommand("insert"); bui.setSize(20,20); bui.addActionListener(this); JPanel panel = new JPanel(); panel.setSize(10,30); panel.add(bu); panel.add(bud); panel.add(bui); add(panel); } public void actionPerformed(ActionEvent e) { ProductDAO productDAO = new ProductDAO(); if ("update".equals(e.getActionCommand())) { System.out.println("Push Update Button"); List list = (List)checkUpdateData(); try{ productDAO.update(list); }catch(SQLException ex){ ex.printStackTrace(); System.exit(1); }catch(ClassNotFoundException ex){ ex.printStackTrace(); System.exit(1); } } if ("delete".equals(e.getActionCommand())) { System.out.println("Push Delete Button"); List dlist = checkDeleteData(); try{ productDAO.delete(dlist); }catch(SQLException ey){ ey.printStackTrace(); System.exit(1); }catch(ClassNotFoundException ey){ ey.printStackTrace(); System.exit(1); } } if ("insert".equals(e.getActionCommand())) { System.out.println("Push Insert Button"); Product product = createInsertData(); try{ productDAO.insert(product); }catch(SQLException ez){ ez.printStackTrace(); System.exit(1); }catch(ClassNotFoundException ez){ ez.printStackTrace(); System.exit(1); } } frame.setVisible(false); createParts(data); createAndShowGUI(); //再表示 } private Product createInsertData(){ Product product = new Product(); int primaryKey = Integer.parseInt(originalData[originalData.length-1][0].toString()) + 1; product.setPNum(primaryKey); product.setPName("DefaultName"); product.setType("DefaultType"); product.setPrice(0); return product; } private List checkDeleteData(){ List list = new LinkedList(); int[] rows = table.getSelectedRows(); for(int i = 0; i < rows.length; i++){ System.out.println("SelectedRows:" + rows[i]); list.add(originalData[rows[i]][0]); } return list; } private List checkUpdateData(){ int numRows = table.getRowCount(); int numCols = table.getColumnCount(); List list = new LinkedList(); javax.swing.table.TableModel model = table.getModel(); System.out.println("check of data: "); for (int i=0; i < numRows; i++) { System.out.print(" row " + i + ":"); for (int j=1; j < numCols; j++) { System.out.print(" " + model.getValueAt(i, j)); if (!(model.getValueAt(i,j).equals(originalData[i][j]))){ Product product = new Product(); product.setPNum(Integer.parseInt((String)model.getValueAt(i,0))); product.setPName((String)model.getValueAt(i,1)); product.setType((String)model.getValueAt(i,2)); product.setPrice(Integer.parseInt((String)model.getValueAt(i,3))); //更新前データを保存 originalData[i][1] = (String)model.getValueAt(i,1); originalData[i][2] = (String)model.getValueAt(i,2); originalData[i][3] = (String)model.getValueAt(i,3); list.add(product); System.out.println("[UP]"); break; } } System.out.println(); } System.out.println("--------------------------"); return list; } private static void createAndShowGUI() { frame = new JFrame("製品情報テーブル表示"); DisplayProductTable newContentPane = new DisplayProductTable(); newContentPane = new DisplayProductTable(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(newContentPane); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { createAndShowGUI(); } }
▼データベースの指定