문제

데이터베이스에서 결과 세트를 얻기 위해 게이트웨이를 작성했습니다. 모든 레코드를 더 조작 할 수 있도록 모든 행을 별도의 DAO에 저장하려면 어떻게해야합니까? 아니면 결과 세트에 직접 액세스하여 레코드를 얻을 수 있습니까?

이것은 내 게이트웨이입니다 (BTW, 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 vs. Gateway, Dao & Gateway 등). 모범 사례는 무엇입니까? 프로는 무엇을합니까?

도움이 되었습니까?

해결책

전문가는 데이터베이스 액세스 계층에 단 하나의 패턴 만 사용합니다. DAO와 게이트웨이를 모두 사용하는 것은 그것이 어디에서 시작되었는지 확실하지 않지만 냉담한 군중에만 존재하는 것 같습니다. DAO 및 게이트웨이 패턴은 거의 동일한 기능을 제공 할 수 있지만 데이터베이스 상호 작용에 대해 이야기 할 때 DAO가 청구서에 더 적합하다고 생각합니다.

DAO에는 CRUD 방법에 대한 기능과 반환 레코드 세트가 포함되어야합니다. CRUD 및 기본 레코드 세트는 매우 반복적이므로 코드 생성기를 사용 하여이 상호 작용의 코드를 작성한 다음 필요한 것을 사용자 정의합니다. 이것은 필요한 레코드를 선택하기위한 조건부 논리를위한 좋은 장소입니다.

Aaron이 언급했듯이, 객체 생성의 성능 오버 헤드로 인해 데이터베이스에서 레코드 세트에 대한 객체를 반환하는 것은 콜드 펜션에서 불가능합니다. 나는 일반적으로 내 견해에서 DAO에서 반환 된 기본 쿼리를 사용합니다. 그러나 내가 모델링하는 것이보기에서 약간의 동작이 필요한 경우, Peter Bell이하는 것과 비슷한 것을 사용하여 쿼리를 객체에 넣을 것입니다.

다른 팁

Peter Bell은 몇 달 전에 Ierating Business Object CFC를 출시 한 것에 대해 훌륭한 프레젠테이션을했으며,이 간단한 프레임 워크를 사용하여 여러 레코드를 한 번에 한 번에 한 번에 반복 할 수 있습니다. http://ibo.riforge.org/. CF가 객체를 생성하는 데 약간 빠르기 전까지는 객체의 단일 인스턴스를 재활용하고 속성을 다시 채우는 것이 가장 좋습니다. 아마도 이것은 한 번에 한 레코드를 DAO에로드하는 데 도움이 될 수 있습니다.

조건부 논리는 게이트웨이 또는 관리자 CFC에서 갈 수 있습니다. 일반적으로 CFC에서 직접 게시물에 요약 된 논리와 같이 간단한 논리를 포함합니다.

약간의 조언, 당신은 인수를 만들고 싶을 수도 있습니다. 결정은 필요하지 않고 (structkeyExists (인수, "고유") {do something}을 간단하게 확인하십시오.

문안 인사,

-Aaron Greenlee

우리 회사에서 우리는 몇 달 동안이 물건에 대해 길고 열심히 생각하면서 RDS와 다른 오래된 것들을 통해 Adobe CF DAO 제작자를 시도해 보았습니다 (누구나 CFPowerTools를 기억하십니까?).

우리는 결국 우리 자신의 DAO 코드 생성기를 작성하기로 결정했으며 여기서 우리의 생각을 공유 할 것이라고 생각했습니다. 우리가 결정한 이유는 우리가 잠금 힌트를 SQL에 추가해야했기 때문에보다 효율적이고 안전하며 깨끗하게 만들고 싶었습니다.

우리가 결정한 설정은 사전 정의 된 기본 DAO 객체를 만드는 것이 었습니다 ( DAO.cfc) 모든 생성 된 '테이블'daos가 확장되었습니다. 몇 가지 유틸리티 방법 이었지만 핵심적인 점은 우리가 생성 된 모든 DAO에 액세스 해야하는 다른 기능을 추가 할 수 있다는 것입니다.

따라서 데이터베이스에서 테이블을 선택하여 (CF Admin API를 사용하여) 자동 생성 코드를 작성하고 [TableName].cfc 일반적인 초기, 세터 및 게터가있는 Dao는 기본 크루드 물건입니다.

이 외에도 a도 생성합니다 [TableName]GatewayBase.cfc 그리고 a [TableName]Gateway.cfc. [TableName]Gateway.cfc 확장 [TableName]GatewayBase.cfc.

따라서 '고객'이라는 테이블에서 실행되는 샘플 DAO의 경우 생성 된 파일은 다음과 같습니다.

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

따라서이 아이디어는 게이트웨이가 많은 '고객'레코드를 처리 할 수있는 방법을 제공한다는 것입니다. DAO는 하나만을 다룰 때 사용됩니다. 게이트웨이의 모든 메소드는 일반적으로 CF 쿼리 객체를 반환합니다. CF는 거대한 DAO 객체를 생성하기에는 너무 비효율적이며 CF의 쿼리 객체는 정말 유연하기 때문에 사용하게되어 기쁩니다.

코딩 할 때 하위 클래스 CustomerGateway.cfc 인스턴스화되고 사용되는 유일한 것입니다. 그러나 확장 된 기본 클래스에는 무료로 제공되는 매우 유용한 일반 기능이 있습니다. getFieldListByProperty() 전달 된 매개 변수를 기반으로 한 매개 변수를 기준으로 특정 속성 (예 : 열 값)으로 특정 필드 (예 : 열 열)를 반환합니다.

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

이 호출은 생성 된 날짜에 따라 주문 된 모든 고객의 'CustomerName'및 'CustomerID'값을 반환합니다. 코드는 또한 SQL 주입에 대해 강화되고 검증 된 현명한 예외가 발생됩니다.

이 기능은 테이블에서 수행하는 다중 레코드 쿼리의 99% (희망!)를 제공합니다. 더 소외된 쿼리가 필요하다면 CustomerGateway.cfc 기능을 추가 할 수 있습니다.

마지막으로 기능을 추가 할 수 있습니다 CustomerGateway CFC 고객 테이블을 변경하면 (열을 추가하시기) 테이블을 재현해야하며 THA는 다음을 덮어 씁니다. Customers.cfc 그리고 CustomersGatewayBase.cfc. 그러나 사용자 정의 코드 (있는 경우)는 하위 클래스에서 안전합니다.

어쨌든, 이것은 약간의 주제가 될 수 있지만, 누군가 우리의 경험이 유용하다고 생각했을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top