ビジネスロジック層とDAO層の書き方

このQ&Aのポイント
  • ビジネスロジック層とDAO層の書き方について困っています。Aテーブルから取得した値をBテーブルとCテーブルにインサートする方法について、依存性の観点から改善方法を教えてください。
  • 現在のビジネスロジック層の書き方では、DAOを直接newすることが依存性の観点からよくないとされています。Webで調べた結果、DAOパターンを使って疎結合にする方法が示されていますが、途中でのロールバックができないという問題があります。
  • 一番最初に挙げたコードの方が、各々のDAOで同じコネクションを使い回し、最後に正常終了した段階でコミットするというわかりやすさがあります。改善策をお教えいただけますか。
回答を見る
  • ベストアンサー

ビジネスロジック層とDAO層の書き方

現在、Webアプリを作成しているのですがビジネスロジックとDAOをどういうように 書けばいいのか困っています。 例えばAテーブルから取得した値を BテーブルとCテーブルにインサート(途中でしくじったらロールバック)。 現在、ビジネスロジック層では下記のような調子で書いています。 しかし、ビジネスロジック層でDAOを直接newするのは依存性の観点から よろしくないということなのですがどのように改善すればよろしいでしょうか。 また、皆様はどのような実装を行っていますでしょうか。 try { DBConnect conn = getConnection(); A aDao = new A(conn); String a = aDao.getData(); B bDao = new B(conn); bDao.insert(a); C cDao = new C(conn); cDao.insert(a); conn.commit(); } catch(Exception e) { conn.rollback(); } finally { conn.close(); } Webを見ていたらDAOパターンを示した下記サイトがありました。 http://www.nulab.co.jp/designPatterns/designPatterns3/designPatterns3-4.html 上記サイトののコードに習うならば上記のビジネスロジックのコードは 下記のようになると思います。(各々のDAOの中でDBのConnection、Closeを行っている) 下記の場合、ビジネスロジックとDAOは疎結合になったかもしれませんが cDao.insert()でしくじった場合、それより前の処理はロールバックできない のではないかと思います。 また、一番最初に書いた記述方法の方が1つのコネクションを各々のDAOで使い回し 最後に正常終了した段階でコミットするというわかりやすさがあるので 一番最初に挙げたコードを改良できないかと思っています。 ItemDao aDao = DaoFactory.createADao(); //Aオブジェクト取得 String a = aDao.getData(); ItemDao bDao = DaoFactory.createBDao(); //Bオブジェクト取得 bDao.insert(a); ItemDao cDao = DaoFactory.createCDao(); //Cオブジェクト取得 cDao.insert(a);

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

書かれているとおりで、通常ビジネスロジック層が呼び出すDB操作はサービスと呼ばれる単位でまとめ、 トランザクションもその単位で設定します。 これはJavaEEの前身であるJ2EEパターンで推奨されているFacadeパターンです。

unko347
質問者

お礼

ご回答ありがとうございました。了解しました。

その他の回答 (1)

回答No.2

http://d.hatena.ne.jp/u6k/20100106/1262764521 そういったときにこんなものを使うんじゃないかな?

