Grails / Groovy CRUD服务

时间:2016-04-12 08:03:16

标签: grails gorm

您好我是学生,我目前正在学习Grails和Groovy。我想用服务,控制器和GSP制作Crud服务。我将Grails应用程序与PostgreSQL数据库连接起来。我的问题是我无法提供CRUD服务。我用脚手架做了,然后我在控制器中手动尝试,现在我想把它放在服务中。我的代码是这样的:

我的服务

import groovy.sql.Sql
import grails.transaction.Transactional

@Transactional
class ContactListService {
    def DataSource

    def listAction(){
        def sql = new Sql(DataSource)
        return sql.rows ("SELECT * FROM  mn")
    }

    def insertAction(){
        def sql = new Sql(DataSource)
        sql.execute("INSERT INTO  mn (id, name) VALUES ($Id,$Name)")
    }

我得到了这个"消息:没有这样的属性:类的ID:contactlist.ContactListService"

2 个答案:

答案 0 :(得分:1)

对于初学者,除非需要,否则我会避免使用SQL,例如,如果你需要使用Hibernate和/或GORM无法做到的非标准的东西。像你这样的简单插入和选择语句对Grails和GORM的内置功能来说是微不足道的。

有许多资源可用于学习Grails的基础知识。请参阅reference docs,同时查看一个或多个可用的many books。目前还没有专门针对Grails 3的书籍,但Grails 2和3中的核心概念非常相似,因此Grails 2书籍将会有很多帮助。

您的代码失败的原因是您使用SQL引用GString中不存在的Id变量。假设您修复了该问题,由于缺少Name变量,它将再次失败。您可能希望将这些作为方法参数传递给控制器​​和其他调用您服务的类,例如

def insertAction(long id, String name) {
    def sql = new Sql(DataSource)
    sql.execute("INSERT INTO  mn (id, name) VALUES ($id,$name)")
}

请注意,通过使用带有这样的嵌入变量的SQL,您非常接近向应用程序添加SQL注入风险。你很幸运groovy.sql.Sql了解GStrings并避免了这种情况下的问题。

答案 1 :(得分:0)

@Andrew,您不必在这种情况下编写SQL查询,这会导致您的应用程序中出现SQL注入风险。相反,您可以利用GORM功能使您的工作更轻松。

假设您有一个名为Mn的类:

class Mn{
  Long id
  String name
}

现在,您可以在服务中编写列表并插入操作,如下所示:

@Transactional
class ContactListService {

def listAction(){
    return Mn.list()
}

def insertAction(id, name){
    def mn = new Mn(id: id, name: name)
    mn.save()
}
}