您好我是学生,我目前正在学习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"
答案 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()
}
}