【问题标题】:Are Grails domain classes necessary when interacting with a database?与数据库交互时是否需要 Grails 域类?
【发布时间】:2014-06-16 16:09:23
【问题描述】:

我对 Grails(和 Groovy)还是有点陌生​​,所以如果这个问题看起来很愚蠢,我们深表歉意。

我正在尝试访问一个 SQL 数据库,并且似乎可以在 Controller 中使用 SQL 命令(取自 this StackOverflow question):

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”的表。如果我没有这样做,只是在 Grails 之外创建了 SQL 表,并且如果 follow-up question 说您可以断开 Domain 类与数据库的连接,那么 Domain 类的用途是什么?我正在寻找一些 sql 查询来插入、更新、删除等数据,所以我想知道最好的方法是什么。

【问题讨论】:

    标签: mysql grails groovy grails-domain-class


    【解决方案1】:

    领域类用于在您的应用程序中为您的知识领域建模。这不仅是数据的结构,也是您知识领域内这些模型交互的基础。

    也就是说,没有任何理由不能创建一个没有任何域类的 Grails 项目,并使用自己的 SQL 语句来创建、读取、更新和删除数据库中的数据。我曾参与过没有域类的项目,并且所有内容都使用 DTO(数据传输对象)和用于访问现有数据库和表的服务进行建模。

    当然,如果不使用域类,您将失去与 GORM 的集成,但这对于您的情况似乎不是问题(在我上面概述的情况下也不是)。

    这是 Grails 的魅力所在。您不必使用所有这些,您可以只使用对您的项目有意义的部分。

    【讨论】:

      【解决方案2】:

      在我的一个项目中,我需要将 MySQL 的内容转储到 Lucene 索引中。为这样的一次性操作创建整个域类结构将是一种矫枉过正,因此 groovy SQL API 就可以了。

      所以,我的回答是否定的,如果您不想使用域类,则不必使用。

      我同意@joshua-moore 的说法,如果你正确使用领域类,它们可以大大简化你的项目

      【讨论】:

        【解决方案3】:

        我同意这两个答案,但对于您的特殊情况,我建议为基础表使用域模型。

        原因:

        • 您在需求中提到了所有 CRUD 操作。使用域类可以方便地让 GORM 处理任何 CRUD 操作的样板代码。
        • 使用 SQL 时,如果需要事务,则必须手动处理 transactions 进行更新操作。使用 GORM 和 Hibernate,您可以自动处理这些问题。
        • 代码将是 DRY。您不必在每次需要完成操作时都创建 SQL 实例。
        • 您可以使用db-reverse-engineer 插件方便地为现有表创建域类
        • 您可以使用域类获得一层抽象。将来,如果有计划用 Oracle 或 no-sql 数据库替换 MySQL 数据库,那么只需要更改驱动程序(在大多数情况下,使用 Mongodb 会涉及一些流失,但很少与替换 SQL 查询相比)
        • 如果使用域类,可以轻松实现审计。
        • 如果需要,可以将此功能(添加/更新/删除)轻松公开为服务。
        • 域类中的数据验证更容易
        • 与普通查询相比,更好地支持避免 SQL 注入。

        【讨论】:

          猜你喜欢
          • 2016-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          相关资源
          最近更新 更多