- PR -

データベースアクセスの方法について

投稿者投稿内容
きよ
常連さん
会議室デビュー日: 2002/03/27
投稿数: 21
投稿日時: 2002-03-28 05:00
おはようございます。
高橋です。

データベースを使用したWebアプリケーションを
Java(Servlet,JSP)ではじめて開発することになりました。
このような場合、データベースへのアクセスは
どのように実現するのがよいのでしょうか。
調べてみて次のような方法があるのかな
と思っています。
また、自分なりのコメントを※に記述しています。
1.従来のCGIでの開発のようにオブジェクト指向的ではなく、
  プログラマーはJDBC APIを直接使用して
  SQLを発行する。
※Pro*Cを使ってCGIを開発したことはあるため、
 仕組みは理解しやすいが、データベース製品が変更した場合、
 修正箇所が散在しそうで不安。
 また、オブジェクト指向的ではないため、
 機能変更・追加などの修正・保守がたいへんになりそう。
 
2.基本的には1の方法と同じであるが、
  プログラマーは直接JDBC APIは使用せずに、
  JDBCをラッピングしたクラスを使用する。
  (これをData Access Objectという?)
  このクラスでデータベース製品間の違いを吸収できるので、
  データベースが変更になった場合アプリケーションへの
  変更を局所化できる。
※方法1のコメントと基本的ではあるが、データベースの差異は
 吸収できるからちょっとはましなのだろうか。
 ただ実現方法についてはイメージは沸いていない状況である。
 何かよい情報があったら教えていただきたい。

3.オブジェクト・リレーショナルマッピングの仕組みを導入する。
  オブジェクト・リレーショナルマッピングを実現する製品が
  いくつか出ているようである。
※オブジェクト指向であり、なんとなく良さそうな感じを抱いている。
 ただ、製品を購入することはできないため、自分で実現しなければ
 ならない。どのように実現したらよいのだろうか。
 参考になる記事、ソースプログラム、本などあったら
 教えていただきたい。
 また、パフォーマンスの確保・チューニングも対応に不安を
 感じている。

4.EJBを使用する。
※今回の開発ではEJBサーバは導入できないため、採用できない。
 また、技術的にもすぐには対応できそうにないため、
 しばらく様子をみたいと思っている。
 パフォーマンスの確保もスキル・経験が必要という話を
 聞いたことがある。

実際に現場ではどのように実現しているのでしょうか。
なにかコメント、ヒントをいただければうれしいです。
よろしくお願いします。
愚者
会議室デビュー日: 2002/03/20
投稿数: 9
投稿日時: 2002-03-28 11:08
私は2番かな・・・
Model(?データ)のインスタンスを生成するクラスをつくります。
そのクラスがDAOになる。(のかな?)
デザインパターンでいうFactoryパターンです。
実際にはConnectionを生成するクラスを作ってデータベースにアクセスします。

おまけ
・ServletになるとConnectionプールを使う必要があると思います。(アクセス数とかによるが・・・)
・またタグや&(アンパサンド)の処理に気をつける必要があります。
・Connection#prepareStatementは'(シングルクォーテーション)を気にしなくていいので便利です。


miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-03-28 13:18
DAOについてはJ2EE Design Patternsに例があります。
J2EE Patternは"Core J2EE Patterns: Best Practices and Design Strategies"という本の形でまとめられていますが、本の方が説明は詳しかったと思います。

EJBに関しては、商用のものでもダウンロードして試せますし、JBossのようなオープンソース実装もありますので、実際に動かしてみて判断するということもできます(JBossについては私のWebサイトを見て!)。確かに、面倒な部分もありますが、オブジェクト指向であること、APサーバ間でポータブルであること、コードを変更せずにDBを切りかえられるというのは強みだと思います。
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2002-03-29 21:06
> Model(?データ)のインスタンスを生成するクラスをつくります。
> そのクラスがDAOになる。(のかな?)
> デザインパターンでいうFactoryパターンです。
> 実際にはConnectionを生成するクラスを作ってデータベースにアクセスします。
DAO(Data Access Object)は、特定のDBMSに依存しないアクセス方法を提供する
デザイン・パターンです。
Factoryというよりは、Adapterと呼ぶほうがいいですね。Bridgeも含んでますが・・・。

> おまけ
> ・またタグや&(アンパサンド)の処理に気をつける必要があります。
> ・Connection#prepareStatementは'(シングルクォーテーション)を気にしなくていいので便利です。
まさに、このことを述べてますね!!!
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=930&forum=12&3
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-03-30 11:06
引用:

