- 浏览: 5171614 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29393
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
这个月,随着 Andrew Glover 向您演示如何用 GroovySql 构建简单的数据报告应用程序,您对 Groovy 的实用知识会更进一步。GroovySql 结合利用闭包(closure)和迭代器(iterator),把资源管理的负担转移到 Groovy 框架本身,从而简化了 Java 数据库连通性(Java Database Connectivity,JDBC)的编程。
在 实战 Groovy 系列的前几期中,您已经了解了 Groovy 的一些非常优美的特性。在 第 1 期 中,学习了如何用 Groovy 对普通的 Java™ 代码进行更简单、更迅速的单元测试。在 第 2 期 中,看到了 Groovy 能够给 Ant 构建带来的表现能力。这一次您会发现 Groovy 的另一个实际应用,即如何用它迅速地构建基于 SQL 的报告应用程序。
脚本语言对于迅速地构建报告应用程序来说是典型的优秀工具,但是构建这类应用程序对于 Groovy 来说特别容易。Groovy 轻量级的语法可以消除 Java 语言的 JDBC 的一些繁冗之处,但是它真正的威力来自闭包,闭包很优雅地把资源管理的责任从客户机转移到框架本身,因此更容易举重若轻。
在本月的文章中,我先从 GroovySql 的概述开始,然后通过构建一个简单的数据报告应用程序,向您演示如何将它们投入工作。为了从讨论中得到最大收获,您应当熟悉 Java 平台上的 JDBC 编程。您可能还想回顾 上个月对 Groovy 中闭包的介绍,因为它们在这里扮演了重要的角色。但是,本月关注的重点概念是迭代(iteration),因为迭代器在 Groovy 对 JDBC 的增强中扮演着重要角色。所以,我将从 Groovy 中迭代器的概述开始。
迭代是各种编程环境中最常见、最有用的技术。 迭代器 是某种代码助手,可以让您迅速地访问任何集合或容器中的数据,每次一个数据。Groovy 把迭代器变成隐含的,使用起来更简单,从而改善了 Java 语言的迭代器概念。在清单 1 中,您可以看到使用 Java 语言打印 String
集合的每个元素需要做的工作。
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class JavaIteratorExample { public static void main(String[] args) { Collection coll = new ArrayList(); coll.add("JMS"); coll.add("EJB"); coll.add("JMX"); for(Iterator iter = coll.iterator(); iter.hasNext();){ System.out.println(iter.next()); } } } |
在清单 2 中,您可以看到 Groovy 如何简化了我的工作。在这里,我跳过了 Iterator
接口,直接在集合上使用类似迭代器的方法。而且, Groovy 的迭代器方法接受闭包,每个迭代中都会调用闭包。清单 2 显示了前面基于 Java 语言的示例用 Groovy 转换后的样子。
class IteratorExample1{ static void main(args) { coll = ["JMS", "EJB", "JMX"] coll.each{ item | println item } } } |
您可以看到,与典型的 Java 代码不同,Groovy 在允许我传递进我需要的行为的同时,控制了特定于迭代的代码。使用这个控制,Groovy 干净漂亮地把资源管理的责任从我手上转移到它自己身上。让 Groovy 负责资源管理是极为强大的。它还使编程工作更加容易,从而也就更迅速。
Groovy 的 SQL 魔力在于一个叫做 GroovySql 的精致的 API。使用闭包和迭代器,GroovySql 干净漂亮地把 JDBC 的资源管理职责从开发人员转移到 Groovy 框架。这么做之后,就消除了 JDBC 编程的繁琐,从而使您可以把注意力放在查询和查询结果上。
如果您忘记了普通的 Java JDBC 编程有多麻烦,我会很高兴提醒您!在清单 3 中,您可以看到用 Java 语言进行的一个简单的 JDBC 编程示例。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCExample1 { public static void main(String[] args) { Connection con = null; Statement stmt = null; ResultSet rs = null; try{ Class.forName("org.gjt.mm.mysql.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/words", "words", "words"); stmt = con.createStatement(); rs = stmt.executeQuery("select * from word"); while (rs.next()) { System.out.println("word id: " + rs.getLong(1) + " spelling: " + rs.getString(2) + " part of speech: " + rs.getString(3)); } }catch(SQLException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); }finally{ try{rs.close();}catch(Exception e){} try{stmt.close();}catch(Exception e){} try{con.close();}catch(Exception e){} } } } |
哇。清单 3 包含近 40 行代码,就是为了查看表中的内容!如果用 GroovySql,您猜要用多少行?如果您猜超过 10 行,那么您就错了。请看清单 4 中,Groovy 替我处理底层资源,从而非常漂亮地让我把注意力集中在手边的任务 —— 执行一个简单的查询。
import groovy.sql.Sql class GroovySqlExample1{ static void main(args) { sql = Sql.newInstance("jdbc:mysql://localhost:3306/words", "words", "words", "org.gjt.mm.mysql.Driver") sql.eachRow("select * from word"){ row | println row.word_id + " " + row.spelling + " " + row.part_of_speech } } } |
真不错。只用了几行,我就编码出与清单 3 相同的行为,不用关闭 Connection
,也不用关闭 ResultSet
,或者在 JDBC 编程中可以找到的任何其他熟悉的重要特性。这是多么激动人心的事情啊,并且还是如此容易。现在让我来仔细介绍我是如何做到的。
在 清单 4 的第一行中,我创建了 Groovy 的 Sql
类的实例,用它来连接指定的数据库。在这个例子中,我创建了 Sql
实例,指向在我机器上运行的 MySQL 数据库。到现在为止都非常基本,对么?真正重要的是一下部分,迭代器和闭包一两下就显示出了它们的威力。
请把 eachRow
方法当成传进来的查询生成的结果上的迭代器。在底层,您可以看到返回了 JDBC ResultSet
对象,它的内容被传递进 for
循环。所以,每个迭代都要执行我传递进去的闭包。如果在数据库中找到的 word
表只有三行,那么闭包就会执行三次 —— 打印出 word_id
、 spelling
和 part_of_speech
的值。
如果将等式中我指定的变量 row
去掉,而使用 Groovy 的一个隐含变量 it
(它恰好就是迭代器的实例),代码可以进一步简化。如果我这样做,那么前面的代码就可以写成清单 5 所示的这样:
import groovy.sql.Sql class GroovySqlExample1{ static void main(args) { sql = Sql.newInstance("jdbc:mysql://localhost:3306/words", "words", "words", "org.gjt.mm.mysql.Driver") sql.eachRow("select * from word"){ println it.spelling + " ${it.part_of_speech}"} } } |
在这个代码中,我可以删除 row
变量,用 it
代替。而且,我还能在 String
语句中引用 it
变量,就像我在 ${it.part_of_speech}
中所做的那样。
前面的例子相当简单,但是 GroovySql 在处理更复杂的数据操纵查询(例如 insert
、 update
和 delete
查询)时,也是非常可靠的。 对于这些查询,您没有必要用迭代器,所以 Groovy 的 Sql
对象另外提供了 execute
和 executeUpdate
方法。这些方法让人想起普通的 JDBC statement
类,它也有 execute
和 executeUpdate
方法。
在清单 6 中,您看到一个简单的 insert
,它再次以 ${}
语法使用变量替换。这个代码只是向 word
表插入一个新行。
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
方法接收一列值,与查询中的 ?
元素对应。
nid = 5 spelling = "Nefarious" sql.executeUpdate("update word set word_id = ? where spelling = ?", [nid, spelling]) |
删除实际上与插入相同,当然,语法不同,如清单 9 所示。
sql.execute("delete from word where word_id = ?" , [5]) |
任何想简化 JDBC 编程的 API 或工具最好有一些好的数据操纵特性,在这一节中,我要向您再介绍三个。
构建于 GroovySql 简单性的基础之上,GroovySql 支持 DataSet
类型的概念,这基本上是数据库表的对象表示。使用 DataSet
,您可以在行中遍历,也可以添加新行。实际上,用数据集是方便地表示表格的公共数据集合的方式。
但是,目前 GroovySql DataSet
类型的不足之处是它们没有代表关系;它们只是与数据库表的一对一映射。在清单 10 中,我创建了一个来自 word
表的 DataSet
。
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") } } |
您可以看到,GroovySql 的 DataSet
类型可以容易地用 each
方法对表的内容进行遍历,容易地用 add
方法添加新行, add
方法接受一个 map
表示需要的数据。
存储过程调用和负索引(negative indexing)可能是数据操纵的重要方面。GroovySql 使存储过程调用简单得就像在 Sql
类上使用 call
方法一样。对于负索引, GroovySql 提供了自己增强的ResultSet
类型,它工作起来非常像 Groovy 中的 collections。例如,如果您想获取结果集中的最后一个项目,您可以像清单 11 所示的那样做:
sql.eachRow("select * from word"){ grs | println "-1 = " + grs.getAt(-1) //prints spelling println "2 = " + grs.getAt(2) //prints spelling } |
您在清单 11 中可以看到,提取结果集的最后一个元素非常容易,只要用 -1 作索引就可以。如果想试试,我也可以用索引 2 访问同一元素。
这些例子非常简单,但是它们能够让您很好地感觉到 GroovySql 的威力。我现在要用一个演示目前讨论的所有特性的实际例子来结束本月的课程。
报告应用程序通常要从数据库拖出信息。在典型的业务环境中,可能会要求您编写一个报告应用程序,通知销售团队当前的 Web 销售情况,或者让开发团队对系统某些方面(例如系统的数据库)的性能进行日常检测。
为了继续这个简单的例子,假设您刚刚部署了一个企业范围的 Web 应用程序。当然,因为您在编写代码时还(用 Groovy)编写了充足的单元测试,所以它运行得毫无问题;但是您还是需要生成有关数据库状态的报告,以便调优。您想知道客户是如何使用应用程序的,这样才能发现性能问题并解决问题。
通常,时间约束限制了您在这类应用程序中能够使用的提示信息的数量。但是您新得到的 GroovySql 知识可以让您轻而易举地完成这个应用程序,从而有时间添加更多您想要的特性。
在这个例子中,您的目标数据库是 MySQL,它恰好支持用查询发现状态信息这一概念。以下是您有兴趣的状态信息:
- 运行时间。
- 处理的全部查询数量。
- 特定查询的比例,例如
insert
、update
和select
。
用 GroovySql 从 MySQL 数据库得到这个信息太容易了。由于您正在为开发团队构建状态信息,所以您可能只是从一个简单的命令行报告开始,但是您可以在后面的迭代中把报告放在 Web 上。这个报告例子的用例看起来可能像这样:
1. | 连接到我们的应用程序的活动数据库。 |
2. | 发布 show status 查询并捕获: |
a. 运行时间 | |
b. 全部查询数 | |
c. 全部 insert 数 |
|
d. 全部 update 数 |
|
e. 全部 select 数 |
|
3. | 使用这些数据点,计算: |
a. 每分钟查询数 | |
b. 全部 insert 查询百分比 |
|
c. 全部 update 查询百分比 |
|
d. 全部 select 查询百分比 |
在清单 12 中,您可以看到最终结果:一个将会报告所需数据库统计信息的应用程序。代码开始的几行获得到生产数据库的连接,接着是一系列 show status
查询,让您计算每分钟的查询数,并按类型把它们分开。请注意像 uptime
这样的变量如何在定义的时候就创建。
import groovy.sql.Sql class DBStatusReport{ static void main(args) { sql = Sql.newInstance("jdbc:mysql://yourserver.anywhere/tiger", "scott", "tiger", "org.gjt.mm.mysql.Driver") sql.eachRow("show status"){ status | if(status.variable_name == "Uptime"){ uptime = status[1] }else if (status.variable_name == "Questions"){ questions = status[1] } } println "Uptime for Database: " + uptime println "Number of Queries: " + questions println "Queries per Minute = " + Integer.valueOf(questions) / Integer.valueOf(uptime) sql.eachRow("show status like 'Com_%'"){ status | if(status.variable_name == "Com_insert"){ insertnum = Integer.valueOf(status[1]) }else if (status.variable_name == "Com_select"){ selectnum = Integer.valueOf(status[1]) }else if (status.variable_name == "Com_update"){ updatenum = Integer.valueOf(status[1]) } } println "% Queries Inserts = " + 100 * (insertnum / Integer.valueOf(uptime)) println "% Queries Selects = " + 100 * (selectnum / Integer.valueOf(uptime)) println "% Queries Updates = " + 100 * (updatenum / Integer.valueOf(uptime)) } } |
在 实战 Groovy 本月的这一期文章中,您看到了 GroovySql 如何简化 JDBC 编程。这个干净漂亮的 API 把闭包和迭代器与 Groovy 轻松的语法结合在一起,有助于在 Java 平台上进行快速数据库应用程序开发。最强大的是,GroovySql 把资源管理任务从开发人员转移到底层的 Groovy 框架,这使您可以把精力集中在更加重要的查询和查询结果上。但是不要只记住我这句话。下次如果您被要求处理 JDBC 的麻烦事,那时可以试试小小的 GroovySql 魔力。然后给我发封电子邮件告诉我您的体会。
在 实战 Groovy 下一月的文章中,我要介绍 Groovy 模板框架的细节。您会发现,用这个更加聪明的框架创建应用程序的视图组件简直就是小菜一碟。
发表评论
-
实战 Groovy: 用 Groovy 打造服务器端
2010-07-10 11:07 2730Groovlet 和 GroovyServer P ... -
实战 Groovy: 用 Groovy 生成器作标记
2010-07-10 11:07 2068Groovy 生成器让您能够利用诸如 Swing 这样 ... -
实战 Groovy: for each 剖析
2010-07-10 11:07 18202在这一期的 实战 Groovy 中,Scott Davi ... -
实战 Groovy: 用 Groovy 进行 Ant 脚本编程
2010-07-10 11:07 2061Ant 和 Maven 两者在构建处理工具的世界中占统 ... -
实战 Groovy: 在 Java 应用程序中加一些 Groovy 进来
2010-07-10 11:06 4332您有没有想过在自己相对复杂的 Java 程序中嵌入 G ... -
实战 Groovy: Groovy 的腾飞
2010-07-10 11:06 2192随着 Groovy JSR-1(及其后续发行版本)的发 ... -
实战 Groovy: 用 curry 过的闭包进行函数式编程
2010-07-10 11:06 3255在 Groovy 中处处都是闭包,Groovy 闭包惟 ... -
实战 Groovy: 关于 MOP 和迷你语言
2010-07-10 11:06 2072将耳朵贴到地上仔细听 —— MOP 正在前进!了解一下 ... -
实战 Groovy: 用 Groovy 更迅速地对 Java 代码进行单元测试
2010-07-10 11:06 2306不久以前,developerWor ... -
实战 Groovy: 构建和解析 XML
2010-07-10 11:05 7121通过本文,您将了解 ... -
实战 Groovy: 美妙的操作符
2010-07-10 11:05 2287Java™ 取消了操作符重载,但是新兴的 Groovy ... -
实战 Groovy: 使用 Groovy 模板进行 MVC 编程
2010-07-10 11:04 2923视图是 MVC 编程的一个重要部分,而 MVC 编程本 ... -
实战 Groovy: 用 Groovy 减少代码冗余
2010-07-10 11:04 2062Groovy 简洁的语法将 ... -
实战 Groovy: Groovy:Java 程序员的 DSL
2010-07-10 11:04 3083Groovy 专家 Scott Davis 将重新开始 ... -
精通 Grails: 构建您的第一个 Grails 应用程序
2010-07-06 09:37 1651Java™ 程序员不需要 ... -
Grails 部署
2010-07-06 09:36 6075部署 Grails可以使用很多种方式来部署,每一种 ... -
Grails 脚手架
2010-07-05 08:20 4080脚手架 根据指定的领域类,脚手架为你自动生成 ... -
Grails Grails 与 Hibernate
2010-07-05 08:19 2703Grails 与 Hibernate 如果 GOR ... -
Grails Grails和 Spring
2010-07-05 08:19 7915Grails和 Spring 这一节适合于高级用户 ... -
Grails Web服务
2010-07-05 08:19 3959Web服务 Web服务就是让你的web应用提供一套 ...
相关推荐
### IBM实战Groovy知识点概览 #### 一、Groovy简介 **Groovy**是一种运行在Java平台上的灵活且强大的编程语言,它以其简洁、高效和面向对象的特点著称。Groovy是由James Strachan和Bob McWhirter创建的,并在2004年...
在Spring 3.x企业应用开发实战中,使用到的各种jar包是实现高效、灵活和可扩展的应用程序架构的关键。这些库提供了丰富的功能,包括依赖注入、面向切面编程、数据持久化、Web MVC以及与其他技术的集成。以下是这些...
总而言之,《Spring 3.x企业应用开发实战》是一本全面覆盖Spring 3.x核心特性的教程,对于希望提升Spring技能或者正在使用Spring进行开发的程序员来说,是一份不可多得的学习资料。通过深入学习,开发者不仅可以掌握...
1. Groovy配置:Groovy配置让开发者可以使用更加自然的语言风格进行配置,减少了XML的繁琐,提高了开发效率。 2. @Profile注解:该注解允许开发者根据运行环境(如开发、测试、生产)动态地选择加载哪些配置,增强...
- **布局管理**: 如何使用HBox、VBox等容器进行布局设计。 **LESSON19: Developing JavaFX Calculator and Tic-Tac-Toe** - **计算器开发**: 实现一个简单的JavaFX计算器应用。 - **Tic-Tac-Toe游戏**: 开发一个井...
3. **Groovy配置支持**:除了Java配置,3.0.5版本还支持使用Groovy进行配置,提供了更灵活的选择。 4. **WebSocket支持**:引入了对WebSocket协议的支持,适应了实时通信的需求。 5. **改进的MVC**:包括更好的...
Maven使用XML配置,Gradle则使用Groovy进行声明式构建。 12. **单元测试**:JUnit是Java的单元测试框架,通过编写测试用例确保代码的正确性。TDD(测试驱动开发)是一种常见的编程实践,鼓励先写测试再写代码。 13...
3. **动态语言支持**:通过JSR 223,Java 6引入了对脚本语言的支持,允许在Java程序中直接使用JavaScript、Groovy等语言。 4. **改进的编译器**:Javac编译器的性能得到提升,且支持注解处理器,可以自动生成源代码...
1. **Groovy配置支持**:在3.1版本中,Spring引入了对Groovy配置的支持,允许开发者使用更简洁、动态的语法编写配置文件,提高了开发效率。 2. **改进的类型安全的依赖注入**:Spring 3.1增强了类型安全的依赖注入...
- **Spring JDBC支持**:Spring为JDBC操作提供了一个抽象层,简化了数据库操作,并且可以方便地进行错误处理。 - **使用Hibernate集成Spring**:Hibernate是一个流行的ORM框架,Spring提供了与Hibernate无缝集成的...
安装完成后,配置JDBC驱动,以便连接到不同的数据库进行数据查询,这是创建动态报表的关键步骤。 三、报表设计基础 1. 报表元素:iReport提供多种元素,如文本框、表格、图表、图像、子报表等。理解这些元素的用途...
2. **更新的类库**:Java API进行了大量扩展,例如Swing组件的增强,增加了JDBC 4.0支持,提高了数据库连接的便捷性和稳定性。 3. **NIO.2(New I/O 2)**:引入了对异步I/O的支持,允许非阻塞的读写操作,提高了...
Spring Framework,作为Java开发中的核心框架,以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)功能,极大地提升了企业级应用的开发效率。3.0.5.RELEASE版本是...
根据提供的文件信息,“Java 16年基础班+就业班教学视频”主要涵盖了Java编程的基础知识及面向就业的实际技能训练。接下来将详细解读并总结出该视频教程中的关键知识点。 ### 一、Java语言概述 #### 1. Java语言...
《Spring Mastering 5.x:深入理解与实战》 Spring框架是Java开发中的核心组件,尤其是在企业级应用中,Spring以其强大的功能和灵活性备受青睐。Spring 5.x版本更是集成了许多新特性和优化,旨在提升开发效率和应用...
【标题】"Web-Related-Examples" 涵盖了与Web开发相关的各种实例,主要集中在Java编程语言上。这个项目可能是一个集合,包含了不同类型的Web应用开发中的关键概念和技术的实战展示。以下是对这些知识点的详细说明: ...