使用 Groovy 进行 JDBC 编程

小夏 科技 更新 2024-02-21

使用 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_idspellingpart_of_speech价值。

如果你愿意我指定的变量中的方程式row删除并使用 Groovy 的隐式变量之一it(恰好是迭代器的实例),*可以进一步简化。 如果我这样做,那么前面的 ** 可以像清单 5 中这样写:

清单 5GroovySQL数据库it变量。

import groovy.sql.sqlclass groovysqlexample1"}}}
在这个**中,我可以删除row变量,带有it鉴于。 而且,我还在string在语句中引用it变量,就像我在做到了。

前面的例子相当简单,但GroovySQL正在处理更复杂的数据操作查询(例如insertupdatedeletequery)也非常可靠。对于这些查询,你不需要使用迭代器,所以 groovy 的sql此外,还提供了对象executeexecuteupdate方法。 这些方法让人想起普通的JDBCstatement类,它也有executeexecuteupdate方法。

在清单 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 使存储过程调用变得如此简单sqlcall方法是一样的。 对于负索引,GroovySQL 提供了自己的增强功能resultset类型,其工作方式非常类似于 Groovy 中的集合。 例如,如果要获取结果集中的最后一项,可以按照清单 11 所示进行操作:

清单 11使用 groovysql 进行负索引。

sql.eachrow("select * from word")
正如您在清单 11 中看到的,提取结果集的最后一个元素非常容易,只要它用 -1 索引即可。 如果我想尝试一下,我还可以使用索引 2 访问相同的元素。

这些示例非常简单,但它们可以让您很好地了解 GroovySQL 的强大功能。 我将以一个实际示例来结束本月的课程,该示例演示了到目前为止讨论的所有功能。

报告应用程序通常会将信息从数据库中拖出。 在典型的业务环境中,您可能会被要求编写一个报告应用程序,以通知销售团队当前的 Web 销售情况,或者让开发团队对系统某些方面(如系统的数据库)的性能执行例行监视。

为了继续这个简单的示例,假设您刚刚部署了一个企业范围的 Web 应用程序。 当然,因为你在写 ** 时也写了大量的单元测试(用 groovy 形式),所以它运行起来没有问题; 但是,您仍然需要生成有关数据库状态的报告,以便对其进行优化。 你想知道你的客户如何使用你的应用程序,以便你可以识别性能问题并修复它们。

通常,时间限制限制了可在这些类型的应用程序中使用的提示数。 但是你新发现的GroovySQL知识将使你轻松完成应用程序,让你有时间添加更多你想要的功能。

在此示例中,您的目标数据库是 MySQL,它恰好支持使用查询发现状态信息的概念。 以下是您感兴趣的状态信息:

运行时间。 处理的查询总数。 特定查询的比例,例如insertupdateselect。使用 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 模板框架的细节。 您会发现,使用这个更智能的框架创建应用程序的视图组件是小菜一碟。

相似文章

    破译JDBC编程六步曲,让大众轻松掌握数据库编程的秘密!

    JDBC 编程的六个步骤JDBC 编程是在 J A 应用程序中与数据库交互的标准方法。它提供了一整套 API,允许开发者通过 j a 执行查询 插入 更新 删除数据等各种数据库操作。JDBC 编程通常由以下六个步骤组成,每个步骤都旨在实现数据库连接 执行 SQL 语句和处理结果集。第 步 加载数据库...

    使用 Vavr 进行函数式编程

    V r 使函数式编程更简单 更易于使用。在本系列的上一篇文章中,我们介绍了 J a 平台提供的 lambda 表达式和流。受 J A 标准库的通用性要求和二进制文件大小的限制,J a 标准库对函数式编程的 API 支持相对有限。函数声明只有两种类型 函数和双函数,流上支持的操作数量也很少。为了更好的...

    HarmonyOS使用什么编程语言进行开发?

    根据华为官方发布的信息,HarmonyOS的开发支持使用j a c c 等编程语言进行开发。同时,华为还发布了方舟编译器数据,表明HarmonyOS系统是用C和C 语言编写的。HarmonyOS系统和方舟编译器的思路是一样的 直接用机器语言编写APP,取消安卓系统的ART虚拟机,直接编译成二进制机器...

    python编程有什么用

    Python 是一种广泛使用的高级编程语言,以其清晰的语法和强大的功能而闻名。Python 的设计理念强调可读性和简单性,使其成为初学者和专业开发人员的流行语言。Python 在各个领域都有广泛的应用,以下是一些主要用途 Python 通过 Django 和 Flask 等框架提供强大的 Web 开...

    为什么有些编程语言需要编译才能执行 学习牛牛

    在计算机科学领域,编程语言的执行方式有两种主要模式 编译和解释。某些编程语言需要编译才能执行,因为编译过程提供了一系列好处,包括改进的性能 保护和跨平台可移植性。编译和解释之间的基本区别 编译和解释是执行程序的两种不同方式。在编译语言中,源代码在执行之前由编译器处理,转换为机器代码或中间代码,然后由...