与数据库交互时是否需要Grails域类?

时间:2014-06-16 16:09:24

标签: mysql grails groovy grails-domain-class

我仍然是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查询来插入,更新,删除等数据,所以我想知道最好的方法是什么。

3 个答案:

答案 0 :(得分:1)

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

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

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

这是Grails之美的一部分。您不必全部使用它,您只能使用对您的项目有意义的部分。

答案 1 :(得分:1)

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

所以,我的答案是否定的,如果你不想,你不得不使用域名类。

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

答案 2 :(得分:1)

我同意这两个答案,但针对您的具体情况,我建议为基础表提供域模型。

原因:

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