DAOクラスの作成
では、続いて用意したデータベースにアクセスするためのDAO(Data Access Object)クラスを作成しましょう。これは、Javaのクラスとして用意してもいいですが、今回はZKのスクリプトにそのまま埋め込んで利用できる形で作ることにします(スクリプトはこの後に作成します)。
public class DAO { String url = "jdbc:derby:C:\\DerbyDatabases\\sampledata;create=true"; public DAO() { try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public List findAll(){ java.sql.Connection conn = null; java.sql.Statement stmt = null; List allDatas = new ArrayList(); try { conn = java.sql.DriverManager.getConnection(url); stmt = conn.createStatement(); String query = "select * from SampleRowData"; java.sql.ResultSet rs = stmt.executeQuery(query); gmsg = query; SampleRowData data; while (rs.next()) { data = new SampleRowData(); data.setName(rs.getString(1)); data.setMail(rs.getString(2)); data.setTel(rs.getString(3)); allDatas.add(data); } } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; } finally { try { stmt.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); gmsg = e; } } return allDatas; } public boolean delete(String name){ java.sql.Connection conn = null; java.sql.Statement stmt = null; boolean result = false; try { conn = java.sql.DriverManager.getConnection(url); stmt = conn.createStatement(); if (stmt.executeUpdate("delete from SampleRowData where name = '" + name + "'") > 0){ result = true; } } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; }finally { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); gmsg = e; } try { conn.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; } } return result; } public boolean insert(SampleRowData data){ java.sql.Connection conn = null; java.sql.Statement stmt = null; boolean result = false; try { conn = java.sql.DriverManager.getConnection(url); stmt = conn.createStatement(); String query = "insert into SampleRowData(name,mail,tel) " + "values ('" + data.getName() + "','" + data.getMail() + "','" + data.getTel() + "')"; gmsg = query; if (stmt.executeUpdate(query) > 0){ result = true; } } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; } finally { try { stmt.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; } try { conn.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); gmsg = e; } } return result; } public boolean update(SampleRowData data){ java.sql.Connection conn = null; java.sql.Statement stmt = null; boolean result = false; try { conn = java.sql.DriverManager.getConnection(url); stmt = conn.createStatement(); if (stmt.executeUpdate("update SampleRowData set mail = " + data.getMail() + ",tel = '" + data.getTel()+ "' where name = '" + data.getName() + "'") > 0){ result = true; } } catch (java.sql.SQLException e) { e.printStackTrace(); }finally{ try { stmt.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (java.sql.SQLException e) { e.printStackTrace(); } } return result; } }
DAOクラスには、全データを検索し返す「findAll」、データを追加する「insert」、データを更新する「update」、データを削除する「delete」というメソッドを用意しておきました。いずれも、データをオブジェクトとしてまとめるための「SampleRowData」クラスのインスタンスとしてデータを扱うようにしてあります。以下にざっと整理しておきましょう。
findAllメソッド
データベースにアクセスし、SampleRowDataテーブルのデータを取得し、SampleRowDataインスタンスのListとして返すものです。データベースへのアクセスは、java.sql.DriverManagerのgetConnectionでデータベースに接続し、createStatementでStatementインスタンスを用意し、executeQueryでクエリーを実行する、という形で行います。
conn = java.sql.DriverManager.getConnection(url); stmt = conn.createStatement(); String query = "select * from SampleRowData"; java.sql.ResultSet rs = stmt.executeQuery(query);
後は、executeQueryで取得したResultSetから、順にデータを取り出し、SampleRowDataインスタンスを作成してListに保管する、といったことを繰り返していきます。Listの形でデータがまとめられていれば、後でスクリプトから利用する場合も扱いやすくなるでしょう。
while (rs.next()) { data = new SampleRowData(); data.setName(rs.getString(1)); data.setMail(rs.getString(2)); data.setTel(rs.getString(3)); allDatas.add(data); }
insert/updateメソッド
insertは追加のためのメソッドです。引数にSampleRowDataを渡すと、これをデータベースに追加します。DriverManager.getConnectionでデータベースに接続し、createStatementでStatementを作成した後、executeUpdateでクエリーを実行する、という手順は同じです。
conn = java.sql.DriverManager.getConnection(url); stmt = conn.createStatement(); String query = "insert into SampleRowData(name,mail,tel) " + "values ('" + data.getName() + "','" + data.getMail() + "','" + data.getTel() + "')"; if (stmt.executeUpdate(query) > 0){……
updateも、基本的な流れは同じです。引数にSampleRowDataインスタンスを渡すと、そのnameのデータを更新します。
deleteメソッド
引数に、削除するデータのnameを渡すと、そのデータをデータベースから削除します。これも基本的な流れは同じです。
stmt.executeUpdate("delete from SampleRowData where name = '" + name + "'");