• 締切済み

DAOの作成単位について

kazsharpの回答

  • kazsharp
  • ベストアンサー率37% (16/43)
回答No.2

この方法がいいかどうかわかりませんが、以前に行った方法として、 ・(ほぼ)テーブル単位のDAO作成 ・サービス単位のDAO作成 ・サービス単位のDAOからテーブル単位のDAOを呼び出し のように設計しました。 「DAO」に対する実装が質問者さんとズレがあるかもしれませんが、無駄なく違和感なく実装できました。 参考までに

関連するQ&A

  • DAOと呼ぶべきか、何と呼ぶべきか

    やや抽象的な質問です Tomcat+Struts+Hibernate+PostgreSQL でWEBプログラムを書いています。 DBについて、Hibernateを使う前は JDBCを直接叩いていましたが、その部分は DAOとしてまとめて特定のクラスに役割を持たせていました。 現在は、その処理はHibernateに任せていますが、それでもすべてのクラスからHibernateを叩くわけでもなく、例えば会員管理をするとして、会員テーブルに対するトランザクション一般を特定のクラスに役割を持たせたくなります(POJOをエンティティにする分には不要ですが、SELECTなどで結局SQLを書く以上、欲しくなる)。 まさに今そういうクラスを作ろうとしていますが、そのクラス名で悩んでいます。 例えば、会員テーブルに関するHibernateへの手続きをまとめたクラスの名前を "UserDAO" のようにするべきか、それだといかにもJDBCを直接叩くクラスだと誤解されやすいか、どうでしょうか。 あるいは、"DAO"の解釈など、根本的に勘違いをしていますでしょうか。 "UserTableLogic"なんていうクラス名でもいいかも知れませんが、どうも散文的な感じがします。 「そんなんどうでもいいじゃん」と言いたくなる気持ちを抑えて是非ご教授下さいませ。

  • ビジネスロジック層と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.ビジネスロジックでトランザクション管理して、DAOへ引数としてトランザクションを渡す。  当然、コミット・ロールバックはビジネスロジック側で管理。 2.ビジネスロジック側では管理せず、DAO側で管理。  ビジネスロジックへは結果のみ返却。 実は今回のプロジェクト、Java初心者(プログラムって何?レベルとC++なら受講したことあるよ!レベル)が9割を占めるチームです。 初心者の方々はビジネスロジックを設計・実装します。 それ以外の部分(DB・SpringFramework等)を私が設計・実装します。 ビジネスロジックの部分の設計も、概要設計レベルしか記述されておらず、トランザクション無視の設計しかありません。 バグにまみれてデスマーチなんてごめんなので、2のパターンでトランザクションからDB周りを設計したいと思っているのですが、リーダー(スキルは不明。経験はあるらしい)が「DAO側でやると上手くいかない場合が多い」と言われ、却下されそうです。 何処がどう上手くいかないのか聞いても、明確に返答は貰えません。 でもなんとか2のパターンでいきたいのですが、上手い説得方法が見つかりません。 なんて言えば納得してくれそうか、皆様のお知恵を拝借したく投稿しました。 足らない部分は補足させていただきます。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Access2000VBAにてDAOでカレントにあるテーブルの内容をSQLで抽出して別のテーブルを作成する方法

    こんにちは Access2000VBA初心者です。 現在開いているデーターベースで、フォーム上から抽出条件を入力してそれをSQLに渡し、定義させているテーブルから抽出して新しいテーブルを作成する記述がわかりません。 DAOでできそうなのですが、VBA教本を読んでいるとDebug.printで抽出結果を表示して終わっているのでそれ以上のことが書いてありません。 やりたいことは、SQLでテーブルから必要な条件をセットしてそれをrecordsetにいれるのだと思いますが、 そのrecordsetをなんとか新しいテーブルに作成して入れることはできないのでしょうか。 AccessVBAに明るい方よろしくお願いいたします。

  • Accessで、DAOでAddnew

    参照はDAOで、Addnewでデータの追加をしたいのですが、記述が悪いのか、上手くできません。 どなたか、教えて下さい! テーブル:スケジュールソース フィールド:日付 Private Cur_Db As DAO.Connection Private rs As DAO.Recordset Private sql As String Dim str_date As String str_date = Me!日付 Set Cur_Db = CurrentDb rs.Open "スケジュールソース", Cur_Db, dOpenKeyset, adLockOptimistic rs.AddNew rs("日付").Value = str_date rs.Update

  • AccessVBAでADOとDAOとDoCmd

    いつもお世話になっています。access超初心者です。 いろいろまちがっているかもしれませんが、よろしくお願いします。 フォームやクエリを使うのにDoCmd、検索はSQL文、 テーブルとの接続やデータの追加はDAOですが、 Access以外のデータベースの値も必要なのでADOも使用して・・・と考えています。 たとえば、データがあるかを確認するにはフォームを開き、そこのテキストボックスに探すデータを入力、ボタンをクリックすると DoCmdで表示用フォームを用意、SQL文で検索、DAOで検索結果を表示・・・としていますが、このように一つのデータベースを作成するのに、DoCmdやDAOやADOの使用が入り乱れてもよいのでしょうか? まったく知識がなく学習本を頼りにしていますので、ツギハギだらけになってしまっているのでは?と不安です。 アドバイスのほど、よろしくおねがいいたします。

  • Access→Oracleデータ参照にはADOとパススルークエリどちらが良い?

    AccessからOlacleに接続してデータを取得する処理について 教えてください。 数十万件単位のレコードがあるOracleのテーブルを参照する 必要があるのですが、かなりの負荷がかかると思うので出来 るだけ効率の良い方法で取得したいと思っています。 現在はパススルークエリを作成して、必要に応じてQueryDef でSQLを書き換えて使用しています。 特に問題は感じないのですが、本などを見るとADOやDAOで Oracleに接続し、結果をRecordSetに格納するやり方が一般 的なように思えます。 ADO/DAO接続でデータを持ってくるのと、パススルークエリで データを参照するのでは処理スピードは違うでしょうか? また、パススルークエリを使用する場合のデメリットなどがあり ましたら教えてください。 よろしくお願いいたします。

  • トランザクションの考え方の疑問点

     トランザクションについてネットでいろいろ調べたのですが、 ピンと来ていないので下記の意味合いで合っているのか、 教えて頂けないでしょうか? ・トランザクションは、データベースに対してかかる (テーブル単位にかかるわけではない) ・SQLでINSERT、UPDATE、DELETEのようにテーブルに更新処理を 走らせた時、そのテーブルがロックされる ・コミットが終わるまではロックはかかったまま ・失敗すればロールバックでデータを元に戻せる  …こんな風に考えていますが、 ここまでは合っているでしょうか? また、下記からが疑問なんですが… ・ロックの種類は、SQLの書き方で決められるみたいですが、 特に指定しなかったらテーブルロックになるものなのでしょうか? ・SELECT中は、ロックがかかるものなのでしょうか?

  • S2DAOを使い別ユーザへの接続

    SEASARのS2DAO機能を使って自分のところにあるDBに接続をして処理を行っていたのですが。 別端末に存在するDBに接続してデータを取得する処理が必要になりました。 S2DAOの機能で複数のDBに接続する為によい方法はありますか? やりたい事は、2つのDBのテーブルのデータを紐付けて一度に取ってくるというのではなく、 単純に片方のDBからSELECTした値を使って、もう片方に更新する等 今まで片方のDBとのやりとりは行っていたので、 create database link で別のDBへリンクして使用するやり方は思いついたのですが、出来ればS2DAOの機能で有ればそちらを。と思いました

  • 分離レベルの設定

    情報処理の勉強をしています。 分離レベルは「トランザクション」単位に指定するのでしょうか? 「SQL文」単位で指定するのでしょうか? 情報処理試験等の本を読むと分離レベルの単位はトランザクションとなっています。 ただ一方でDB2にはWITH UR,CS,RR等があり、SQL単位でISOLATIONレベルを設定することが できます。 どのように考えればよいかわかりません。 よろしくお願いします