使用 GroovySQL 构建您的下一个报告应用程序。
在 Groovy 系列的前几期中,您已经了解了 Groovy 的一些最漂亮的功能。 在第 1 集中,我学会了如何使用 Groovy 使普通 j**a * 的单元测试更简单、更快捷。 在第 2 集中,我们看到了 Groovy 可以为 Ant 构建带来什么。 这一次,您将找到 Groovy 的另一个实际应用,即如何快速构建基于 SQL 的报告应用程序。
脚本语言通常是快速构建报告应用程序的绝佳工具,但构建此类应用程序对 Groovy 来说尤其容易。 Groovy 的轻量级语法消除了 J**a 语言中 JDBC 的一些冗余,但它的真正力量来自闭包,它优雅地将资源管理的责任从客户端转移到框架本身,使其更容易减轻重量。
在本月的文章中,我将首先概述GroovySQL,然后向您展示如何通过构建一个简单的数据报告应用程序来使它们发挥作用。 为了充分利用讨论,您应该熟悉 J**a 平台上的 JDBC 编程。 您可能还想回顾一下上个月对 groovy 闭包的介绍,因为它们在这里发挥着重要作用。 然而,本月的关键概念是迭代,因为迭代器在 Groovy 对 JDBC 的增强中起着重要作用。 因此,我将从 groovy 中的迭代器概述开始。 迭代是各种编程环境中最常见和最有用的技术。 迭代器是一种助手,可用于快速访问任何集合或容器中的数据,一次访问一个数据。 Groovy 改进了 J**a 语言中迭代器的概念,使迭代器具有隐式且更易于使用。 在清单 1 中,您可以看到它是用 j**a 语言打印的string
需要为集合的每个元素完成的工作。
清单 1普通 ja 中的迭代器。
import j**a.util.arraylist;import j**a.util.collection;import j**a.util.iterator;public class j**aiteratorexample }}
在清单 2 中,您可以看到 Groovy 如何简化我的工作。 在这里我跳过了iterator
接口,直接在集合上使用类似迭代器的方法。 此外,Groovy 的迭代器方法接受闭包,这些闭包在每次迭代中都会调用。 清单 2 显示了上一个基于 j**a 的示例在转换为 groovy 时的样子。
清单 2时髦的迭代器。
class iteratorexample1}}
正如你所看到的,与典型的 ja 不同,groovy 控制特定于迭代的行为,同时允许我传递我需要的行为。 使用这个控件,Groovy 干净利落地将资源管理的责任从我手中转移到了自己身上。 让 Groovy 负责资源管理是非常强大的。 它还使编程更容易,因此速度更快。
关于本系列:
将任何工具集成到您的开发实践中的关键是知道何时使用它以及何时将其留在盒子中。 脚本语言可以成为工具箱中一个非常强大的补充,但前提是必须正确应用于正确的方案。
Groovy SQL 的魔力在于一个名为 GroovySQL 的复杂 API。 使用闭包和迭代器,GroovySQL 将 JDBC 的资源管理职责从开发人员转移到了 Groovy 框架。 这样做可以消除繁琐的 JDBC 编程,并允许您专注于查询和查询结果。
如果你忘记了普通的j**ajdbc编程有多麻烦,我很乐意提醒你! 在清单 3 中,您可以看到一个使用 J**a 语言的简单 JDBC 编程示例。
清单 3普通j**a的JDBC编程。
import j**a.sql.connection;import j**a.sql.drivermanager;import j**a.sql.resultset;import j**a.sql.sqlexception;import j**a.sql.statement;public class jdbcexample1 }catch(sqlexception e)catch(classnotfoundexception e)finallycatch(exception e){}trycatch(exception e){}trycatch(exception e){}
哇。 清单 3 包含近 40 行**,只是为了看看表中的内容! 如果你使用的是 groovysql,猜猜你要用多少行? 如果你猜了超过 10 行,那你就错了。 正如你在清单 4 中看到的,Groovy 为我处理了底层资源,这让我可以很好地专注于手头的任务 - 执行一个简单的查询。
清单 4欢迎来到 Groovysql!
import groovy.sql.sqlclass groovysqlexample1}}
很好。 只需几行代码,我就能够编写与清单 3 相同的行为,而无需将其关闭connection
并且不需要关闭resultset
,或您可以在 JDBC 编程中找到的任何其他重要功能。 这太令人兴奋了,而且仍然如此简单。 现在让我仔细看看我是怎么做到的。
在清单 4 中欢迎来到 Groovysql! 在第一行中,我创建了 groovy 的sql
用于连接到指定数据库的类的实例。 在此示例中,我创建了sql
实例,指向我的机器上运行的 MySQL 数据库。 到目前为止,它非常基本,对吧? 真正重要的是以下部分,迭代器和闭包在一两次点击中显示了它们的力量。 请把eachrow
方法用作传入查询生成的结果的迭代器。 在底层,您可以看到返回了 JDBCresultset
对象,其内容被传递到for
循环。 因此,每次迭代都必须执行我传入的闭包。 如果在数据库中找到word
如果表格只有三行,则闭包将执行三次 - 打印word_id
spelling
跟part_of_speech
价值。
如果你愿意我指定的变量中的方程式row
删除并使用 Groovy 的隐式变量之一it
(恰好是迭代器的实例),*可以进一步简化。 如果我这样做,那么前面的 ** 可以像清单 5 中这样写:
清单 5GroovySQL数据库it
变量。
import groovy.sql.sqlclass groovysqlexample1"}}}
在这个**中,我可以删除row
变量,带有it
鉴于。 而且,我还在string
在语句中引用it
变量,就像我在
做到了。
前面的例子相当简单,但GroovySQL正在处理更复杂的数据操作查询(例如insert
update
跟delete
query)也非常可靠。对于这些查询,你不需要使用迭代器,所以 groovy 的sql
此外,还提供了对象execute
跟executeupdate
方法。 这些方法让人想起普通的JDBCstatement
类,它也有execute
跟executeupdate
方法。
在清单 6 中,您看到一个简单的insert
,然后再次将其设置为:该语法使用变量替换。 这个**只是为了
word
新行将插入到表中。
清单 6使用 groovysql 插入。
wid = 999spelling = "nefarious"pospeech = "adjective"sql.execute("insert into word (word_id, spelling, part_of_speech)values ($")
Groovy 还提供execute
方法的重载版本,它接收与查询中找到的值相对应的一列值
元素对应。 在清单 7 中,我只是简单地询问了一下word
表中的一行。 在后台,GroovySQL 创建了普通的 J**a 语言j**a.sql.preparedstatement
一个实例。
清单 7使用 GroovySQL 创建 PreparedStatement 的实例。
val = sql.execute("select * from word where word_id = ?", [5])
更新的方式基本相同,也用executeupdate
方法。 另请注意,在清单 8 中executeupdate
方法接收一列值,其中包含查询
元素对应。
清单 8使用 groovysql 进行更新。
nid = 5spelling = "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 或工具都应该具有一些良好的数据操作功能,在本节中,我将向您介绍另外三个功能。
建立在 GroovySQL 的简单性之上,并由 GroovySQL 支持dataset
类型的概念,基本上是数据库表的对象表示形式。 用dataset
,可以遍历行,也可以添加新行。 事实上,使用数据集是表示公共数据集合的便捷方法。
但是,目前 groovysqldataset
类型的缺点是它们没有代表; 它们只是与数据库表的一对一映射。 在清单 10 中,我创建了一个文件word
桌子dataset
清单 10使用 GroovySQL 创建数据集。
import groovy.sql.sqlclass groovydatasetsexample1 words.add(word_id:"9999", spelling:"clerisy", part_of_speech:"noun")}}
正如你所看到的,groovysqldataset
类型可以很容易地使用each
遍历表内容并轻松使用的方法add
添加新行的方法add
接受一个的方法map
指示所需的数据。
存储过程调用和否定索引可能是数据操作的重要方面。 GroovySQL 使存储过程调用变得如此简单sql
类call
方法是一样的。 对于负索引,GroovySQL 提供了自己的增强功能resultset
类型,其工作方式非常类似于 Groovy 中的集合。 例如,如果要获取结果集中的最后一项,可以按照清单 11 所示进行操作:
清单 11使用 groovysql 进行负索引。
sql.eachrow("select * from word")
正如您在清单 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
在定义时如何创建此类变量。
清单 12使用 Groovysql 报告数据库状态。
import groovy.sql.sqlclass dbstatusreportelse if (status.variable_name == "questions") }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_%'")else if (status.variable_name == "com_select")else if (status.variable_name == "com_update") }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 的简单语法相结合,可在 J**A 平台上快速开发数据库应用程序。 最强大的是,GroovySQL 将资源管理任务从开发人员转移到底层 Groovy 框架,这使您可以专注于更重要的查询和查询结果。 但不要只记得我。 下次你被要求处理JDBC的麻烦时,试试GroovySQL的一点魔力。 然后给我发一封电子邮件,让我知道你的感受。
在下个月关于 Groovy 的文章中,我将介绍 Groovy 模板框架的细节。 您会发现,使用这个更智能的框架创建应用程序的视图组件是小菜一碟。