唯美古典
Java入门,Struts,Hibernate,Spring,Groovy,Grails
posts - 7,comments - 10,trackbacks - 0

1.Groovy 中的闭包

Groovy 已经将迭代转变为任何集合的直接成员。在这个示例中,不必获取 Iterator 实例并直接操纵它,可以直接在集合上迭代。而且,通常放在循环构造内的行为(例如 for 循环体中 println)接下来要放在闭包内。在深入之前,先看看如何执行这步操作。

def acoll = ["Groovy", "Java", "Ruby"]   

acoll.each{

 println it

}

请注意,each 直接在 acoll 实例内调用,而 acoll 实例的类型是 ArrayList。在 each 调用之后,引入了一种新的语法 — {,然后是一些代码,然后是 }。由 {} 包围起来的代码块就是闭包。

迭代无处不在

闭包在 Groovy 中频繁出现,但是,通常用于在一系列值上迭代的时候。请记住,一系列值可以用多种方式表示,不仅可以用列表表示例如,可以在映射、StringJDBC RowsetFile 的行上迭代,等等。

请记住,凡是集合或一系列的内容,都可以使用下面这样的代码进行迭代。

"ITERATION".each{

 println it.toLowerCase()

}

2.Groovy中的?(代表判断条件)

Groovy 通过 ? 操作符提供了一个安全网在方法调用前面添加一个 ? 就相当于在调用前面放了一个条件,可以防止在 null 对象上调用方法。

例如,将 sng2.artist.toUpperCase()

行替换成 sng2.artist?.toUpperCase()。请注意,也可以省略后面的括号。(Groovy 实际上也允许在不带参数的方法上省略括号。不过,如果 Groovy 认为您要访问类的属性而不是方法,那么这样做可能会造成问题。)

?操作符时刻都非常有用,可以极大地减少条件语句。

3.集合

将对象组织到像列表和映射这样的数据结构中是一项基本的编码任务,是我们大多数人每天要做的工作。像大多数语言一样,Groovy 定义了一个丰富的库以管理这些类型的集合。如果曾经涉足 Python 或者 Ruby,那么应该熟悉 Groovy 的集合语法。

使用 Groovy 集合

aCollect = [5, 9, 2, 2, 4, 5, 6]

println aCollect.join(' - ') // prints 5 - 9 - 2 - 2 - 4 - 5 - 6

println aCollect.count(2)     // prints 2

println aCollect.sort()       // prints [2, 2, 4, 5, 5, 6, 9]

4.轻松的 IO

Groovy IO 操作很轻松,特别是与迭代器和闭包结合时。Groovy 使用标准 Java 对象如 File  Reader  Writer ,并用接收闭包作参数的额外方法增强了它们。如在清单 24 中,可以看到传统的 java.io.File ,但是带有额外的、方便的 eachLine 方法。


Groovy IO

import java.io.File

new File("File-IO-Example.txt").eachLine{ line |

 println "read the following line -> " + line

}

因为文件实质上是一系列行、字符等,所以可以相当简单地迭代它们。 eachLine 方法接收一个闭包并迭代文件的每一行,在这里是 File-IO-Example.txt 以这种方式使用闭包是相当强大的,因为 Groovy 保证所有文件资源都是关闭的,不考虑任何异常。这意味着无需大量 try / catch / finally 子句就可以进行文件 IO

5. Groovy进行JDBC编程

Groovy SQL 魔力在于一个叫做 GroovySql 的精致的 API。使用闭包和迭代器, GroovySql 干净漂亮地把 JDBC 的资源管理职责从开发人员转移到 Groovy 框架。这么做之后,就消除了JDBC 编程的繁琐,从而使您可以把注意力放在查询和查询结果上。

执行简单的查询

packagecom.groovy

import groovy.sql.Sql

publicclass JDBCGroovy{

    publicstaticvoid main(def args){

       def sql = Sql.newInstance("jdbc:mysql://localhost:3306/oa","root","122547",

              "com.mysql.jdbc.Driver")

       sql.eachRow("select * from t_user"){user ->  

           println user.username + ":" + user.password

       }         

    }

}

执行复杂的查询

前面的例子相当简单,但是 GroovySql 在处理更复杂的数据操纵查询(例如 insert update  delete 查询)时,也是非常可靠的。对于这些查询,您没有必要用迭代器,所以 Groovy  Sql 对象另外提供了 execute executeUpdate 方法。这些方法让人想起普通的 JDBC statement 类,它也有 execute  executeUpdate 方法。 

在清单 6 中,您看到一个简单的 insert,它再次以 ${} 语法使用变量替换。这个代码只是向 word 表插入一个新行。 

清单 6. GroovySql 进行插入  

wid = 999

 spelling = "Nefarious"

 pospeech = "Adjective"

 sql.execute("insert into word (word_id, spelling, part_of_speech) 

   values (${wid}, ${spelling}, ${pospeech})")

Groovy 还提供 execute 方法的一个重载版本,它接收一列值,这些值与查询中发现的 ? 元素对应。在清单 7 中,我简单地查询了 word 表中的某个行。在底层,GroovySql 创建了普通 Java 语言 java.sql.PreparedStatement 的一个实

例。 

清单 7. GroovySql 创建 PreparedStatement 的实例

val = sql.execute("select * from word where word_id = ?", [5]) 

更新的方式基本相同,也使用 executeUpdate 方法。还请注意,在清单 8  executeUpdate 方法接收一列值,与查询中的 ? 元素对应。 

清单 8. GroovySql 进行更新

 nid = 5

 spelling = "Nefarious"

 sql.executeUpdate("update word set word_id = ? where spelling = ?", [nid, spelling])

删除实际上与插入相同,当然,语法不同,如清单 9 所示。

清单 9. GroovySql 进行删除

 sql.execute("delete from word where word_id = ?" , [5])

简化数据操纵

任何想简化 JDBC 编程的 API 或工具最好有一些好的数据操纵特性

数据集(DataSet)

构建于 GroovySql 简单性的基础之上,GroovySql 支持 DataSet 类型的概念,这基本上是数据库表的对象表示。使用 DataSet,您可以在行中遍历,也可以添加新行。实际上,用数据集是方便地表示表格的公共数据集合的方式。 

但是,目前 GroovySql DataSet 类型的不足之处是它们没有代表关系;它们只是与数据库表的一对一映射。在清单 10 中,我创建了一个来自 word 表的 DataSet 

清单 10. GroovySql 创建数据集

import groovy.sql.Sql

class GroovyDatasetsExample1{

 static void main(args) {

    sql=Sql.newInstance("jdbc:mysql://localhost:3306/words", "words","words", "org.gjt.mm.mysql.Driver")

    words = sql.dataSet("word")

    words.each{ word |

     println word.word_id + " " + word.spelling

    }    words.add(word_id:"9999",spelling:"clerisy",part_of_speech:"Noun")

 }

}



唯美古典的工作室
posted on 2009-11-30 16:55 唯美古典 阅读(1657) 评论(0)  编辑  收藏 所属分类: Groovy

只有注册用户登录后才能发表评论。


网站导航: