便捷,轻巧的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
便捷,轻巧的Groovy数据库操作相关推荐
- Python的数据库操作(Sqlalchemy)
ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系.这样,我们要操作数据库,数据库中的表 ...
- Django模型之数据库操作-查询
六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...
- 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)
1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名 [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...
- .ne中的控制器循环出来的数据如何显示在视图上_Web程序设计-ASP.NET MVC4数据库操作实例...
ASP.NET MVC4数据库操作实例 之前文章介绍了MVC4与Pure框架结合进行的网页设计过程中如何定义控制器.方法.模型.视图等.并使用实例进行了简单说明.本文将在此基础上进一步说明如何使用MV ...
- oracle可以面向对象吗,Jbdc助手-数据库操作面向对象的实现(oracle)
前言: 如果你对hibernate不是那样的推崇,但感觉jdbc的sqlr操作又不是那么OO的话,那么这篇文章可能给能带来或多或少的期望- 在很长的一段时间里,中总感觉应该对sql的操作来实现一种集成 ...
- yii mysql数据库操作_Yii2数据库操作常用方法小结
本文实例讲述了Yii2数据库操作常用方法.分享给大家供大家参考,具体如下: 查询: // find the customers whose primary key value is 10 $custo ...
- mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL
数据库操作:MFC连接与MYSQL mysql 与MFC通常情况下都是用ODBC或者是是ADO相连接,但有点伤 我直接找网上的教程,仿照着进行连接,试了n边还是只能连接上,但无法进行如图读取,写入的操 ...
- 数据库操作(使用FMDB)
iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...
- apache2.4.9 开启path_info访问_【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)...
新建项目 打开VS2015,找到菜单项[文件->新建->项目],打开向导对话框: 注意我们的选择项: 运行平台:.NET FrameWork 4.5 项目模板:ASP.NET Web Ap ...
最新文章
- 品质检测破局:工业视觉检测云平台为智能制造“点睛”
- java清除浏览器记录_Javascript脚本之清除浏览器历史数据
- AIX系统Memory性能评估
- 裂墙推荐!IntelliJ IDEA 常用插件一览,让效率成为习惯
- P3733 [HAOI2017]八纵八横(线性基/线段树分治)
- form表单用js提前执行函数若不成功则不提交_面试必会的重复提交 8 种解决方案!...
- 好图表的标准是什么?手把手教你用GLAD原则优化一张看板
- for循环的使用步骤 1104
- 微软 补丁 服务器,2003到2016各版服务器操作系统ms17-010补丁直链地址
- php 按钮外观怎么改变,php 按钮样式
- java 手机端开发步骤_移动端页面开发流程
- Java:计算代码耗时的5种方法
- simpleCaptcha语音验证码实现及其扩展
- MySQL优化那些事
- RabbitMQ--基础--04--运转流程
- 苹果笔记本的end键_苹果电脑快捷键使用 Mac快捷键大全详细介绍
- UVALive6578-Trending Topic
- DDD 聚合根 限界上下文
- ROS中的TF坐标变换
- 神经网络简介ppt英文,人工神经网络简介
热门文章
- 软件体系架构模式之三微内核体系架构
- 深入理解PHP原理之变量(Variables inside PHP)
- HEAD元素使用集锦
- 将 SQL Server 存储过程用于数据访问
- 【Qt】Qt单例模式三种实现
- 【Ubuntu】ping: unknown host www.baidu.com
- apache httpd server安装的一个问题
- readline停止后怎么重新开始_2021,离婚后人生重新开始
- splitcontainer如何设置两边一样打_墙洞加筋如何计算?
- Java项目:无库版银行管理系统(java+Gui+文档)