Нужны ли классы домена 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-инъекций по сравнению с простыми ванильными запросами.
Другие вопросы по тегам