首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与数据库交互时是否需要Grails域类?

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

Stack Overflow用户
提问于 2014-06-16 16:09:23
回答 3查看 890关注 0票数 0

我对Grails (和Groovy)还有点陌生,所以如果这个问题看起来很蠢的话,我很抱歉。

我试图访问一个SQL数据库,而且我似乎可以在Controller中使用SQL命令(取自这个StackOverflow问题):

代码语言:javascript
复制
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中创建一个数据库表:

代码语言:javascript
复制
package projecttracker2

class ListProject {
    String name
    String description
    Date dueDate

    static constraints = {
    }
}

但这将创建名为"list_projects“的表。如果我没有这样做,只是在Grails之外创建了SQL表,如果这个跟进问题说您可以断开域类与数据库的连接,那么域类有什么用途呢?我想做一些sql查询来插入、更新、删除等数据,所以我想知道最好的方法是什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-16 16:25:55

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

尽管如此,您没有理由不能在没有任何域类的情况下创建Grails项目,并使用您自己的SQL语句在数据库中创建、读取、更新和删除数据。我在没有域类的项目上工作过,所有的东西都是使用DTO (数据传输对象)和服务来访问已经存在的数据库和表建模的。

当然,如果不使用域类,就会失去与GORM的集成,但对于您的情况来说,这似乎不是一个问题(在我前面描述的情况中也不是这样)。

那是圣杯之美的一部分。您不必全部使用,您只能使用对您的项目有意义的部分。

票数 1
EN

Stack Overflow用户

发布于 2014-06-16 18:11:16

在我的一个项目中,我需要将MySQL的内容转储到Lucene索引中。为这种一次性操作创建整个域类结构将是过度的,所以groovy做得很好。

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

我同意@乔舒亚-摩尔的说法,如果你使用得当,域类可以大大简化你的项目。

票数 1
EN

Stack Overflow用户

发布于 2014-06-17 02:27:22

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

原因:

  • 您在需求中提到了所有CRUD操作。使用域类,可以方便地让GORM处理任何CRUD操作的锅炉板代码。
  • 在使用SQL时,如果需要进行事务处理,则必须手动处理transactions以进行更新操作。使用GORM和Hibernate,您可以自动处理这个问题。
  • 密码是干的。您不必每次需要执行操作时都创建SQL实例。
  • 您可以方便地使用db-reverse-engineer插件为现有表创建域类。
  • 您可以使用域类获得一个抽象级别。将来,如果有一个用Oracle替换MySQL db或no SQL db的计划,那么所需要做的就是更改驱动程序(在大多数情况下,使用Mongodb会涉及到一些搅动,但与替换SQL查询相比则要少得多)。
  • 如果使用域类,则可以很容易地实现审核。
  • 如果需要,此功能(添加/更新/删除)可以很容易地作为服务公开。
  • 域类中的数据验证更容易。
  • 与普通普通查询相比,更好地支持避免SQL注入。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24247940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档