便捷,轻巧的Groovy数据库操作
本文主要介绍Groovy对数据的CRUD操作,熟悉groovy.sql包,测试使用的数据库是H2。
1.数据库连接配置
//数据库连接配置 def db = [url:'jdbc:h2:mem:groovy',user:'root',password:'root',driver:'org.h2.Driver' ];
2.创建数据库连接,这里使用到Groovy的Sql类。
//创建数据库连接 def sql = Sql.newInstance(db.url, db.user, db.password, db.driver);
3.创建数据库表
//创建数据库表 sql.execute('''CREATE TABLE account(id integer NOT NULL,name varchar(20),url varchar(100)) ''');
使用了groovy.sql.Sql类的execute方法执行一条SQL命令,在数据库groovy中创建了表account。
4.向数据库表中写入数据,并查询写入的数据
//写入数据 def datas=[ [100, 'Jack', 'http://www.jack.net'], [101, 'Groovy', 'http://groovy.com'], [102, 'Apache', 'http://apache.org'] ]; datas.each { param->sql.execute('INSERT INTO account(id, name, url) values(?,?,?)', param); } println('Insert After:'); sql.eachRow('SELECT id, name, url FROM account') { row->printf('|%d|%s|%s|\n', row.id, row.name, row.url); }
从4中的程序可以看出,向表account中写入3条数据记录,然后查询并遍历出查询结果,再这一过程中使用了Groovy的闭包特性,列表数据结构。
下面是查询的结果:
Insert After:
|100|Jack|http://www.jack.net|
|101|Groovy|http://groovy.com|
|102|Apache|http://apache.org|
5.查询数据
//查询第一行数据 def rs=sql.firstRow('SELECT * FROM account'); println('Query First Row:'); println(rs);
Groovy的Sql类提供了大量的查询方法(具体参见Groovy的API),上面5中的代码是查询第一条记录,返回的类型是GroovyRowReasult,其实现了Map接口。打印输出则是一个Groovy的Map类型表示。如下:
Query First Row: [ID:100, NAME:ZhangSan, URL:http://aiilive.blog.51cto.com]
6.更新数据
def name='ZhangSan'; def url='http://aiilive.blog.51cto.com'; sql.executeUpdate("UPDATE account SET name=$name, url=$url where id=100"); println('Update After:'); sql.eachRow('SELECT id, name, url FROM account') { row->printf('|%d|%s|%s|\n', row.id, row.name, row.url); }
7.删除数据
//删除指定条件的数据 name='Groovy'; sql.executeUpdate('DELETE FROM account WHERE name = ?', [name]); name='Apache'; sql.execute('DELETE FROM account WHERE name=:name', ['name':name]); println('Delete After:'); sql.eachRow('SELECT id, name, url FROM account') { row->printf('|%d|%s|%s|\n', row.id, row.name, row.url); }
8.使用DataSet来处理数据
DataSet是Sql类的直接子类,用DataSet来操作数据库表更加有操作对象的样子。
def account=sql.dataSet('account'); account.add([id:103, name:'h2', url:'http://h2.org']); name='51cto'; url='http://www.51cto.com'; account.add([id:104, name:name, url:url]); println('DataSet Update After'); account.eachRow('SELECT id, name, url FROM account') { row->printf('|%d|%s|%s|\n', row.id, row.name, row.url); }; def accountRows=account.rows(); accountRows.each { row->printf('|%d|%s|%s|\n', row.id, row.name, row.url); }
如上dataSet的参数account表示数据库中的表名。account是一个DataSet类型的对象,通过add方法想数据库表中添加一条记录,通过rows方法返回数据库表中的所有记录,如果rows方法添加参数则可以实现分页的功能。
上面通过groovy.sql包提供的API实现了数据库的基本操作,而该包中的类的其它更多的方法能够实现更丰富的操作。下面介绍数据库表和对象的映射操作以及集成Spring来操作数据库表。
数据库表和对象的映射操作:
1.准备工作
创建一个抽象的类SqlQuery
import groovy.sql.*; abstract class SqlQuery { def sql; def query; def SqlQuery(sql,query){ this.sql=sql; this.query=query; } def execute(){ def rowList=sql.rows(query); def results=[]; def size=rowList.size(); 0.upto(size-1) { index-> results <<this.mapRow(rowList[index]); } return results; } def abstract mapRow(row); }创建一个Account类,其属性对应account表的字段 class Account { def id; def name; def url; @Override public String toString() { return "|$id|$name|$url|"; } }
创建一个AccountQuery类继承SqlQuery类并实现其中的抽象方法rowMap
import com.demo.db.SqlQuery; class AccountQuery extends SqlQuery { def AccountQuery(sql){ super(sql, 'SELECT id, name, url FROM account'); } @Override public Object mapRow(Object row) { //映射非常之灵活 //def acc=new Account(id:row.getAt('id'),name:row.getAt('name'),url:row.getAt('url')); //def acc=new Account(id:row.getAt(0),name:row.getAt(1),url:row.getAt(2)); def acc=new Account( id:row.getProperty('id'), name:row.getProperty('name'), url:row.getProperty('url')); return acc; } }
AccountQuery类实现了rowMap方法,正是该方法将对象和表记录关联起来的,即达到了Table - Object的映射效果。
注意:上面代码中的注释部分是实现同样功能的不同写法。
2.通过SqlQuery类来查询account表的数据
//表映射对象查询 def accountQuery=new AccountQuery(sql); def accList=accountQuery.execute(); println 'Table <-> Object Query: '; accList.each { acc->println acc.toString(); }
accList则是Account对象的一个数组集合,这样就实现了数据库表和对象的映射操作。
集成Spring来操作数据库表:
1.准备工作
Spring提供了一个MappingSqlQuery类,我们可以用AccountQuery继承该类并实行其中的rowMap方法来达到数据库表和对象的映射。
import com.demo.db.Account; import org.springframework.jdbc.object.MappingSqlQuery class AccountQuery extends MappingSqlQuery { def AccountQuery(ds){ super(ds,'SELECT id, name, url FROM account'); this.compile(); } @Override protected Object mapRow(ResultSet rs, int rowNumber) throws SQLException { def acc=new Account( id:rs.getInt('id'), name:rs.getString('name'), url:rs.getString('url')); return acc; } }
需要注意的地方是Spring的MappingSqlQuery类的带参数构造方法需要提供一个DataSource对象和查询的SQL命令。
创建一个Account类的DAO类,AccountDAO来实现数据库的操作,可以定义一个接口,然后另外实现该接口。应用程序操作数据库则只需要依赖定义的接口即可。这里省略了接口的定义。
class AccountDao { def ds; def getAccounts(){ def aq=new AccountQuery(ds); return aq.execute(); } }
AccountDao有一个getAccounts方法,通过该方法则可以获取到表account的所有记录,通过AccountQuery的Mapping映射,将返回一个集合对象。
2.通过AccountDao类操作数据库
//集成Spring def ds=new DriverManagerDataSource(db.url, db.user, db.password); def accountDao=new AccountDao(ds:ds); accLists=accountDao.getAccounts(); println 'Spring MappingSqlObject Query: '; accList.each { acc->println acc.toString(); }
至此Groovy操作数据库就到这里了。Groovy让Java操作数据库变得轻巧许多,同时又没有引入多余复杂的API负担。了解PHP的数据库操作就能很快感受到Groovy让Java操作数据库不那么繁琐了。
题外话:
很遗憾过了这么就才反映过来,应该拥抱Groovy,在经历学习的Python,PHP和Nodejs之后,就更应该在已有的Java知识的基础上使用这个据说是"Java时代的王储"的动态语言。固步自封是可怕的,停留在舒适区更是后果不堪设想。放下,才能更轻松的上路,才能走的更远。
在面对动不动就SSH, SSM,TSH,JSF等框架堆砌Java应用的时候,会有那么一个夜晚,突然累了,疲惫了。人就像一只猴子被困在囚笼里,跳着千篇一律的舞蹈骗取欣赏,有自知索然无味却不得以为之的和这囚笼纠缠在一起,不得自己。不久,就被发展的潮流拍到沙滩,碎岩之上。
面对生产效率和机器效率之间的取舍不见得能达成一致的协议,但技术服务于生产,想法化为产品,则更需要容易表达和实现这些东西的技术,把复杂的事情简单化应该是技术追求的目标。
转载于:https://blog.51cto.com/aiilive/1555523
相关文章:

Linux查看CPU和内存使用情况详解
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要。在 CentOS 中, 可以通过 top 命令来查看 CPU 使用状况。运行 top 命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的 模…

Fatal Error: Out of memory php内存溢出处理三种方法
有时候我们在运行php程序的时候会发现 Fatal Error: Out of memory 这样的提示,这有可能是程序中用到了大量了变量和对象,导致分配的内存不够用。 修改php.ini文件里的memory_limit参数 方法一:修改php.ini文件里的memory_limit默认参数128M&…

腾讯联合国家天文台启动探星计划,优图AI可提升120倍数据处理效率
7月9日,2021世界人工智能大会腾讯论坛在上海举办,腾讯云副总裁、腾讯优图实验室总经理吴运声发表了“人工智能的可持续发展之道”主题演讲,宣布全新推出腾讯云TI ONE、TI Matrix、TI DataTruth三大AI底层平台,可以提供包括算法开发…

C++:STL标准入门汇总
学无止境!!! 第一部分:(参考百度百科) 一、STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R…

C#精髓【月儿原创】第三讲 C#泛型有什么好处
说明:准备出一个系列,所谓精髓讲C#语言要点。这个系列没有先后顺序,不过尽量做到精。可能会不断增删整理,本系列最原始出处是csdn博客,谢谢关注。 C#精髓 第三讲 C#泛型有什么好处 作者:清清月儿 主页:…

腾讯汤道生:人工智能最大的价值是“服务于人”
7月9日,2021世界人工智能大会腾讯论坛在上海拉开帷幕,腾讯高级执行副总裁、云与智慧产业事业群CEO汤道生开场致辞。汤道生表示,人工智能的最大价值是“服务于人”,让衣食住行实现“以消费者为中心”的智慧化供给,让生产…

[转]在Eclipse中使用JUnit4进行单元测试(中级篇)
我们继续对初级篇中的例子进行分析。初级篇中我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4。 一、 包含必要地Package…

linux下磁盘镜像软件DRBD的使用
一、 什么是DRBD DRBD的全称为:Distributed Replicated Block Device (DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。与…

ASP.NET2.0轻松搞定统计图表【月儿原创】
ASP.NET2.0轻松搞定统计图表 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.3.27 本文讲述如何绘制条形图,折线图,柱形图,面积图等常见图形。 效果图: 手把手…

基于 Python 的 8 种常用抽样方法
抽样是统计学、机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到。所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本。上面所说的…

RegularExpressions(4) RegularExpressions 成员(一)
为什么80%的码农都做不了架构师?>>> 主要成员有: IRegex、ICapture、IMatch、IMatchCollection、IGroup、IGroupCollection 先看: ICapture; 常用的 IMatch、IGroup 都是从它继承而来; 作为一个底层接口一般不会被直接使用. 它为 IMatch、IGroup 提供了…

公有云环境下应用程序的自动化部署与水平扩展问题
先介绍了一下公有云计算环境下的一些特点,再根据这些特点探讨一下作为云计算用户而言,如何对应用程序做好自动化部署和水平扩展(弹性计算)的问题。阅读本文需要有一定的云计算知识、开发运维知识。 公有云环境的优势及其特点 公有…

另辟蹊径创建移动应用:iOS和Android代码共享
2019独角兽企业重金招聘Python工程师标准>>> 过去几年,移动应用席卷了整个世界,在工作和生活的方方面面改变着我们使用互联网的方式。创建移动应用的各种技术也随之兴起,各种开发流程也 将移动应用视为一等公民,开始考…

从0开始,基于Python探究深度学习神经网络
来源 | Data Science from Scratch, Second Edition作者 | Joel Grus全文共6778字,预计阅读时间50分钟。深度学习1. 张量2. 层(Layer)的抽象3. 线性层4. 神经网络作为一个层的序列5. 损失和优化6. 示例:XOR 重新…

ASP.NET2.0雷霆之怒盗链者的祝福【月儿原创】
ASP.NET2.0雷霆之怒盗链者的祝福 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.3.28 所谓盗链就是指其他网站把我们站点的文件链接帖到他们站上,这样白白占用我们的带宽。访问对于网站盗链行为&am…

数通手稿留档——BGP
本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1954062,如需转载请自行联系原作者

ASP.NET2.0打通文件图片处理任督二脉【月儿原创】
ASP.NET2.0打通文件图片处理任督二脉 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.1 1.最简单的单文件上传(没花头)2.多文件上传3.客户端检查上传文件类型(以上传图片为例)4.服务器端检查上传文件类型(以上…

PaaS变厚了
通过与包括东方通等在内的众多厂商的合作,华云数据的运营型PaaS变得越来越厚实。借助PaaS Plus的推出,华云数据要把云化的工作前移,在产品开发和测试阶段就开始云化,这会让传统企业的云化取得更好的效果。“PaaS是个筐,…

国内首个零信任技术标准发布 腾讯安全牵头编制
7月7日,中国电子工业标准化技术协会发布了国内首个零信任技术实现标准——T/CESA 1165-2021《零信任系统技术规范》团体标准,填补了国内零信任领域的技术标准空白。 (《零信任系统技术规范》) 据悉,该标准由腾讯安全牵…

集群概述及原理笔记(1)
it你好linux学习文档之集群概述及原理笔记(1) 一 前言 目前,越来越多的网站采用Linux操作系统,提供邮件、Web、文件存储、数据库等服务。也有非常多的公司在企业内部网中利用Linux服务器提供这些服务。随着人们对Linux服务器依赖的加深,对其…

ASP.NET2.0 遍历文件夹下所有图片【月儿原创】
ASP.NET2.0 遍历文件夹下所有图片 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.4 1.以下目录有若干图片(都是大图片) 2.在页面展现效果图 3.代码 后台代码using System;using Sy…

如何看待那些互相矛盾的论文?
原文:How to Make Sense of Contradictory Science Papers作者:Haixin Dang(利兹大学博士后研究员)、Liam Kofi Bright(伦敦经济学院的哲学系助理教授)译者:武文浩相信你已经读到过一些相互矛盾…

gdb图形化调试工具总结
gdb除了命令行方式等的调试之外,还有图形化的调试工具,下面列举一些供参考 1:insight 2: ddd 3: kgdb 4: xxgdb 其它的工具欢迎补充

ATLAS入门篇之CascadingDropDown控件编程
一、引言本文将通过具体的步骤解释如何借助于数据库(Microsoft SQL Server 2005 Express Edition)数据创建一个ASP.NET AJAX 1.0 CascadingDropDown控件。在本文示例中,我们将使用此层叠下拉列表框控件来选择要显示的汽车模型信息。【作者注】…

ASP.NET2.0 永恒密码之戒【月儿原创】
ASP.NET2.0 永恒密码之戒 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.8 1.我们经常有这样的情形: 就是用户注册时由于某个信息填写错误要重新填写。但是这个过程经过了服务器PostBack。所以密码…

GitHub 遭抵制!AI 代码生成神器竟成“抄袭工具”?
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)上周,微软、GitHub、OpenAI 三方联手推出的 AI 代码生成神器 GitHub Copilot 一经官宣便引起巨大关注:试问哪个开发者不想要这么一位“虚拟程序员”来解放自己的双手?…

LAMP的安装及Xcache的配置
LAMP是LinuxApacheMySQLPHP的简称,意指以Linux作为服务器的操作系统,以Apache的HTTPD作为Web服务器,以PHP作为动态网页的解释器,以MySQL作为后端数据库管理系统,由此而搭建起来的一套Web服务器系统。为方便起见&#x…

Windows Server 2003 AD升级到Windows Server 2008 AD的方法及详细步骤
前言: Windows Server 2008 是现在企业比较流行的服务器操作系统,安全性高,配置灵活、方便,集成了Hyper-V虚拟化功能,能够充分发挥硬件的性能。Windows Server 2008改写了底层的网络传输代码,理论上&#x…

ASP.NET2.0 ReportingServices使用详解
ASP.NET2.0 ReportingServices使用详解 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.9本文先做个简单介绍,更多关于ReportingServices的文章见后续。 1.打开BIDS,这是报表开发工具 2.新建项目 3.选择…

输出程序运行的时间(精确到微秒)
对于要求性能的代码,输出程序运行的时间还是很有必要的,而且需要较高的精确度,下面这个代码段就实现了此功能 注意:只限于Linux下使用,因为<sys/time.h>的缘故 1 #include <sys/time.h>2 #include <ios…