嗨,我是一名学生,目前正在学习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()
方法的上下文中的某个地方声明Id
和Name
(我的眼睛现在在流血!作为参数,或字段或本地变量,例如:
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()
}
}