0

データベースから結果セットを取得するためのゲートウェイを作成しました。すべてのレコードをさらに操作できるように、すべての行を個別の dao に保存するにはどうすればよいですか? または、結果セットに直接アクセスしてレコードを取得できますか?

これは私のゲートウェイです (ちなみに、cfquery 内の条件付きロジックを、これを拡張する別の cfc に書き込む必要がありますか?)

<cfcomponent name="MaterialDao" hint="data access object" output="false">
 <cffunction name="init" hint="constructor" access="public" output="false" returntype="MaterialDao">
  <cfargument name="dsn" type="String" required="true" hint="datasource" />
  <cfset variables.instance.dsn = arguments.dsn />
  <cfreturn this />
 </cffunction>

 <cffunction name="readMaterial" hint="read" access="public" output="false" returntype="Query">
  <cfargument name="district" type="String" />
  <cfset var qReadMaterial = "" />
  <cfquery name="qReadMaterial" datasource="#variables.instance.dsn#">
   <cfif StructKeyExists(arguments,"district")>
   SELECT A.NR, A.BEZ, D.BES, D.STA
   <cfelse>
   SELECT A.NR, A.BEZ
   </cfif>
   FROM  DEK AS D INNER JOIN ART AS A
   ON D.NR = A.NR
   WHERE 0=0
   <cfif StructKeyExists(arguments,"district")>
    AND D.BEZ = #arguments.district#
   </cfif>
   ORDER BY A.BEZ
 </cfquery>
 <cfreturn qReadMaterial />
 </cffunction>
</cfcomponent>

私はすでに多くの記事を読みましたが、この問題についてはさまざまな意見があるようです (DAO 対 Gateway、DAO & Gateway など)。ベスト プラクティスとは何ですか。プロは何をしますか?

4

3 に答える 3

3

プロは、データベースアクセス層に1つのパターンのみを使用します。DAOとGatewayの両方の使用は、それがどこから始まったのかよくわからないという誤称ですが、ColdFusionの群集にのみ存在するようです。DAOとゲートウェイのパターンはほとんど同じ機能を果たしますが、データベースの相互作用について話すとき、DAOはより適切だと思います。

DAOには、CRUDメソッドの機能に加えて、レコードのセットを返す機能が含まれている必要があります。CRUDと基本的なレコードのセットは非常に反復的であるため、コードジェネレーターを使用してこの相互作用のコードを作成し、必要なものをカスタマイズします。これは、必要なレコードを選択するための条件付きロジックに適した場所です。

Aaronが述べたように、ColdFusionでは、オブジェクト作成のパフォーマンスオーバーヘッドが原因で、データベース内の一連のレコードのオブジェクトの配列を返すことはできません。私は通常、ビューでDAOから返された基本的なクエリを使用します。ただし、モデリングしているものがビューで何らかの動作を必要とする場合は、PeterBellが行うのと同様の動作を使用してクエリをオブジェクトに配置します。

于 2009-06-22T12:38:15.277 に答える
2

Peter Bell は数か月前に、この単純なフレームワークhttp://ibo.riaforge.org/を使用して、複数のレコードを取得し、一度に 1 つのレコードを反復処理できる Iterating Business Object CFC のリリースについて素晴らしいプレゼンテーションを行いました。オブジェクトの生成が CF で少し速くなるまでは、オブジェクトの単一インスタンスをリサイクルしてプロパティを再設定するのが最善の方法です。おそらく、これは一度に 1 つのレコードを DAO にロードするのに役立ちます。

条件付きロジックは、ゲートウェイまたはマネージャー CFC に入れることができます。通常、投稿で概説されているロジックのような単純なロジックを CFC に直接含めます。

少しのアドバイスですが、arguments.distinct を不要にし、if (structKeyExists(arguments, "distinct") ) { do something } で簡単なチェックを行うことをお勧めします。

よろしく、

-アーロン・グリーンリー

于 2009-06-22T11:39:17.237 に答える
1

私たちの会社では、RDS 経由の Adob​​e CF DAO クリエーターやその他の古いもの (CFPowerTools を覚えている人はいますか?) を試しながら、このことについて数か月間じっくりと考えました。

最終的に、独自の DAO コード ジェネレーターを作成することにしました。ここで私たちの考えを共有したいと思います。決定した理由は、out SQL にロック ヒントを追加する必要があり、より効率的で、より安全で、よりクリーンにしたかったからです。

DAO.cfc私たちが決定した設定は、生成されたすべての「テーブル」DAO が拡張する、定義済みのベース DAO オブジェクト ( と呼ばれる) を作成することでした。いくつかのユーティリティ メソッドしかありませんでしたが、重要なことは、生成されたすべての DAO にアクセスする必要がある他の関数をそこに追加できることです。

したがって、データベースからテーブルを選択して (CF 管理 API を使用して) コードを自動生成[TableName].cfcし、通常の init、セッター、ゲッター、つまり基本的な CRUD を使用して DAO を作成します。

これに加えて、 と も生成し[TableName]GatewayBase.cfcます[TableName]Gateway.cfc[TableName]Gateway.cfc伸び[TableName]GatewayBase.cfcます。

したがって、'Customers' というテーブルで実行されるサンプル DAO の場合、作成されるファイルは次のとおりです。

Customers.cfc /* extends DAO.cfc [not created, already exists] */
CustomersGateway.cfc 
CustomersGatewayBase.cfc /* extends CustomersGateway */

したがって、ゲートウェイは多くの「顧客」レコードを処理する方法を提供するという考え方です。DAO は、1 つだけを処理するときに使用されます。ゲートウェイのすべてのメソッドは、通常、CF クエリ オブジェクトを返します。CF は、DAO オブジェクトの大量の配列を作成するには非効率的すぎます。私たちの考えでは、CF のクエリ オブジェクトは非常に柔軟なので、喜んで使用しています。

CustomerGateway.cfcコーディング時には、インスタンス化されて使用されるのはサブクラスだけです。getFieldListByProperty()ただし、それが拡張する基本クラスには、渡されたパラメーターに基づいて、特定のプロパティ (つまり、列の値) によって特定のフィールド (つまり、テーブルの列) を返すなど、いくつかの非常に便利な汎用関数が無料で提供されます。たとえば、次のようになります。

myGateway.getFieldListByProperty(property="status", value="1", fieldList="customerName,customerID", orderBy="createdOn") />

この呼び出しは、ステータスが 1 のすべての顧客の「customerName」と「customerID」の値を、顧客が作成された日付順に並べて返します。また、コードは SQL インジェクションに対して強化され、妥当な例外がスローされるように検証されます。

この関数は、テーブルに対して行う複数レコードのクエリの 99% (期待しています!) を提供します。より洗練されたクエリが必要な場合は、CustomerGateway.cfc関数を追加することができます。

CustomerGateway最後に、 CFCに関数を追加できるのは、customers テーブルを変更し場合 (たとえば、列を追加した場合)、テーブルを再作成する必要があり、 および が上書きされるCustomers.cfcためCustomersGatewayBase.cfcです。ただし、カスタム コード (存在する場合) はサブクラスで安全です。

とにかく、これは少し話題から外れているかもしれませんが、誰かが私たちの経験を役に立つと思うかもしれないと思っていました.

于 2009-06-22T19:18:42.920 に答える