Skip to end of metadata
Go to start of metadata

Groovy SQL

本节的一些内容来自 Andrew Glover 写的 GroovySQL 文章

译者注

Icon

个人认为本节引用的内容不如原文表述的清楚,所以建议看一下 Andrew Glover 的原文。

如果对 JDBC 的不太理解,也不用担心。下面用的是一种全新的语言概念,那就是在字符串定义中包含变量。例如:

可以看到,在字符串文字中,Groovy 将会把 ${} 中的内容作为 groovy 表达式解释。

这个特性后面还会得到更广泛的应用。

执行简单的查询

第一个 Groovy SQL 代码有有行。

第一行是一个 Java 导入。这只是把 Sql 对象的全名告诉 Groovy。第二行建立一个数据库连接,并将连接保存到 sql 变量中。

这些代码用于连接到 MS SQL Server 数据库。如果你连自己的数据库,需要调整 newInstantce 的所有参数,尤其是 usernamepassword

最后,第三行调用 sql 的 eachRow 方法,传入了两个参数,第一个是查询字符串,第二个是用来打印一些值的闭包。

注意,在闭包中“it”可能通过两种不同的方式访问。第一种是简单的域(field)引用,访问 it 的 id 域。第二个是上述那样包含 Groovy 表达式。

所以一行输出可能像这样:

从数据库检索单一值(Retrieving a single value from DB)

如果只需要数据库中一行中的一个或多个列的值,可以这样:

执行更复杂的查询(Doing more complex queries)

上面的例子太简单了,但是 Groovy Sql 在处理像插入、更新、删除(insert, update, delete)这样更复杂数据操作时同样可靠。对于这些,并不一定要使用闭包,Groovy Sql 对象提供了 execute 和 executeUpdate 方法。这些方法让人联想到标准的 JDBC Statement 类,这个类也有 execute 和 executeUpdate 方法。

下面是一个简单的插入,用到了 ${} 语法的变量替换。这些代码向 people 表的简单地插入一行数据。

因为 sql 语句用 GString 表示,firstName 和 lastName 变量作为其中的参数,所以 lastName 中的引号不会看作是语句的一部分。

另一种实现的方式是使用 prepared statements(这还真不知道怎么翻译):

在插入语句中,要插入的数据用“?”代替,数据是通过一个数组传递进来的。更新和插入很像,不过使用的是 executeUpdate 方法。
注意,通过数组传递的参数是按顺序替换语句中“?”的。

删除本质上和插入(insert)是相同的,当然语法不一样。

其它技巧(Other Tips)

如果要在业务逻辑中使用结果集中的数据列(column),简单而优雅的方法是返回一个 GroovyRowResult 对象的集合:

如果你更愿意使用自定义类而不是 GroovyRowResult,只要自定义类中包含查询结果的所有列,可以这样: