Grails/Groovy CRUD Service



嗨,我是一名学生,目前正在学习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:联系人列表。联系人列表服务">

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

有许多资源可用于学习Grails的基础知识。查看参考文档,但也要查看许多可用书籍中的一本或多本。目前还没有专门针对Grails 3的书籍,但是Grails 2和Grails 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并避免了这种情况。

1st,没有名为 DataService 的 bean(顺便说一句,对于一个奇怪的命名来说是什么(。取而代之的是一个名为dataService的豆子

2nd,要解决编译错误,您必须在insertAction()方法的上下文中的某个地方声明IdName(我的眼睛现在在流血!作为参数,或字段或本地变量,例如:

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

@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()
}
}

最新更新