ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

オブジェクト指向で開発の最初から最後までの手順例-その33:雛形(6)

2007-11-14 14:58:46 | 開発ネタ

オブジェクト指向でやる場合の最初から最後までの流れを、実際の例を挙げて書いていくシリーズ「オブジェクト指向で開発の最初から最後までの手順例」(ちなみに、バックナンバーは、ここ)、

 現在、「いままでのまとめ」にある、「(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)のときは、'を書くようにしています。
それ以外は、ここの仕様書がベースです。共通部分のクラスを使っています。



なお、サンプルのときは字数制限のため削ってしまったコメントなどがあるので、コメントの部分でふえているところがあります。

ってことで、今回はここまで。


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« グーグルケータイOS、Android... | トップ | グーグルケータイOS Android... »
最新の画像もっと見る

開発ネタ」カテゴリの最新記事