Javaデータアクセスオブジェクト(DAO)モードエントリをプログラミング

J2EE開発者は分離基礎となるビジネス・ロジックのデータアクセスオブジェクト(DAO)デザインパターンとデータアクセスロジック・レベルを使用します。DAOの実装モードは、この記事では、データアクセスコードを書くことに集中することができ、Java開発者ショーンC.サリバンから。トランザクション境界、例外処理、ログ記録:三つの側面には、DAOプログラミングの構造的特徴を検討し
、最後の18ヶ月で、Iと良いソフトウェア開発チームは、私たちにカスタムのWEBベースのサプライチェーン管理アプリケーションを開発するために、一緒に作業します。出荷状況、サプライチェーンシステム、在庫、出荷、プロジェクト管理データ、およびユーザ属性を含むデータ永続化層の広い範囲を、アクセスするためのアプリケーション。私たちは、当社のさまざまなデータベース・プラットフォームに接続するためのJDBC APIを使用して、アプリケーション全体DAOデザインパターンのアプリケーション。
アプリケーションデータアクセスオブジェクト(DAO)デザインパターンで全体のアプリケーションでは、私たちは、上から別のロジックとビジネスロジックの基礎となるデータにアクセスすることができます。私たちは、CRUDを提供するために、各データソース用に作成しました(作成、)DAOクラスの操作を削除し、更新をお読みください。
この記事では、私はDAOの実装戦略を紹介し、多くを作成します。技術のDAOクラス。私は明確なロギング、例外処理、および3つの技術の事務部門を紹介します。あなたはこれらの3つの技術を組み合わせた方法をあなたのDAOクラスで学びます。この記事では、JDBCに精通していることを前提としていAPI、SQLとリレーショナルデータベースプログラミング。
のは、DAOデザインパターンとデータアクセスオブジェクトを見てみましょう。
DAOベースの
DAOモードは、標準のJ2EEデザインパターンの一つである。開発者は、このモードのデータアクセス動作と、上部基礎となるビジネスを使用します典型的なロジック別DAOいくつか以下を達成する構成要素:
1. DAOファクトリー・クラス;
2. DAOインターフェースと
; 3. DAOインターフェイスは、具体的なクラスを実装
4.データ転送オブジェクト(時に目標値と呼ばれます)。
コンクリートDAOクラスを使用すると、技術的なデータアクセスオブジェクトを設計および実装する方法を学習します。この下の特定のデータソースからデータにアクセスするためのロジックが含まれています。
トランザクション境界:
1重要なことで覚えておくべきは、彼らがDAOということですこれは、トランザクションオブジェクトである。各動作は、DAO(のような、更新を作成する、またはデータを削除)が行われ、トランザクションが関連している。同様に、トランザクション境界(トランザクション境界)の概念は特に重要である。
トランザクション境界は、です分割方法.J2EEトランザクション仕様を定義するトランザクション定義は、2つのモードを説明:プログラムトランザクション(プログラミング)と宣言的トランザクションテーブルは、これらの2つのモードが分割され(宣言)を:
トランザクション境界の宣言型プログラミングをトランザクション境界の
トランザクションのEJBデプロイメント記述子を使用して、プログラマが宣言ライト・トランザクション・ロジック・プログラマが責任コードを取る属性。
自動的にAPIインタフェースを介してトランザクションを制御するトランザクション・アプリケーション・プログラムを管理するために、これらの属性を使用してランタイム環境(EJBコンテナ)。
私はプログラムによるトランザクション境界に焦点を当てます。
前の説明のように、のような、のDAOは、トランザクションオブジェクトの一部です。作成などの一般的なDAOを実行するために、アップデートを そして、DAOを設計する際に、自分自身に次の質問をした最初の質問トランザクション操作を削除します。
?トランザクションを開始する方法になり、1
?2、トランザクションが終了何だろう
?3を、そのオブジェクトがトランザクションの責任の開始と仮定します
4、オブジェクトは?トランザクションの終わりのための責任を負います
、5 DAOは、責任開始とトランザクションの終了?とるべき
6を、アプリケーションが複数のクロスDAO?やるアクセスする必要がある
7は、トランザクションが1つまたは複数のDAOのDAO含まれている?
DAOを含む、8方法で他のDAO?
これらの質問に答えることは、トランザクション境界DAOオブジェクトはADOメソッドでトランザクション境界のための2つの主要な戦略を持っているための最善の策は、トランザクション境界の責任を負うためにDAOを使用することです選ぶのに役立ちます。...他はの拡張であります総務、それはメソッド呼び出しDAOオブジェクトへのトランザクション境界である。あなたは、元を選択した場合は、DAOクラスでトランザクションコードを埋め込むことになるでしょう。あなたは後者を選択した場合は、トランザクションコードはDAOクラスの外に書き込まれます。我々は、単純なを使用します。 。コード例は、より良い、これらの2つの方法がどのように機能するかを理解するために
、実施例1 2つのデータ操作にDAOを示しています作成する(作成)および更新(アップデート):
公共ボイドcreateWarehouseProfile(WHProfileプロフィール);
公共updateWarehouseStatusボイド(WHIdentifier ID、StatusInfoステータス);
DAOクラス注外例2は、単純なトランザクション、トランザクションコード分割を示します。この例では、DOAのトランザクションに複数の動作の発信者。
TX )(.begin; //スタートザ・トランザクション
dao.createWarehouseProfile(プロフィール);
dao.updateWarehouseStatus(STATUS1でID1、);
dao.updateWarehouseStatus(ID2、STATUS2);
tx.co MMIT(); //トランザクションを終了し
、このトランザクショントランザクション境界戦略がために、単一のトランザクションで複数のDAOにアクセスするアプリケーションのために特に重要です。
また.JDBCのトランザクション境界の区分は、JTAトランザクションのトランザクション境界よりも簡単です達成するためのJava Transaction API(JTA)を使用することができますJDBC APIを使用することができますが、JTAは、より高い柔軟性を提供します。以下の期間では、我々はさらに意志。トランザクション境界機構を参照
JDBCトランザクション境界の使用
JDBCトランザクションは、接続オブジェクト.JDBC接続インタフェース(のjava.sql.Connection)を使用して制御される2つのトランザクションモードを提供する:自動および手動提出提出.Java.sql.Connection事務の制御のために、以下の方法:
.public無効にsetAutoCommit(ブール)
.public getAutoCommitブール()
コミット()無効.public
.publicボイドROLLBACK()
の例3をJDBC APIを使用してトランザクションを区分する方法を示しています。
インポートjava.sqlの*。 ;
インポートjavax.sqlで* ;.
// ...
のDataSourceのds = obtainDataSource();
接続CONN = ds.getConnection();
conn.setAutoCommit(偽);
// ...
てpstmt = conn.prepareStatement(「; UPDATE MOVIES ...「;);
pstmt.setString(1、 ";大脱走で";);
pstmt.executeUpdate();
// ...
conn.commit();
// ...
JDBCトランザクション境界を使用して、あなたは、複数のSQL文を置くことができます単一のトランザクション.JDBC取引の欠点の一つは、トランザクション・スコープである単一のデータベース接続に制限されている。JDBCトランザクションは複数のデータベースにまたがることはできません。次に、私たちは何をするのJTAトランザクション境界を使用する方法について説明しますJTAは広く理解されるようにJDBCようではありませんので、私は最初のJTA何をまとめるため。
JTAはの概要を提供
するJavaトランザクションAPI(JTA;のJavaトランザクションAPI);として、その同胞のJavaトランザクション・サービス(JavaトランザクションサービスJTSを) J2EEプラットフォームは、分散トランザクションサービスを提供する。分散トランザクション(分散トランザクション)は、任意のタイプのトランザクションマネージャ(トランザクションマネージャ)と1つ以上のリソースマネージャ(リソース・マネージャ)。リソース・マネージャ(リソース・マネージャ)を含みます永続的なデータストレージ。トランザクションマネージャ(トランザクションマネージャ)駅での相互通信手段の参加の全ての事項について責任を負うトランザクションマネージャとリソース管理の関係を示しています
JTAトランザクションはJTAトランザクションが複数の参加者を持つことができますJDBCの取引よりも強力で、JDBCトランザクションは、Javaプラットフォームの次のコンポーネントのいずれかでの単一のデータベース接続に限られていたJTAトランザクションに参加することができます..:
JDBC接続
.JDOのPersistenceManagerがオブジェクト
.JMSキューを
.JMSテーマ
。のEnterprise JavaBeans(EJB)
コンパイルされたリソース割当を持つ。J2EEコネクタアーキテクチャ仕様。
JTAトランザクション境界を使用して
塗布法javax.transaction.UserTransactionインタフェース呼び出し、トランザクションを分割するJTAを使用する。実施例4 UseTransactionは、オブジェクトの典型的なJNDI検索を示しています。
* ;.のjavax.transactionをインポート
インポートするjavax.naming * ;.
// ...
のInitialContext CTX =新新のInitialContext();
オブジェクトtxObj ctx.lookup =(「; Javaの:コンプを/ UserTransactionの「;);
のUserTransaction UTX =(のUserTransaction)txObj;
アプリケーションがUserTransactionオブジェクト参照を持った後、トランザクションとして例5として開始することができます。
utx.begin();
// ...
データソースobtainXADataSource DS =( );
接続ds.getConnectionコネチカット=();
てpstmt = conn.prepareStatement( "; UPDATE映画...";);
pstmt.setString(1、 ";脊髄タップ";);
pstmt.executeUpdate();
// ...
utx.commitは();
// ...
アプリケーションがcommit()を呼び出すと、トランザクションマネージャは、2つを使用するには、セグメントトランザクション.JTAトランザクション制御方法を終了するコミットプロトコル:
.javax.transaction.UserTransactionインタフェースは、次のトランザクション制御方法を提供する:
無効.public開始()
)(コミット無効.public
).public空隙ROLLBACK(
getStatusメソッドを無効.public( )
)setRollbackOnlyメソッドを(無効.public
.public無効にsetTransactionTimeoutを(int型)
アプリケーションコールが始まる()トランザクションを開始するために、あなたはまた、ロールバック()トランザクションを終了するために呼び出すことができます)(コミット呼び出すことができます。
JTAとJDBCを使用します
開発者は多くの場合、基礎となるデータDAOクラスとして動作するようにJDBCを使用しています。あなたはJTAを使用してトランザクションを区別する場合は、javax.sql.XADataSourceを、javax.sql.XAConnectionとするjavax.sql.XAResourceは、JDBCドライバのインタフェースと実現が必要になります。これらのドライバインタフェースはJTAトランザクションに参加することができるようになります実装。れるXAConnection XADataSourceのオブジェクトは、オブジェクトファクトリ.XAConnectionsで接続JTAトランザクションに関与している。
あなたはのXADataSourceオブジェクトを作成するために、アプリケーション・サーバー管理ツールを使用する必要があります。のために特別な指示は、アプリケーション・サーバーのドキュメントとJDBCドライバのドキュメントを参照してください。
J2EEアプリケーションは、データソースを見つけるために、JNDIを使用しています。アプリケーションは、データ・ソース・オブジェクトへの参照を持っていたら、それは取得するjavax.sql.DataSource.getConnection()を呼び出します。データベースへの接続。
覚えておくために、非XA接続から異なるXA接続は、接続がJTA XAトランザクションの参加者であるということである。これは、JDBC XA接続が自動コミット機能をサポートしていないことを意味します。そのアプリケーションがXAでありません接続にjava.sql.Connection.commit()またはjava.sql.Connection.rollback()を呼び出します。その代わり、アプリケーション 使用UserTransaction.begin()、UserTransaction.commit()とUserTransaction.rollback()。
最善の方法を選択し
、我々が議論してきたが、JDBCおよびJTAトランザクションを分割する方法である。それぞれの方法は、その利点を持って、このバックあなたは次のようにクラスが要約されているDAO DAOクラスを作成するために、JDBC APIを使用してトランザクション境界のプロジェクトのために、最近、私たちのチームに多くのことを自分のアプリケーションに最適な選択方法を決定する必要があり..
。トランザクション境界コードはDAOクラスに埋め込まれています内部
.DAOクラスはトランザクション境界用のJDBC API使用
方法の呼び出し元をトランザクションを分割しない
トランザクションスコープは、JDBCでの単一の接続に制限され
、複雑なエンタープライズアプリケーションのためのJDBC取引必ずしも有効ではありません。あなたのトランザクションが複数またがる場合DAOオブジェクトまたは複数のデータベースには、次の実装戦略は、より適切かもしれない:
トランザクションはJTAに分割するために
。トランザクション境界コードはDAOから分離されている
。呼び出し側は総務部の責任を負い
.DAOグローバル・トランザクションに参加
するJDBCメソッドそのシンプルさの、魅力的なので、JTAの方法は、より多くの柔軟性を提供します。あなたはあなたのアプリケーションの特定のニーズに依存します実装の種類を選択します。
ロギングとDAO
良いDAO実装クラスは、ロギングを使用します。その実行時の動作の詳細をキャプチャします。あなたは、例外、設定情報、接続状態、全体の開発段階のためのログは有益です。JDBCドライバーのメタデータやクエリパラメータをログに記録するかを選択することができます。私は常にアプリケーションの開発をチェックテストと製品の間にログインする時に。
この中で、我々が表示されますどのようにジャカルタCommaonsログのいくつかの組み合わせ DAOの例私たちは始める前に、いくつかの基本を復習しましょう。
ログの例のライブラリを選択し
、多くの開発者は、ログの基本的なフォームを使用するには、ある:.のSystem.out.println文と、このSystem.err.println.Println 。フォーム迅速かつ便利な、しかし、彼らは次の表は、Javaプラットフォームライブラリはログ一覧表示されます完全なログシステム機能を提供していない:
?それをのURLを開いて、ライブラリをログに記録
するjava.util.loggingありません
ジャカルタLog4jには、
Jakarta CommonsのロギングHTTPです:/Jakarta.apache.org/commons/logging.html
のjava.util.loggingしかしJ2SE1.4上の標準プラットフォームのAPIで、ほとんどの開発者は、ジャカルタのLog4jは多くを提供することに同意するものとします。利点の一つを持つjava.util.loggingを超えた偉大な機能と柔軟性.Log4jは、J2SE1.3とJ2SE1.4プラットフォームをサポートしていることです。
Jakarta Commonsのロギングを一緒に使用してjava.util.logginやジャカルタのLog4j作業することができます。コモンズのロギングは、アプリケーションの独立した抽象化レイヤのロギングの実装である。コモンズは、あなたがデータ交換に使用するログインプロファイルはJAKARTA Struts1.1 .CommonsロギングおよびジャカルタHttpClient2を使用されて変更することにより、以下のログを用いて実施することができます。 0
例示的なログ
例7 DOAクラスログインジャカルタコモンズを使用する方法を示し
*インポートorg.apache.commons.logging ;.
クラスDocumentDAOImpl実装DocumentDAO
{
静的民間最終LogFactory.getLogログ=ログ(DocumentDAOImpl.class) ;
公共ボイドdeleteDocument(文字列ID)
{
... //
log.debug( ";削除文書:"; + ID);
// ...
試し
{
// ... ...データ操作
}
キャッチ(SomeException EX)
{
log.error(「; 「削除できませんへの文書; EX);
// ...例外で扱う...
}
}
}
ログはDAOに障害が発生した場合、ログは、多くの場合、何が起こったのか理解するために、アプリケーションの評価の重要な部分です。エラーが最良の情報を提供します。あなたにログインし、デバッグし、問題が取得するために解決するための有効な手段を確保するために、DAOを兼ね備えています。
DAO例外処理
我々は、彼らがデータに適用される方法のために今トランザクション境界とログを見て、としました深い理解のオブジェクトへのアクセス権を持っている。例外処理を議論するために私たちの3番目と最後の部分です。次は、より堅牢でより保守、使いやすく、あなたのDAOを使用するには、いくつかの簡単な例外処理のガイドラインです。
DAOの実現にあなたは、フィルタ、次の質問をテストしたいモード:
DAOのパブリックインターフェイスのメソッドは、例外がスローされますが、それをチェックされている?
もしそうなら、検査の種類は、例外がスローされます。?
どのようにDAO実装クラスに。サンプルは、例外を処理することができます。
DAOモデルでの作業の過程で、私たちのチームは例外処理は、これらのガイドラインに従って、あなたのDAOを改善するためのガイドラインのセットを開発:.かなりの程度になります
.DAO方法は、意味のある例外をスローする必要があります。
.DAO方法がありませんjava.lang.Exceptionがあまりにも一般的なものであるためのjava.lang.Exceptionは、それが潜在的な問題についてのすべての情報を含めることはできません、例外をスローする必要があります。
.DAOメソッドはjava.sql.SQLExceptionを.SQLExceptionが低レベルのJDBCで例外を投げるべきではありません異常な、DAOアプリケーションのパッケージングの努力のJDBC例外は異常なJDBCアプリケーションの他の部分に委ねられるべきではありません。
DAOインタフェースのメソッドは、スロー異常な治療をチェックするために、発信者を期待してください。呼び出し側が適切な方法を使用できない場合例外を処理、試験フィルターは、(ランタイムランタイム)例外の審査を投げないように。
あなたのデータアクセスコードが例外をキャッチした場合、それを無視することはない。DAOが例外を捕獲無視して処理される。
。例外を使用してチェーンは、プロセッサの上部に底部の例外を通過する
。標準試験フィルタDAO例外クラス.SpringフレームワークはDAO事前定義の例外クラスの優れたセットを提供定義。
参考文献を参照してください、より詳細な情報を表示し、例外と例外処理技術を持っている。
実施例:MovieDAO
。MoveDAOを使用すると、リソースセクションMovieDAOで見つける取り扱いトランザクション境界、ロギングと例外を含め、この記事で説明したすべての技術のデモンストレーションですそれは、ソースコードは、次の3つのパケットに分割され:.
.daoexamples.exception
.daoexamples.move
.daoexamples.movi​​edemo
:DAOモードでは、以下のクラスとインタフェースすることによって、これを達成するために
.daoexamples.movi​​e.MovieDAOFactory
.daoexamples.movi​​e.MovieDAO
.daoexamples.movi​​e.MovieDAOImpl
.daoexamples.movi​​e.MovieDAOImplJTA
.daoexamples.movi​​e.Movie
.daoexamples.movi​​e.MovieImple
。 daoexamples.movi​​e.MovieNotFoundException
.daoexamples.movi​​e.MovieUtil
MovieDAOインタフェースは、運転データDAOへのインタフェースを定義し、以下の5つのメソッド:.あり
.public作品findMovieById(文字列ID)
.publicのjava.util.Collection findMoviesByYear(文字列年)
.publicをdeleteMovieのボイド(文字列は、上記のIDを述べた)
.public作品CreateMovie(評価文字列、文字列の年、文字列のタイトル)
updateMovie無効.public(上記のID文字列を、文字列の評価、文字列の年、文字列のタイトル)
daoexamples.movi​​e MovieDAOパッケージには、次の表を同じトランザクションの分割方法を使用する各実装用に実装二つのインターフェースを含ん:.
MovieDAOImpl MovieDAOImplJTAは
まだMovieDAO有り有り?インターフェース実装
JNDIデータソースそれ有り有り?を介して得られる
からのデータソースのjava.sql.Connectionオブジェクトはそれを得るか?はいはい
DAOはそれを内政を定義する?はいいいえ
利用のJDBC取引それを?はいいいえ
利用XAデータソースそれ?はいいいえ
JTAトランザクションを共有すること?いいえはい
MovieDAOデモアプリケーション
このデモアプリケーションプログラムはdaoexamples.movi​​edemo.DemoServlet.DemoServletのサーブレットクラスと呼ばれ、それは映画の中のデータテーブルを照会し、更新する作品DAOを使用しています。
サーブレットはJTA対応のJavaのメッセージサービスMovieDAOを実証し、単一のトランザクションにまとめ実施例8に示すとおり
のUserTransaction = UTX MovieUtil.getUserTransaction();
utx.begin();
バットマン= dao.createMovie( "; R&LT";
"; 2008";
";バットマンリローデッド";);
=新しい新しいMessagePublisherパブリッシャ();
publisher.publishTextMessage( ";戻ってIrll";);
dao.updateMovie(topgun.getId()
"; PG-13である";
topgun.getReleaseYear()、
topgun.getTitle())。
dao.deleteMovie(legallyblonde.getId());
utx.commit();
。、サンプルアプリケーションを実行するアプリケーションサーバーでデータソースと非XA XAデータソースを設定してからdaoexamples.earファイルを展開しますこのアプリケーションは、J2EE準拠のアプリケーションサーバ上で実行されます。

ます。https://www.cnblogs.com/521taobao/archive/2012/03/17/2402449.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34384681/article/details/93355429
おすすめ