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