本文主要介绍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数据库操作相关推荐

  1. Python的数据库操作(Sqlalchemy)

    ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系.这样,我们要操作数据库,数据库中的表 ...

  2. Django模型之数据库操作-查询

    六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...

  3. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  4. .ne中的控制器循环出来的数据如何显示在视图上_Web程序设计-ASP.NET MVC4数据库操作实例...

    ASP.NET MVC4数据库操作实例 之前文章介绍了MVC4与Pure框架结合进行的网页设计过程中如何定义控制器.方法.模型.视图等.并使用实例进行了简单说明.本文将在此基础上进一步说明如何使用MV ...

  5. oracle可以面向对象吗,Jbdc助手-数据库操作面向对象的实现(oracle)

    前言: 如果你对hibernate不是那样的推崇,但感觉jdbc的sqlr操作又不是那么OO的话,那么这篇文章可能给能带来或多或少的期望- 在很长的一段时间里,中总感觉应该对sql的操作来实现一种集成 ...

  6. yii mysql数据库操作_Yii2数据库操作常用方法小结

    本文实例讲述了Yii2数据库操作常用方法.分享给大家供大家参考,具体如下: 查询: // find the customers whose primary key value is 10 $custo ...

  7. mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL

    数据库操作:MFC连接与MYSQL mysql 与MFC通常情况下都是用ODBC或者是是ADO相连接,但有点伤 我直接找网上的教程,仿照着进行连接,试了n边还是只能连接上,但无法进行如图读取,写入的操 ...

  8. 数据库操作(使用FMDB)

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  9. apache2.4.9 开启path_info访问_【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)...

    新建项目 打开VS2015,找到菜单项[文件->新建->项目],打开向导对话框: 注意我们的选择项: 运行平台:.NET FrameWork 4.5 项目模板:ASP.NET Web Ap ...

最新文章

  1. 品质检测破局:工业视觉检测云平台为智能制造“点睛”
  2. java清除浏览器记录_Javascript脚本之清除浏览器历史数据
  3. AIX系统Memory性能评估
  4. 裂墙推荐!IntelliJ IDEA 常用插件一览,让效率成为习惯
  5. P3733 [HAOI2017]八纵八横(线性基/线段树分治)
  6. form表单用js提前执行函数若不成功则不提交_面试必会的重复提交 8 种解决方案!...
  7. 好图表的标准是什么?手把手教你用GLAD原则优化一张看板
  8. for循环的使用步骤 1104
  9. 微软 补丁 服务器,2003到2016各版服务器操作系统ms17-010补丁直链地址
  10. php 按钮外观怎么改变,php 按钮样式
  11. java 手机端开发步骤_移动端页面开发流程
  12. Java:计算代码耗时的5种方法
  13. simpleCaptcha语音验证码实现及其扩展
  14. MySQL优化那些事
  15. RabbitMQ--基础--04--运转流程
  16. 苹果笔记本的end键_苹果电脑快捷键使用 Mac快捷键大全详细介绍
  17. UVALive6578-Trending Topic
  18. DDD 聚合根 限界上下文
  19. ROS中的TF坐标变换
  20. 神经网络简介ppt英文,人工神经网络简介

热门文章

  1. 软件体系架构模式之三微内核体系架构
  2. 深入理解PHP原理之变量(Variables inside PHP)
  3. HEAD元素使用集锦
  4. 将 SQL Server 存储过程用于数据访问
  5. 【Qt】Qt单例模式三种实现
  6. 【Ubuntu】ping: unknown host www.baidu.com
  7. apache httpd server安装的一个问题
  8. readline停止后怎么重新开始_2021,离婚后人生重新开始
  9. splitcontainer如何设置两边一样打_墙洞加筋如何计算?
  10. Java项目:无库版银行管理系统(java+Gui+文档)