Как поместить записи из запроса в DAO? - PullRequest
0 голосов
/ 22 июня 2009

Я написал шлюз для получения набора результатов из моей базы данных. Как мне сохранить каждую строку в отдельном дао, чтобы я мог управлять каждой записью дальше? Или я могу получить доступ к набору результатов напрямую, чтобы получить записи?

Это мой шлюз (кстати, я должен записать условную логику в 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 и т. Д.). Какова лучшая практика, чем занимаются профессионалы?

Ответы [ 3 ]

3 голосов
/ 22 июня 2009

Профессионалы используют только один шаблон для слоя доступа к базе данных. Использование DAO и Gateway - это неправильное название, так как я не совсем уверен, с чего оно началось, но, похоже, существует только в толпе ColdFusion. Шаблоны DAO и Gateway могут в значительной степени выполнять одну и ту же функцию, но я думаю, что DAO больше отвечает требованиям, когда речь идет о взаимодействии с базой данных.

DAO должны включать функциональность для методов CRUD, а также возвращать наборы записей. Поскольку CRUD и базовые наборы записей очень повторяются, я использую генератор кода для создания кода для этого взаимодействия, а затем настраиваю то, что мне нужно. Это хорошее место для условной логики для выбора нужных вам записей.

Как упоминал Аарон, возврат массива объектов для набора записей в вашей базе данных невозможен в ColdFusion из-за снижения производительности при создании объектов. Обычно я просто использую базовый запрос, возвращаемый из DAO, в своих представлениях. Однако если моделируемому объекту требуется некоторое поведение в представлении, я помещу запрос в объект, используя нечто похожее на то, что делает Питер Белл.

2 голосов
/ 22 июня 2009

Несколько месяцев назад у Питера Белла была отличная презентация о выпуске CFC «Итеративный бизнес-объект», который позволяет вам брать несколько записей и выполнять итерации по одной записи за раз, используя эту простую структуру: немного быстрее при генерации объектов, повторное использование одного экземпляра объекта и повторное заполнение свойств, вероятно, лучше всего вам подходит. Возможно, это поможет вам загрузить по одной записи за раз в DAO.

Условная логика может идти в шлюзе или в диспетчере CFC. Как правило, я бы включил логику, которая проста, как логика, изложенная в вашем посте непосредственно в CFC.

Небольшой совет, вы можете захотеть сделать arguments.distinct НЕ обязательным и сделать простую проверку с помощью if (structKeyExists (arguments, "different")) {сделать что-то}.

С уважением,

-Аарон Гринли

1 голос
/ 22 июня 2009

В нашей компании мы долго и много думали об этом, пытаясь создать Adobe CF DAO через RDS и некоторые другие более старые (кто-нибудь помнит CFPowerTools?).

В конце концов мы решили написать собственный генератор кода DAO, и я решил поделиться своими мыслями здесь. Причина, по которой мы решили, заключалась в том, что нам нужно было добавить подсказки блокировки в SQL, мы хотели сделать его более эффективным, безопасным и чистым.

Мы решили создать предварительно заданный базовый объект DAO (называемый DAO.cfc), который расширил все сгенерированные таблицы DAO. Все, что у него было, - это несколько служебных методов, но главное, что мы можем добавить туда любые другие функции, к которым нам нужны все наши сгенерированные DAO.

Таким образом, мы автоматически генерируем код, выбирая таблицу из базы данных (используя API администрирования CF) и создаем [TableName].cfc DAO с обычными init, setter и getter, то есть с базовыми CRUD-компонентами.

В дополнение к этому мы также генерируем [TableName]GatewayBase.cfc и [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' для всех клиентов со статусом 1, упорядоченных по дате их создания. Код также защищен от SQL-инъекций и проверен, поэтому создаются разумные исключения.

Эта функция обеспечит 99% (мы надеемся!) Запросов к нескольким записям, которые вы делаете для таблицы. Если вам нужен более сложный запрос, тогда CustomerGateway.cfc для вас, чтобы вы могли добавить функции.

Наконец, мы разрешаем вам добавлять функции только в CustomerGateway CFC , потому что если вы измените таблицу клиентов (скажем, добавьте столбец), вам нужно будет воссоздать таблицу, и тогда она перезапишет Customers.cfc и CustomersGatewayBase.cfc. Тем не менее, ваш собственный код (если есть) безопасен в подклассе.

В любом случае, это может быть немного не по теме, но я уверен, что кто-то может найти наш опыт полезным.

...