Grails/Groovy 增删改查服务

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)")
    }

我明白了"Message: No such property: Id for class: contactlist.ContactListService"

1st,没有名为 DataService 的 bean(顺便说一句,奇怪的命名是怎么回事)。相反,有一个名为 dataService

的 bean

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

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

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

有许多资源可用于学习 Grails 的基础知识。查看可用的 reference docs but also check out one or more of the 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 并且在这种情况下避免了这个问题。

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

假设您有一个名为 Mn 的 class,如下所示:

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