関連するQ&A

  • DAOの作成単位について

    MVCでWebアプリを作成していると、ほぼ必ずDAOを作成することになると思いますが、DAOの作成単位にいつも悩みます。今までの経験によると大きく二つ「テーブル単位」か「サービス(ビジネスロジック)単位」にDAOを作成している方が多いようですが、それぞれの作成単位によってメリットデメリットがあると思います。この二つ以外にもDAOの作成単位があるかもしれませんが、どちらがよいのか皆さんの意見を聞かせていただきたいです。 1.テーブル単位 【メリット】  ・同じ処理(SQL)が複数DAOに分散しない 【デメリット】  ・複数テーブル情報をまとめてSELECTするような場合、どのテーブルDAOに実装するか迷う。  ・トランザクション処理が必要な一連の処理を記述する場合、テーブル単位では記述できない。 2.サービス(ビジネスロジック)単位 【メリット】  ・トランザクション処理が必要な一連の処理を記述する場合、違和感が無い。 【デメリット】  ・複数のサービスDAOで同じ処理(SQL)が書かれる可能性がある。

  • DAOのSeekメソッドの不等号について

    DAOのSeekメソッドの不等号について いつもお世話になっております。 あるテーブルの項目A,B,Cにインデックス"検索用"と名前をつけたとします。 DAOのSeekメソッドで、 RS.index = "検索用" RS.seek ">=", 10, 20, 30 とした場合、返される結果は、クエリで Where A >= 10 and B >= 20 and C>=30 と条件指定したものと同じでしょうか? よろしくお願い致します。

  • 同じデータベース内で値の参照

    あるA,B,Cのテーブルがあり、 Aの主キーはシーケンシャル番号が振られています。 この値を参照し、B,Cのテーブルのフィールドに挿入したいのですが、 私のやり方は (1)まずAをInsertする (2)AでInsertしてできたシーケンシャル番号を取得し、 (3)BをInsertする (4)CをInsertする と少しややこしい方法しか思いつきませんでした。 何かよいアイデアがあれば教えていただけたら、ありがたいです。

  • このようなレコードの抽出・生成方法

    下記のようなテーブル、レコードがあるとします。 (テーブルAとテーブルBのコードは同意) テーブルA(PK:コードA,コードB,コードC,コードD) コードA コードB コードC コードD 000001 001 00 01 000001 001 00 02 000001 001 00 03 000001 002 00 01 000001 002 00 02 000001 002 00 03 テーブルB(PK:コードA,コードB) コードA コードB 000001 001 000001 002 ここでテーブルAに1件追加されたとします。 テーブルA コードA コードB コードC コードD 000001 001 00 01 000001 001 00 02 000001 001 00 03 000001 002 00 01 000001 002 00 02 000001 002 00 03 000001 001 00 04 ここで質問なのですが、 下記のようなレコードを生成するSQLを教えて欲しいのです。 イメージとしては、コードAとコードBをテーブルBから取得し、 他の項目は、上記で追加されたレコードをコピーといった感じです。 テーブルA コードA コードB コードC コードD 000001 001 00 01 000001 001 00 02 000001 001 00 03 000001 002 00 01 000001 002 00 02 000001 002 00 03 000001 001 00 04 000001 002 00 04 ←生成したいレコード わかりにくい質問で申し訳ないですが、 よろしくお願いいたします。

  • LAST_INSERT_IDの使い方

    お世話になります。 早速ですが 1、トランザクション 2、テーブルAにインサート 3、テーブルBにインサート 4、テーブルCにインサート 5、コミット のような処理の時に、テーブルAでインサートしたレコードの IDをテーブルBとCに入れたいので、テーブルBに入れる時に LAST_INSERT_ID()を使うと思い通りの処理になりました。 しかし、テーブルCにインサートする時にはLAST_INSERT_IDの 値はテーブルBのインサート時のIDとなり、テーブルAのIDでは ありません、当然ですが。。 こういった場合、テーブルAのインサートIDを取得保持するには どのようにすればいいのでしょうか? どうか、ご教示ください。

  • データ処理に関する質問(Access VBAーDAO)

     AccessVBA初心者です。いつもお世話なっております。 環境 OSーXPsp2 office2003 テーブル1とテーブル2あって、テーブル1にデータはいってます。テーブル2は空です。 ACCESS VBA DAOで テーブル1のデータの[店名]、[氏名]を テーブル2に横に追加していきたいです。 テーブル2 構造 ID(オートナンバー)  [店名]1 [氏名]1 [店名]2 [氏名]2  --------------------------------------------------------- テーブル1のデータ ID(オートナンバー)  [店名] [氏名]   1           A    Aさん   2           B     Bさん    3           C     Cさん    4    D       Dさん ----------------------------------------------------- 結果 テーブル2 ID(オートナンバー)  [店名]1 [氏名]1 [店名]2 [氏名]2  1            A   Aさん   B   Bさん 2            C   Cさん   D   Dさん ACCESS VBAでの書く方 教えてください。宜しくお願い足します。

  • SQLのテーブル結合

    SQLのSELECTについて質問です。 テーブルA、B、Cから情報を取得し、下記の画面イメージを表示させたいのですが、 どのようにテーブルを結合すればよいか判りません。 どなたかご教示ください・・・。よろしくお願いします。 #テーブルCから組名を取得するような処理は画面表示のロジックで行います。 #テーブルA、Bの結合についてのみ、教えていただきたいです。 条件 ・氏名と、所属情報の○×を表示したい ・DISTINCT等、重たい処理は避けたい 画面イメージ |氏名  |赤組|白組|青組| ------------------------------ |山田太郎|○ |× |× | |山田花子|× |○ |○ | テーブルA |個人ID|氏名  | -------------------- |000001|山田太郎| |000002|山田花子| テーブルB |個人ID|組コード| -------------------- |000001|1110  | |000002|1111  | |000002|1112  | テーブルC |組コード|組名| ------------------ |1110  |赤組| |1111  |白組| |1112  |青組|

  • <VB.NET>INSERT文でDBにデータを入れたい 

    プログラム初心者です。 ボタンを押したらtextboxの値がDBのテーブルに格納されて画面が閉じるという処理をしたいです。 そして他の画面でボタンを押すとINSERT済みのテーブルが出るという 処理をしようと思っています。 今のところは、他の画面でボタンを押してもINSERT済みのテーブルが でないという状態です。元のテーブルのデータはでます。 サンプルを見つけてやってみたのですが、思った結果がでません。 public sub botton1-click dim sql_insert as string dim cmd_insert as oledbcommand dim strconn as string = "provider = ~OLEDB4.0 = ~.mdb" DA = New oledbDataAdapter conn = New oledbconnection(strconn) sql_insert = "INSERT INTO A組(名前) VALUES(TextBox1.Text) cmd_insert = New oledbcommand(sql_insert,conn) DA.insertCommand = cmd_insert Me.colse end sub DataAdapterはdatasetを使わず直接DBに格納させるINSERTの時にでも 使うのでしょうか? 自分自身まだよく分かっていないので、正しいコードと処理の流れを 教えて欲しいです。 使っているのはaccess2000、VB.NET2003です。よろしくお願いします。

  • Excel VBA DAO について

    いつもお世話になっております。 現在Excel2007でマクロを組みました。 下記ソースのような形で、マクロを実行するブック内にあるシートから、データを取得するのですが・・・・ ~ソース例~ dim dbEngine as object Dim db as object Dim rs as object Dim sql as object '■SQL格納 sql = sql & "Select 社員名 " sql = sql & " ,Sum(月収) as 年収 " sql = sql & " From 月収一覧 " sql = sql & "Group By 社員名,月収; " '■DBを開く Set dbEngine = CreateObject("DAO.DBEngine36") Set db = dbEngine.OpenDatabase("C:\社員月収.xls", False, False, "Excel8.0;") '■SQL実行後レコードセットへ格納 Set rs = db.Openrecordset(sql) としていますが「■DBを開く」の部分でCreateObject内で宣言している”DAO.DBEngine36”の部分をそのPCのDAOライブラリのバージョンによって変更したいのですが、可能なのでしょうか?? 以上です><よろしくお願いいたします!!

  • select insertで複数テーブルから値を取得したい

    環境:oracle9i select insertで、2つのテーブルから値を取得して、1つのテーブルにinsertすることは可能でしょうか? たとえば、以下の場合、どのようなSQL文を書けばよいか、アドバイスいただけますでしょうか。 よろしくお願いします。 insertしたいテーブル:A Aテーブルの項目:o,p,q,r,s,t 値を取得するテーブル:B,C Bテーブルの項目:o,p,q,r Cテーブルの項目:o,p,s,t oとpが主キーになっていて、それらが一致するBとCのデータを あわせて、Aにinsertしたいと思っています。 insert into A(o,p,q,r,s,t) select このあと、どのように書けばよいのかがわかりません。

専門家に質問してみよう