这节的部分内容来自Andrew Glover的这篇GroovySQL的文章。如果一些JDBC的参考文章很难懂,不用担心。下面的章节都用了一种新的语言特征,也就是在字符串定义中包含变量。例如:
piEstimate = 3; println("Pi is about ${piEstimate}"); println("Pi is closer to ${22/7}");
正如你所见,在一个字符串字面值中,Groovy把所有在${}中的内容解析为一个groovy表达式。
下面的章节广泛的使用了这个特征。
你的第一个Groovy SQL代码有3行。
import groovy.sql.Sql sql = Sql.newInstance("jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName", "username", "password", "net.sourceforge.jtds.jdbc.Driver") sql.eachRow("select * from tableName", { println it.id + " -- ${it.firstName} --"} );
第一行是一个Java导入。它只是告诉Groovy Sql对象的全名。第二行创建了一个新的SQL数据库连接,并把连接保存在变量sql中。
这段代码是针对MS SQL Server数据库的jTDS连接。你需要修改newInstance的所有参数来连接你的数据库,尤其是username和password。
最后,第三行调用sql的eachRow方法,并传入两个参数,第一个是查询字符串,第二个是一个显示一些值的闭包。
注意,在闭包中通过两种不同的方式来访问“it”的字段。第一种是把it的id字段当作简单的字段引用来访问。第二种是上面提到的内嵌Groovy表达式。
所以一行的输出可能是:
001 -- Lane --
如果你只需要数据库中的一行的一列或多列的值,你可以这样做
row = sql.firstRow("select columnA, columnB from tableName") println "Row: columnA = ${row.columnA} and columnB = ${row.columnB}"
之前的例子是相当简单的,而当涉及更复杂的数据操作查询(如插入、更新和删除查询)时,GroovySql也同样稳定。要进行这些操作,你不会想使用闭包,所以Groovy的Sql对象提供了execute和executeUpdate方法作为替代。这些方法让人想起了普通的JDBC statement类,它也有一个execute和一个executeUpdate方法。
这里是一个简单的插入,它再次使用了${}的变量替代语法。这段代码只是把一个新的行插入到people表中。
firstName = "yue" lastName = "wu" sql.execute("insert into people (firstName, lastName) "+ " values ('${firstName}', '${lastName}')")
注意,在这个例子中,你必须在插入语句的任何字符串数据的周围加上引号。一般来说,这不是一个好的办法(考虑如果你的数据包含了一个引号会发生什么事情)。一个更好的方式来做这件事情是像下面这样子使用预编译语句(prepared statement):
firstName = "yue" lastName = "wu" sql.execute("insert into people (firstName, lastName) "+ " values (?,?)", [firstName, lastName])
你想插入的数据被插入语句中的“?”代替,然后值以一个数据的数组的形式传入。更新几乎是一模一样的,只是它使用了executeUpdate方法。注意,executeUpdate方法也是接受一个值的列表,而这些值将匹配查询中对应的?元素。
comment = "Lazy bum" sql.executeUpdate("update people set comment = ? where id=002", [comment])
删除基本上跟插入相同,当然,除了查询的语法不同。
sql.execute("delete from word where word_id = ?" , [5])