オブジェクト指向でやる場合の最初から最後までの流れを、実際の例を挙げて書いていくシリーズ「オブジェクト指向で開発の最初から最後までの手順例」(ちなみに、バックナンバーは、ここ)、
現在、「いままでのまとめ」にある、「(4)フレームワークにもとづき、クラスなどの開発手順、雛形の確定」をやっていて、
今、DBアクセスの部分で、サンプルプログラムはつくったので、雛形についてです。
■雛形についての解説
このシリーズ、間隔があいてしまったのと、最近新しい読者が多そうなので、ちょっと雛形について説明しておきます。
このシリーズでは、
(1)仕様書を作成する
(2)雛形を作る
(3)あとは、きまった自動生成プログラムで、じゃんじゃんプログラムを作る
という形で、作業をすすめていきます。
DBと、WebAPI部分は、この方式で自動生成するのですが、今回は、その雛形を作ろうというわけです。これは、サンプルプログラムの固有部分を一般化(変数定義)することで実行します。
ちなみに、自動生成の方法は
ここ http://www.geocities.jp/xmldtp/index_zido.htm
にあって、自動生成ツールは、そこの
プログラムやテストデータを自動生成する方法 その2 インストール。
に詳しく書いてあります。
■DBアクセスの雛形サンプル
ってことは、どうでもよくて、問題はDBアクセスの雛形です。
こんなかんじ
import java.util.*; import java.sql.*; /* * クラス:$#$CELL B3$#$ * 内容:データベースアクセス * */ public class $#$CELL D3$#$ { /* * 検索<BR> * @param HashMap taisho 検索対象、NULLのとき、*(全部) * @param Vector where 条件、NULLのとき、無条件、 * @return Vector 結果(1レコード1ハッシュマップで入っている) */ public Vector select(HashMap map,Vector where) { StringBuffer sqlbuf = new StringBuffer("SELECT "); if ( map == null ) { sqlbuf.append("*"); } else { String[] taisho = (String[])map.keySet().toArray(new String[0]); for(int i = 0 ; i < taisho.length ; i ++ ) { if ( i > 0 ) { sqlbuf.append(","); } sqlbuf.append(taisho[i]); } } sqlbuf.append(" FROM $#$CELL D3$#$ "); String wstr = makeWhere(where); if( ( wstr != null ) && (wstr.trim().length() > 0 ) ) { sqlbuf.append(" WHERE " + wstr); } return selectExec(sqlbuf.toString()); } /* * 追加<BR> * @param HashMap taisho 対象、NULLのときエラー * @return int 0:OK,1:Error */ public int insert(HashMap taisho) { // ステートメントオブジェクトを生成 $#$REP 7$#$ String $#$KETA C$#$ = (String)taisho.get("$#$KETA C$#$");$#$REPEND A$#$ int out_flg; // SQL文の書き出し StringBuffer sqlbuf = new StringBuffer("INSERT INTO $#$CELL D3$#$("); //==========================// // 項目名の書き出し // //==========================// out_flg = 0; $#$REP 7$#$ if ( $#$KETA C$#$ != null ) { if ( out_flg == 0 ) { out_flg = 1; } else { sqlbuf.append(","); } sqlbuf.append("$#$KETA C$#$"); } $#$REPEND A$#$ // VALUES句 sqlbuf.append(") VALUES ("); //==========================// // データの書き出し // //==========================// out_flg = 0; $#$REP 7$#$ if ( $#$KETA C$#$ != null ) { if ( out_flg == 0 ) { out_flg = 1; } else { sqlbuf.append(","); } sqlbuf.append("$#$KETA H$#$"); sqlbuf.append($#$KETA C$#$); sqlbuf.append("$#$KETA H$#$"); } $#$REPEND A$#$ // おしまい部分 sqlbuf.append(")"); // 実行 MyConnection con = (MyConnection)taisho.get("MyConnection"); return exec(sqlbuf.toString(),con); } /* * 削除<BR> * @param HashMap taisho 対象、NULLのとき、全削除 * @return int 0:OK,1:Error */ public int del(HashMap taisho) { // SQL文の書き出し StringBuffer sqlbuf = new StringBuffer("DELETE FROM $#$CELL D3$#$"); if ( taisho != null ) { String wrec = whereOneRec(taisho); if ( ( wrec != null ) && (wrec.trim().length() > 0 ) ) { sqlbuf.append(" WHERE "); sqlbuf.append(wrec); } } MyConnection con = (MyConnection)taisho.get("MyConnection"); return exec(sqlbuf.toString(),con); } /* * 更新<BR> * @param HashMap taisho 対象、NULLのとき、全削除 * @return int 0:OK,1:Error */ public int update(HashMap taisho,Vector where) { // データチェック if ( taisho == null ) { return -1; } if ( taisho.size() <= 0 ) { return -1; } // SQL文の書き出し StringBuffer sqlbuf = new StringBuffer("UPDATE $#$CELL D3$#$ SET "); String rec = setOneRec(taisho); if ( rec == null ) { return -1; } sqlbuf.append(rec); String wstr = makeWhere(where); if( ( wstr != null ) && (wstr.trim().length() > 0 ) ) { sqlbuf.append(" WHERE " + wstr); } MyConnection con = (MyConnection)taisho.get("MyConnection"); return exec(sqlbuf.toString(),con); } /* * SQL実行<BR> * @param HashMap taisho 対象、NULLのとき、全削除 * @return int 0:OK,1:Error */ public int exec(String cmd,MyConnection oldcon) { // System.out.println(cmd); try { // コネクションがない場合:トランザクション処理していない if ( oldcon == null ) { // System.out.println("トランザクションがないモード"); // ドライバクラスをロード Class.forName(MyConnection.MyDriverName); // MySQLの場合 // データベースへ接続 Connection con = DriverManager.getConnection(MyConnection.MyURL, MyConnection.MyUserName,MyConnection.MyPassword); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); // 実行 stmt.execute(cmd); // データベースから切断 stmt.close(); con.close(); } else { oldcon.stmt.addBatch(cmd); } } catch (Exception e) { e.printStackTrace(); return -1; } return 0; } /* * SQLの検索実行<BR> * @param HashMap taisho 対象、NULLのとき、全削除 * @return Vector 結果(1レコード1ハッシュマップで入っている) */ public Vector selectExec(String cmd) { Vector allData = new Vector(); // System.out.println(cmd); try { // ドライバクラスをロード Class.forName(MyConnection.MyDriverName); // MySQLの場合 // データベースへ接続 Connection con = DriverManager.getConnection(MyConnection.MyURL, MyConnection.MyUserName,MyConnection.MyPassword); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); // クエリーを実行して結果セットを取得 ResultSet rs = stmt.executeQuery(cmd); ResultSetMetaData meta = rs.getMetaData(); // 検索された行数分ループ while(rs.next()) { HashMap mp = new HashMap(); for(int i = 1 ; i <= meta.getColumnCount(); i ++ ) { mp.put(meta.getColumnName(i),rs.getString(meta.getColumnName(i)) ); } allData.add(mp); } // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); return null; } return allData; } /* * where句を作る * @param Vector whete * @return String 結果(1レコード1ハッシュマップで入っている) */ public String makeWhere(Vector where) { StringBuffer buf = new StringBuffer(); if ( where == null ) { return null; } else if ( where.size() == 0 ) { return null; } else { if ( where.size() == 1 ) { buf.append(whereOneRec((HashMap)where.elementAt(0))); } else { for(int i = 0 ; i < where.size() ; i ++ ) { if ( i == 0 ) { buf.append("( "); } else { buf.append("OR ( "); } buf.append(whereOneRec((HashMap)where.elementAt(i))); buf.append(" ) "); } } } return buf.toString(); } /* * where句の検索条件のAND1個分を作る * @param HashMap taisho * @return String 結果(1レコード1ハッシュマップで入っている) */ public String whereOneRec(HashMap taisho) { return makeOneRec(taisho," AND "); } /* * set句の更新条件を作る * @param HashMap taisho * @return String 結果(1レコード1ハッシュマップで入っている) */ public String setOneRec(HashMap taisho) { return makeOneRec(taisho," , "); } /* * where句の検索条件のAND1個分を作る * @param HashMap taisho * @return String 結果(1レコード1ハッシュマップで入っている) */ public String makeOneRec(HashMap taisho,String kugiri) { StringBuffer buf = new StringBuffer(); $#$REP 7$#$ String $#$KETA C$#$ = (String)taisho.get("$#$KETA C$#$");$#$REPEND A$#$ int out_flg = 0; $#$REP 7$#$ if ( $#$KETA C$#$ != null ) { if ( out_flg == 0 ) { out_flg = 1; } else { buf.append(kugiri); } buf.append("$#$KETA C$#$ "); char c = 0; if ( $#$KETA C$#$.length() > 0 ) { c = $#$KETA C$#$.charAt(0); } switch(c) { case '<': case '>': case '=': buf.append($#$KETA C$#$); break; case '"': buf.append("="); buf.append($#$KETA C$#$); break; default: buf.append("= "); buf.append("$#$KETA H$#$"); buf.append($#$KETA C$#$); buf.append("$#$KETA H$#$"); break; } } $#$REPEND A$#$ return buf.toString(); } } |
(上記< > ¥は、本当は半角)
ちなみに、$#$の部分が、変数指定です。
H桁に、その項目が文字関係(CHAR,VARCHER)のときは、'を書くようにしています。
それ以外は、ここの仕様書がベースです。共通部分のクラスを使っています。
なお、サンプルのときは字数制限のため削ってしまったコメントなどがあるので、コメントの部分でふえているところがあります。
ってことで、今回はここまで。