derby ij命令_回归基础:编写Apache Derby的ij工具的脚本
derby ij命令
ij工具的目的是什么?
Apache Derby数据库(及其商业堂兄弟IBM®Cloudscape™)的位置非常适合嵌入到应用程序中。 它体积小巧,同时兼容Java™数据库连接(JDBC)和开放数据库连接(ODBC),并且建立在Java平台上,因此可在多种操作系统上使用。 但是,这种多功能性掩盖了其最强大的工具之一。
ij工具为完成诸如创建数据库和执行SQL语句之类的简单任务提供了一种简便的方法。 例如,您可以创建两个简单的数据库-一个用于保存项目,一个用于保存开发人员(请参见清单1 )。
清单1.创建数据库和表
ij> connect 'jdbc:derby:projectDB;create=true;';
ij> create table projects (id integer,project_name varchar(75),status integer,comments varchar(255)
);
0 rows inserted/updated/deleted
ij> insert into projects values (1, 'Wheel O Fish', 0, 'Waiting forcontract');
1 row inserted/updated/deleted
ij> insert into projects values (2, 'Bass O Matic', 1, 'In production');
1 row inserted/updated/deleted
ij> insert into projects values (3, 'Patty O Furniture', -1, 'Needclarification
. Does anybody know what this is?');
1 row inserted/updated/deleted
ij> connect 'jdbc:derby:developerDB;create=true;';
ij(CONNECTION1)> create table developers (id integer,developer_name varchar(75),availability varchar(255)
);
0 rows inserted/updated/deleted
ij(CONNECTION1)> insert into developers values (1, 'Jim Bacon', 'Open');
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into developers values (2, 'Brady James', 'Open');
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into developers values (3, 'Michelle Rappaport','Busy u
ntil October');
1 row inserted/updated/deleted
ij(CONNECTION1)> insert into developers values (4, 'Aaron Templeton', 'Ajoy every time we use him. Hire him.');
1 row inserted/updated/deleted
ij(CONNECTION1)>
(是的,通常我们会将这些表放入同一个数据库中。为了演示概念,请纵容我。)
如果创建数据库,表和数据只是ij所能做的,那么它仍然会很有用。 但是事实并非如此。 ij使您能够执行许多您可能认为只能使用成熟的JDBC应用程序才能完成的任务,例如,操纵游标以及创建和执行准备好的语句。
但是首先,请注意在创建第二个数据库时ij是如何创建第二个连接的。 到projectDB的第一个连接仍处于活动状态,但是您需要明确告诉ij您要使用它。
让我们看看它是如何工作的。
连接和隔离级别
ij使您可以做的一件事就是控制整个数据库系统以及与数据库的连接。 例如,现在我们有两个数据库连接,我们可以使用SET CONNECTION
命令在它们之间进行选择(参见清单2 )。
清单2.在数据库连接之间进行选择
ij(CONNECTION1)> select * from projects;
ERROR 42X05: Table 'PROJECTS' does not exist.
ij(CONNECTION1)> show connections;
CONNECTION0 - jdbc:derby:projectDB
CONNECTION1* - jdbc:derby:developerDB
* = current connection
ij(CONNECTION1)> set connection connection0;
ij(CONNECTION0)> select * from projects;
ID |PROJECT_NAME |STATUS |COMMENTS
-----------------------------------------------------------------
1 |Wheel O Fish |0 |Waiting for contract2 |Bass O Matic |1 |In production3 |Patty O Furniture |-1 |Need clarification.
Does anybody know what this is?3 rows selected
请注意,如果首先尝试从项目表中进行选择,那么即使该连接仍处于打开状态,也会收到错误消息,因为您当前正在使用与developerDB数据库的连接。 您可以通过发出show connections
命令来查看。 要更改连接,请使用set connection
命令,后跟数据库名称,如show connections
所示。
ij还使您可以设置总体数据库属性。 例如,您可以为数据库设置derby.database.propertiesOnly
属性,如下所示:
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(
'derby.database.propertiesOnly', 'true');
此命令确保在此数据库上专门设置的任何属性(例如身份验证要求)都不会被整个系统配置中的其他值所覆盖。
Derby可以识别几十个系统属性,例如derby.database.defaultConnectionMode
, derby.authentication.ldap.searchAuthDN
, derby.authentication.ldap.searchAuthPW
和derby.user.UserName
。
现在让我们看一下处理数据的一些方法。
使用游标
从数据库的一个或多个表中选择一组数据时,返回的数据称为游标。 (流行的传说认为这是“当前行集”的缩写。)有关隔离级别的文档始终都提到游标,但是您很少看到直接通过ij操作游标的讨论。 事实是,许多似乎需要操纵Java RecordSet的操作都可以使用游标直接在ij中完成。
只进游标
游标最简单的类型是firehose或仅向前游标。 该游标包含所有数据,使您可以在游标中的每个记录之间移动,但不能向后移动。 例如,参见清单3 。
清单3.只进游标
ij(CONNECTION0)> get cursor projectCursor as 'select * from projects';ij(CONNECTION0)> next projectCursor;
ID |PROJECT_NAME |STATUS |COMMENTS
---------------------------------------------------------------------
1 |Wheel O Fish |0 |Waiting for contractij(CONNECTION0)> next projectCursor;
ID |PROJECT_NAME |STATUS |COMMENTS
---------------------------------------------------------------------
2 |Bass O Matic |1 |In productionij(CONNECTION0)> next projectCursor;
ID |PROJECT_NAME |STATUS |COMMENTS
---------------------------------------------------------------------
3 |Patty O Furniture |-1 |Need clarification. Does
anybody know what this is?ij(CONNECTION0)> next projectCursor;
No current rowij(CONNECTION0)> previous projectCursor;
IJ ERROR: PREVIOUS
仅向前的游标上不允许上一个。 在这里,您可以使用get cursor
命令创建一个游标,并向它提供一个SQL语句,该语句代表您要包含的数据。 请注意,这里我只是从单个表中提取数据,但是您会变得像Derby在这些SQL语句中所允许的那样复杂。
有了光标后,您可以告诉它给您下一条记录,在这种情况下,它会按照SQL语句指定的顺序在记录列表中向下移动。 一旦到达最低点,ij就会告诉您不再有记录。 请注意,虽然您可以向下移动列表,但不能后退; 正如我之前所说,标准光标只能向前移动。 但这并不意味着您注定要始终朝一个方向前进。
滚动不敏感游标
有时仅向前的光标不够好,因为您想在记录之间移动。 为此,您可以创建一个对滚动不敏感的游标,如清单4所示 。
清单4.不滚动的游标
ij(CONNECTION0)> get scroll insensitive cursor projectScroll as
'select * from projects';
ij(CONNECTION0)> absolute 2 projectScroll;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
2 |Bass O Matic |1 |In productionij(CONNECTION0)> relative -1 projectScroll;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
1 |Wheel O Fish |0 |Waiting for contractij(CONNECTION0)> relative 2 projectScroll;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
3 |Patty O Furniture |-1 |Need clarification. Does
anybody know what this is?ij(CONNECTION0)> previous projectScroll;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
2 |Bass O Matic |1 |In productionij(CONNECTION0)> before first projectScroll;
No current row
ij(CONNECTION0)> next projectScroll;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
1 |Wheel O Fish |0 |Waiting for contract
请注意,必须关闭自动提交才能使用对滚动不敏感的光标。
在这里,您可以使用get scroll insensitive
光标命令,再次指定要包含的数据SQL语句。 有了对滚动不敏感的光标后,您将拥有更大的移动自由度。 您可以使用absolute
命令跳至第二行,使用relative
命令向前或向后移动指定的行数,移至上一行或下一行,或使用before first
和after last
命令将光标置于顶部或数据的底部。
可更新的游标
所有这些都很好,但是直接操作游标的真正价值在于能够在特定位置更新数据库。 例如,您可以遍历项目并根据当前光标位置更新其状态(请参见清单5 )。
清单5.一个可更新的游标
ij(CONNECTION0)> autocommit off;
ij(CONNECTION0)> get cursor updateProjects as 'select * from projects for update';
ij(CONNECTION0)> next updateProjects;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
1 |Wheel O Fish |0 |Waiting for contractij(CONNECTION0)> update projects set status = 1, comments =
'Contract received, starting work.' where current of updateProjects;
1 row inserted/updated/deletedij(CONNECTION0)> next updateProjects;
ID |PROJECT_NAME |STATUS |COMMENTS--------------------------------------------------------------------
2 |Bass O Matic |1 |In productionij(CONNECTION0)> next updateProjects;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
3 |Patty O Furniture |-1 |Need clarification. Does
anybody know what this is?ij(CONNECTION0)> delete from projects where current of updateProjects;
1 row inserted/updated/deleted
ij(CONNECTION0)> select * from projects;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
1 |Wheel O Fish |1 |Contract received,
starting work.
2 |Bass O Matic |1 |In production2 rows selected
ij(CONNECTION0)> commit;
ij(CONNECTION0)> close updateProjects;
首先,在创建可更新的游标之前,必须绝对确定已关闭自动提交功能。 其次,可更新游标必须仅向前,并且必须在select
语句中包含for update
子句。
从那里开始,您可以像以前一样操作游标,但是您也可以执行update
和delete
语句,这些语句将游标的当前位置(而不是任何特定的数据要求)作为where
子句。
最后,完成操作后,关闭光标以释放资源。
使用准备好的语句
通常不与命令行关联的另一个任务是使用准备好的语句。 重新编译准备好的语句以提高性能,并且在您需要一遍又一遍地执行相同操作时很方便。 例如,您可以创建一条语句,将所有当前开发人员设置为可用状态,如清单6所示 。
清单6.准备一条语句
ij(CONNECTION0)> set connection connection1;
ij(CONNECTION1)> prepare allDevelopersOpen as 'update developers set availability = ''open''';
ij(CONNECTION1)> execute allDevelopersOpen;
4 rows inserted/updated/deleted
ij(CONNECTION1)> select * from developers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
1 |Jim Bacon |open2 |Brady James |open3 |Michelle Rappaport |open4 |Aaron Templeton |open4 rows selected
=
在这里,您可以切换回另一个连接,并使用特定的硬编码SQL语句创建一个准备好的语句,然后执行它。
但是,更有用的是创建一个可用于不同行和不同值的语句,如清单7所示。
清单7.具有值的准备好的语句
ij(CONNECTION1)> prepare updateOneDeveloper as 'update developers set availability = ? where id = ?';
ij(CONNECTION1)> execute updateOneDeveloper using 'VALUES (''Im really serious here. Hire this guy!'', 4)';
1 row inserted/updated/deleted
ij(CONNECTION1)> commit;
ij(CONNECTION1)> select * from developers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
1 |Jim Bacon |open2 |Brady James |open3 |Michelle Rappaport |open4 |Aaron Templeton |Im really serious here. Hire this
guy!4 rows selected
与JDBC应用程序中的预处理语句一样,值将按语句中出现的顺序替换为每个占位符。
您甚至可以创建可与多组数据一起使用的准备好的语句(请参见清单8 )。
清单8.具有多组值的准备好的语句
ij(CONNECTION1)> prepare addDeveloper as 'insert into developers values (?, ?, ?)';
ij(CONNECTION1)> execute addDeveloper using 'VALUES (5, ''Corben Deeto'', ''Available this summer''), (6, ''Seetha Pio'', ''Open'')';
1 row inserted/updated/deleted
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from developers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------------------
1 |Jim Bacon |open2 |Brady James |open3 |Michelle Rappaport |open4 |Aaron Templeton |Im really serious here. HIRE this
guy!5 |Corben Deeto |Available this summer6 |Seetha Pio |Open6 rows selected
将准备好的语句与游标一起使用
也许最有用的预处理语句是那些不仅接受输入值,而且还对游标的当前行进行操作的语句。 例如,您可以创建一条仅影响当前开发人员的语句(请参见清单9 )。
清单9.具有可更新游标的准备好的语句
ij(CONNECTION1)> get cursor updateDevelopers as 'select * from developers for update';
ij(CONNECTION1)> prepare busyDeveloper as 'update developers set availability = ''Busy'' where current of updateDevelopers';
ij(CONNECTION1)> next updateDevelopers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
1 |Jim Bacon |openij(CONNECTION1)> next updateDevelopers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
2 |Brady James |openij(CONNECTION1)> execute busyDeveloper;
1 row inserted/updated/deleted
ij(CONNECTION1)> next updateDevelopers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
3 |Michelle Rappaport |openij(CONNECTION1)> next updateDevelopers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
4 |Aaron Templeton |Im really serious here. HIRE
this guy!ij(CONNECTION1)> execute busyDeveloper;
1 row inserted/updated/deleted
ij(CONNECTION1)> select * from developers;
ID |DEVELOPER_NAME |AVAILABILITY
--------------------------------------------------------
1 |Jim Bacon |open
2 |Brady James |Busy
3 |Michelle Rappaport |open
4 |Aaron Templeton |Busy
5 |Corben Deeto |Available this summer
6 |Seetha Pio |Open6 rows selected
ij(CONNECTION1)>
从技术上讲,您在这里没有做任何不同的事情。 您创建可更新的游标和准备好的语句。 关键在于,prepared语句中SQL语句引用游标的当前位置,因此您可以多次执行游标并更新不同的行。 这里的任务可能微不足道,但这就像跨多个表,执行触发器等SQL语句一样容易。
运行ij脚本
如果不实际讨论ij脚本的运行,那么关于ij脚本的文章是不完整的。 ij脚本本质上是文件中ij命令的编译,然后您可以将其馈送到ij应用程序。 例如,您可以创建一个脚本,以添加许多新的开发人员和项目(请参见清单10 ):
清单10.添加新开发人员和项目的脚本
connect 'jdbc:derby:projectDB;';insert into projects values (4, 'Movie Addict', 0, 'Waiting for contract');
insert into projects values (5, 'Tree Huggers Anonymous', 0,
'Waiting for contract');select * from projects;connect 'jdbc:derby:developerDB;';insert into developers values (7, 'Frank Stein', 'Busy');
insert into developers values (8, 'Wolff Mann', 'Open');select * from developers;
脚本本身非常简单,只需执行您可能从命令行访问的相同类型的命令即可。
要运行脚本,您有几种选择。 首先是从ij应用程序本身运行它(请参见清单11 )。
清单11.从ij应用程序中运行ij脚本
ij> run 'C:\myScripts\derbyscript.sql';
ij> connect 'jdbc:derby:projectDB;';
ij> insert into projects values (4, 'Movie Addict', 0,
'Waiting for contract');
1 row inserted/updated/deleted
ij> insert into projects values (5, 'Tree Huggers Anonymous', 0,
'Waiting for contract');
1 row inserted/updated/deleted
ij> select * from projects;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
1 |Wheel O Fish |1 |Contract received,
starting work.2 |Bass O Matic |1 |In production4 |Movie Addict |0 |Waiting for contract5 |Tree Huggers Anonymous|0 |Waiting for contract4 rows selected
ij> connect 'jdbc:derby:developerDB;';
ij(CONNECTION1)> insert into developers values (7, 'Frank Stein',
'Busy');
1 row inserted/updated/deleted
注意,ij回显每个命令。
另一个替代方法是在首次启动ij应用程序时引用脚本,实际上是用文件内容替换stdin
(请参见清单12 ):
清单12.将ij脚本提供给ij应用程序
C:\SW\db-derby-10.1.2.1-bin\frameworks\embedded\bin>java
-Djdbc.drivers=org.apache.derby.jdbc.EmbeddedDriverorg.apache.derby.tools.ij derbyscript.sql
ij version 10.1
ij> connect 'jdbc:derby:projectDB;';
ij> insert into projects values (4, 'Movie Addict', 0,
'Waiting for contract');
1 row inserted/updated/deleted
ij> insert into projects values (5, 'Tree Huggers Anonymous', 0,
'Waiting for contract');
1 row inserted/updated/deleted
ij> select * from projects;
ID |PROJECT_NAME |STATUS |COMMENTS
--------------------------------------------------------------------
1 |Wheel O Fish |1 |Contract received, starting work.2 |Bass O Matic |1 |In production
脚本完成后,ij应用程序退出。 从ij本身运行脚本时,情况并非如此。
在这种情况下,程序将继续正常运行,直到有人键入exit
为止。
在某些情况下,您需要保存在ij中运行的脚本的输出。 为此,只需将输出重定向到文件,或使用ij.outputfile
属性(请参见清单13 ):
清单13.将ij脚本的输出保存到文件中
java -Djdbc.drivers=org.apache.derby.jdbc.EmbeddedDriver
-Dij.outfile=results.txt org.apache.derby.tools.ij
derbyscript.sql
请注意,如果将输出重定向到文件,则不会在命令行上看到它。
摘要
在本文中,您了解了Apache Derby项目随附的ij管理工具的一些较少使用的功能。 除了创建数据库和执行屏幕捕获的常规功能外,ij还使您可以创建和操作仅向前和对滚动不敏感的游标以及对其进行更新。 您可以创建和执行准备好的语句,也可以创建和运行外部脚本。 所有这些功能都可以组合在一起,以在ij中创建一个功能相当实用的应用程序权限,而无需构建任何外部基础结构。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-ad-ij/index.html
derby ij命令
derby ij命令_回归基础:编写Apache Derby的ij工具的脚本相关推荐
- derby mysql 同步_三分钟学会使用Derby数据库
Derby数据库是一个纯用Java实现的内存数据库,属于Apache的一个开源项目.由于是用Java实现的,所以可以在任何平台上运行:另外一个特点是体积小,免安装,java1.6开始集成了derby数 ...
- 搜索python代码的软件_用python编写一个高效搜索代码工具
用python编写一个高效搜索代码工具 大多码农在linux环境下使用grep+关键词的命令搜索自己想要的代码或者log文件.今天介绍用python如何编写一个更强大的搜索工具,windows下也适用 ...
- shell编写mysql全备和增备脚本_基于mysqldump编写自动全备增备的shell脚本
基于mysqldump编写自动全备增备的shell脚本 在线上MySQL数据库备份分为全备和增备,而xtrabackup备份已经支持了增量备份了,但是mysqldump就不支持增量备份,所以我们需要写 ...
- java 回归遍历_回归基础:代码遍历
java 回归遍历 This article guides you through the basics of regression by showing code and thorough expl ...
- 翻译python语言命令_【基础】python实现命令行数据翻译
环境:python3.6 2.x的urllib包和3.x是有区别的,3.x的urllib包里面的request===2.x的urllib2包 1. 获取请求地址链接 2. 分析参数,组装链接地址 3. ...
- 多元回归训练数据和测试数据_回归基础-数据结构提醒,如果和切换之后的寿命...
多元回归训练数据和测试数据 I just had a great one on one coding learning session with a good friend of mine over ...
- python视频抽帧 后 前端javascript如何显示_使用OpenCV编写一个可以定时抽帧的脚本...
一.概述 在计算机视觉数据预处理阶段,一个常用的工序是要将原始的视频数据抽帧,得到图像数据集.有时候视频很长,而我们感兴趣的场景可能只在某些较短的时段内出现.这种情况下如果对整个视频抽帧再进行人工筛选 ...
- python编写脚本方法_使用Python编写提取日志中的中文的脚本的方法
由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提取工具,代替手工提取的繁杂,涉及中文字符,正则表达式不好匹配 ...
- python 拆分excel工作表_用python编写的excel拆分小工具
from datetime import date,datetime from openpyxl import Workbook from openpyxl import load_workbook ...
最新文章
- SAP WM 显示TR ITEM的标准报表LX09
- 架设httpd服务器
- conda设置Python虚拟环境 其他配置
- 如何获取字符串中某个具体的数值--通过json.load转化成字典形式获取
- 【LeetCode笔记】剑指 Offer 55 - II. 平衡二叉树(递归、二叉树)
- pycharm在创建py文件时如何自动注释
- TensorFlow2.0:常用数据范围压缩函数
- Mac----已被macOS使用
- hdu 4619 Warm up 2 (二分匹配)
- -个很个性的二本人计时
- JAVA常见设计模式面试题
- static与final关键字
- R 语言详细安装教程(保姆级)及 RStudio简易安装教程
- 人民搜索再体验 标题抽取存在问题
- 快递柜管理系统微信小程序-计算机毕业设计
- 【转载】树莓派 Raspberry Pi Pico windows7 串口驱动
- 远程手机控制开关应用
- 中鸣机器人走黑线_BOEBOT机器人走黑线任务处理过程以及反思
- 简信CRM:超实用的移动CRM选型参考指南
- Linux下查看显卡型号