Нужны ли классы домена Grails при взаимодействии с базой данных?
Я все еще новичок в Grails (и Groovy), поэтому извиняюсь, если этот вопрос кажется глупым.
Я пытаюсь получить доступ к базе данных SQL, и кажется, что я мог бы использовать команды SQL в контроллере (взят из этого вопроса Stackru):
import groovy.sql.Sql
class MyFancySqlController {
def dataSource // the Spring-Bean "dataSource" is auto-injected
def list = {
def db = new Sql(dataSource) // Create a new instance of groovy.sql.Sql with the DB of the Grails app
def result = db.rows("SELECT foo, bar FROM my_view") // Perform the query
[ result: result ] // return the results as model
}
}
Я знаю, что если бы я создал класс домена с некоторыми переменными, он бы создал таблицу базы данных в SQL:
package projecttracker2
class ListProject {
String name
String description
Date dueDate
static constraints = {
}
}
но это создаст таблицу с именем "list_projects". Если я этого не сделал и просто создал таблицу SQL за пределами Grails, и если в последующем вопросе говорится, что вы можете отключить класс Domain от базы данных, то для чего служат классы Domain? Я пытаюсь выполнить некоторые SQL-запросы для вставки, обновления, удаления и т. Д. Данных, поэтому мне интересно, как лучше всего это сделать.
3 ответа
Доменные классы используются для моделирования вашей области знаний в вашем приложении. Это не только структура данных, но и основа взаимодействия этих моделей в вашей области знаний.
Тем не менее, нет никаких причин, по которым вы не можете создать проект Grails без каких-либо классов домена и использовать свои собственные операторы SQL для создания, чтения, обновления и удаления данных в вашей базе данных. Я работал над проектами, в которых не было классов домена, и все моделировалось с использованием DTO (объектов передачи данных) и сервисов для доступа к уже существующей базе данных и таблицам.
Конечно, не используя классы домена, вы теряете интеграцию с GORM, но это не кажется проблемой для вашего случая (как и в случае, описанном выше).
Это часть красоты Грааля. Вам не нужно использовать все это, вы можете использовать только те части, которые имеют смысл для вашего проекта.
В одном из моих проектов мне нужно было сбросить содержимое MySQL в индекс Lucene. Создание всей структуры класса домена для такой одноразовой операции было бы излишним, поэтому отличный SQL API справился с задачей.
Итак, мой ответ - нет, вам не нужно использовать доменные классы, если вы не хотите.
Я согласен с тем, что сказал @joshua-moore, плюс доменные классы могут значительно упростить ваш проект, если вы их правильно используете
Я согласен с обоими ответами, но для вашего конкретного случая я бы предложил иметь модель предметной области для базовой таблицы.
Причины:
- Вы упомянули обо всех операциях CRUD в вашем требовании. С классом домена будет удобно позволить GORM обрабатывать код котельной пластины для любой операции CRUD.
- При использовании SQL вы должны обрабатывать
transactions
вручную для операции обновления, если транзакция является требованием. С GORM и Hibernate вы получаете это автоматически. - Код будет СУХОЙ. Вам не нужно создавать экземпляр SQL каждый раз, когда вам нужно выполнить операцию.
- Вы можете удобно создавать доменные классы для существующих таблиц, используя
db-reverse-engineer
плагин - Вы получаете один уровень абстракции, используя доменные классы. В будущем, если планируется заменить базу данных MySQL на Oracle или базу данных no-sql, тогда все, что потребуется, - это сменить драйвер (в большинстве случаев с Mongodb будет происходить небольшой отток, но очень мало). по сравнению с заменой SQL-запросов)
- Аудит может быть легко достигнут, если используется класс домена.
- Эта функция (добавление / обновление / удаление) может быть легко представлена как услуга, если это необходимо.
- Проверка данных проще в классах домена
- Лучшая поддержка, чтобы избежать SQL-инъекций по сравнению с простыми ванильными запросами.