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()
方法的上下文中的某处声明 Id
和 Name
(我的眼睛在流血!)。作为参数、字段或局部变量,例如:
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()
}
}
大家好,我是一名学生,目前正在学习 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
2,要解决编译错误,您必须在 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)")
}
对于初学者,除非需要,否则我会避免使用 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()
}
}