謎の白覆面さんの書き込み (2002-03-29 21:06) より:
> Model(?データ)のインスタンスを生成するクラスをつくります。
> そのクラスがDAOになる。(のかな?)
> デザインパターンでいうFactoryパターンです。
> 実際にはConnectionを生成するクラスを作ってデータベースにアクセスします。
DAO(Data Access Object)は、特定のDBMSに依存しないアクセス方法を提供する
デザイン・パターンです。
Factoryというよりは、Adapterと呼ぶほうがいいですね。Bridgeも含んでますが・・・。


視点を変えれば、Factory(or Abstract Factory)も含んでいます。
共通のインタフェースのもとOracleDAO,Db2DAOなど複数のDAOがあるとき、実装を提供するのはFactoryです。
きよ
常連さん
会議室デビュー日: 2002/03/27
投稿数: 21
投稿日時: 2002-03-31 09:03
こんにちは。
高橋です。

愚者さん、mikiさん、謎の白覆面さん、返信ありがとうございます。
オブジェクト指向やデザインパターンについて無知なため、
なかなかコメントできないでいました。(^^;)
返信遅れて申し訳ありませんでした。

いくつか質問がございます。

愚者さんが書きました。
> Model(?データ)のインスタンスを生成するクラスをつくります。
> そのクラスがDAOになる。(のかな?)
このクラスは例えば、ユーザ、受注、在庫クラスのような
ものだと思うのですが、
(1)これらのクラスを利用するプログラムではJDBC API
(java.sql.Connectionオブジェクトなども含む)を
全く意識しない形なのでしょうか。
(2)トランザクション制御はどのように実現しているのでしょうか。
例えば、受注クラスのDB変更メソッドを呼び出した後、
在庫クラスのDB変更メソッドの実行に失敗した場合、
どのようにロールバックしているのでしょうか。
Transactionクラスのようなものを導入しているのでしょうか。
(3)これらのModelクラスはDAOではない。
ということでよろしいでしょうか。

mikiさんが書きました。
> DAO(Data Access Object)は、特定のDBMSに依存しないアクセス方法を提供する
> デザイン・パターンです。
勉強になります。
(4)受注や在庫のようなDBにアクセスするクラスは
特定のDBMSに依存しないDAOインターフェイスを使う。
DAOインターフェイスの実装クラス(例えば、OracleDAO)では
直接JDBC APIを使用する。
ということでよろしいでしょうか。
(5)具体的にはDAOインターフェイスにはどのようなメソッドを
定義したらよろしいのでしょうか。
検索、更新、挿入、削除のインターフェイスをどのように
定義したらよいのか分からないでいます。
public interface DAO {
// DB Connectionの取得
public void openConnection() throws ...;

// DB Connectionの返却
public void returnConnection() throws ...;

// 検索インターフェイス
?????
......
}

何かコメントを頂けるとうれしいです。
よろしくお願いします。
きよ
常連さん
会議室デビュー日: 2002/03/27
投稿数: 21
投稿日時: 2002-04-01 05:31
おはようございます。
高橋です。

>mikiさんが書きました。
>> DAO(Data Access Object)は、特定のDBMSに依存しないアクセス方法を提供する
>> デザイン・パターンです。
mikiさんではなく、謎の白覆面さんのご発言でした。
失礼いたしました。
愚者
会議室デビュー日: 2002/03/20
投稿数: 9
投稿日時: 2002-04-01 11:15
Javaを始めてまだ経験の浅い私が答えるのもなんか笑えますが・・・

ではお答えしましょう(藁

(1)
コネクションは内部で作っていません。
なぜなら、私の作っているDAOというのは
ひとつのテーブルに対して
Insert と Update をするものを作っているからです。
Connectionはビジネスロジックの部分に一つ使うというのが
トランザクションを考える上でやりやすいですね。
またConnectionはインターフェイスなのでDBには依存しません。
なので
public insertQuery(Connection con) throws SQLException
というメソッドにしています。
(ちなみにSelectするほうは複数に対してリレーションしてます)

(2) 1で答えたメソッドのようにExceptionをスローしてます。
Exceptionは自分で作ってもいいし、SQLExceptionを投げてもいいですね・・・・

(3) はい ModelとDAOは別です。
DAOはDBMSを表に出さないようにするためものと考えています。
わたしのModelの解釈がおかしいかもしれませんが・・・
データクラスと呼んだほうがいいのかな????

以上でよろしいですかな?
わたしもまだいろいろ試し中なのでなんかいい案あったらおしえてちょ(はぁと)
最後に雑な文書ですいません。

スキルアップ/キャリアアップ(JOB@IT)