ij
工具
在第四章中,我们将更详细地介绍 Derby 的ij
工具。
ij
是 Derby 随附的交互式脚本工具。 它是 Derby 数据库系统的命令行客户端。 它可以以两种方式使用:运行 SQL 文件或以交互方式执行 SQL 语句。 ij
位于 Derby 安装目录的bin
目录中。
$ ls $DERBY_HOME/bin | grep ij
ij
ij.bat
ij
工具在第四章中,我们将更详细地介绍 Derby 的ij
工具。
ij
是 Derby 随附的交互式脚本工具。 它是 Derby 数据库系统的命令行客户端。 它可以以两种方式使用:运行 SQL 文件或以交互方式执行 SQL 语句。 ij
位于 Derby 安装目录的bin
目录中。
$ ls $DERBY_HOME/bin | grep ij
ij
ij.bat
有两个脚本:扩展名为.bat
的脚本适用于 Windows。
ij
ij
可以通过三种基本方式启动。
$ $DERBY_HOME/bin/ij
ij version 10.11
ij>
可以使用ij
脚本启动 Derby ij
。
$ java -cp $DERBY_HOME/lib/derbytools.jar org.apache.derby.tools.ij
ij version 10.11
ij>
另一种方法是执行已编译的 Java 程序。 我们的类路径中必须有derbytools.jar
。 第一种方法在脚本文件中执行的操作基本相同。 它还可以与环境变量一起使用。
$ java -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.11
ij>
在第三种方法中,我们使用derbyrun.jar
文件启动ij
。
与 MySQL 或 PostgreSQL 命令行工具不同,ij
非常简单。 它没有命令的历史记录。 不能使用光标键。
$ cat cars.sql
-- SQL for the CARS table
SET SCHEMA USER12;
CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
INSERT INTO CARS(Name, Price) VALUES(‘Audi’, 52642);
INSERT INTO CARS(Name, Price) VALUES(‘Mercedes’, 57127);
INSERT INTO CARS(Name, Price) VALUES(‘Skoda’, 9000);
INSERT INTO CARS(Name, Price) VALUES(‘Volvo’, 29000);
INSERT INTO CARS(Name, Price) VALUES(‘Bentley’, 350000);
INSERT INTO CARS(Name, Price) VALUES(‘Citroen’, 21000);
INSERT INTO CARS(Name, Price) VALUES(‘Hummer’, 41400);
INSERT INTO CARS(Name, Price) VALUES(‘Volkswagen’, 21600);
在模式USER12
中创建了CARS
表,并插入了五行。
ij> RUN 'cars.sql';
ij> -- SQL for the CARS table
SET SCHEMA USER12;
0 rows inserted/updated/deleted
ij> CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
0 rows inserted/updated/deleted
ij> INSERT INTO CARS(Name, Price) VALUES(‘Audi’, 52642);
1 row inserted/updated/deleted
ij> INSERT INTO CARS(Name, Price) VALUES(‘Mercedes’, 57127);
1 row inserted/updated/deleted
…
我们使用RUN
命令执行cars.sql
文件。 该文件位于启动ij
的目录中。
ij> SELECT * FROM CARS;
ID |NAME |PRICE
------------------------------------------------------
1 |Audi |52642
2 |Mercedes |57127
3 |Skoda |9000
4 |Volvo |29000
5 |Bentley |350000
6 |Citroen |21000
7 |Hummer |41400
8 |Volkswagen |21600
8 rows selected
我们检查数据。 该表已成功创建。
ij
工具可以将 SQL 文件名用作参数。
$ cat cars2.sql
CONNECT 'jdbc:derby://localhost:1527/testdb';
SET SCHEMA USER12;
CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
INSERT INTO CARS(Name, Price) VALUES(‘Audi’, 52642);
INSERT INTO CARS(Name, Price) VALUES(‘Mercedes’, 57127);
INSERT INTO CARS(Name, Price) VALUES(‘Skoda’, 9000);
INSERT INTO CARS(Name, Price) VALUES(‘Volvo’, 29000);
INSERT INTO CARS(Name, Price) VALUES(‘Bentley’, 350000);
INSERT INTO CARS(Name, Price) VALUES(‘Citroen’, 21000);
INSERT INTO CARS(Name, Price) VALUES(‘Hummer’, 41400);
INSERT INTO CARS(Name, Price) VALUES(‘Volkswagen’, 21600);
我们将CONNECT
语句添加到cars2.sql
文件中。 当我们启动ij
工具时,我们尚未连接到数据库。
ij> DROP TABLE CARS;
0 rows inserted/updated/deleted
ij> EXIT;
$
我们在执行cars2.sql
脚本之前先删除表。
$ java -Dderby.system.home=/home/janbodnar/.derby \
> -jar $DERBY_HOME/lib/derbyrun.jar ij cars2.sql
我们设置 Derby 系统目录,并以cars2.sql
作为参数启动ij
工具。 再次创建CARS
表。
我们可以发出两种命令。 ij
工具和 SQL 语句专用的命令。 ij
中的每个命令都以分号终止。 所有ij
命令,标识符和关键字都不区分大小写。
ij> HELP;
Supported commands include:
PROTOCOL ‘JDBC protocol’ [ AS ident ];
– sets a default or named protocol
DRIVER ‘class for driver’; – loads the named class
CONNECT ‘url for database’ [ PROTOCOL namedProtocol ] [ AS connectionName ];
– connects to database URL
– and may assign identifier
…
HELP
命令显示ij
命令的列表
ij> CONNECT 'jdbc:derby://localhost:1527/testdb';
CONNECT
命令连接到数据库。 在我们的例子中,数据库名称为testdb
。 本示例假定我们已经设置了 Derby 系统目录。 (有关下一部分的更多信息。)默认情况下,Derby 不需要用户名和密码。 我们可以配置 Derby 以要求它。
ij> SHOW CONNECTIONS;
CONNECTION0* - jdbc:derby://localhost:1527/testdb
* = current connection
SHOW CONNECTIONS
语句列出了所有打开的连接。 在我们的例子中,我们可以看到与testdb
数据库的打开连接。
ij> SHOW TABLES;
TABLE_SCHEM |TABLE_NAME |REMARKS
------------------------------------------------------------------------
SYS |SYSALIASES |
SYS |SYSCHECKS |
SYS |SYSCOLPERMS |
...
SHOW TABLES
命令显示数据库中的所有表。 有一些SYS
表。
ij> SHOW TABLES IN USER12;
TABLE_SCHEM |TABLE_NAME |REMARKS
------------------------------------------------------------------------
USER12 |CARS |
1 row selected
我们可以列出特定架构中的表。 SHOW TABLES IN USER12
显示USER12
模式中的表。
ij> DESCRIBE USER12.CARS;
COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID |BIGINT |0 |10 |19 |AUTOINCRE&|NULL |NO
NAME |VARCHAR |NULL|NULL|30 |NULL |60 |YES
PRICE |INTEGER |0 |10 |10 |NULL |NULL |YES
3 rows selected
DESCRIBE
命令提供对指定表或视图的解密。 如果USER12
模式不是连接的当前模式,则必须在表名之前指定它。 当前模式在连接字符串中指定为用户名。
ij> DISCONNECT;
ij> SHOW CONNECTIONS;
No connections available.
DISCONNECT
命令与数据库断开连接。 随后的SHOW CONNECTIONS
命令显示没有可用的连接。
ij> EXIT;
$
最后,我们退出ij
工具。 在嵌入式环境中,它也会关闭数据库。 等效于CONNECT 'jdbc:derby:testdb;shutdown=true';
命令。
ij
工具的主要目的是发出 SQL 命令。 我们重新连接到testdb
数据库。
$ $DERBY_HOME/bin/ij
ij version 10.11
ij> CONNECT 'jdbc:derby://localhost/testdb;user=USER12';
现在,当前架构为USER12
架构。 当为位于USER12
模式中的表发布 SQL 语句时,我们可以省略模式名称。
ij> SELECT * FROM CARS WHERE ID IN (1, 3, 5);
ID |NAME |PRICE
------------------------------------------------------
1 |Audi |52642
3 |Skoda |9000
5 |Bentley |350000
3 rows selected
在上面的 SQL 语句中,我们为 ID 为 1、3 和 5 的行选择所有三列。
friends.sql
CREATE TABLE APP.FRIENDS(ID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(25));
INSERT INTO APP.FRIENDS(NAME) VALUES('Jane');
INSERT INTO APP.FRIENDS(NAME) VALUES('Thomas');
INSERT INTO APP.FRIENDS(NAME) VALUES('Beky');
我们在APP
模式中有一个FRIENDS
表。
ij> SELECT * FROM APP.FRIENDS;
ID |NAME
-------------------------------------
1 |Jane
2 |Thomas
3 |Beka
3 rows selected
在本章中,我们提到了 Derby 工具。 Derby 工具和工具是 Derby 随附的一组脚本。 它们通常用于创建,检查和更新 Derby 数据库。
在此页面中,我们将提及sysinfo
,dblook
,ij
,startNetworkServer
和stopNetworkServer
工具。
Derby 工具可以两种方式运行。 我们使用位于 Derby 安装目录的 bin 目录中的脚本名称,也可以使用derbyrun.jar
文件启动它们。
$ $DERBY_HOME/bin/ij
$ java -jar $DERBY_HOME/lib/derbyrun.jar ij
我们可以通过在终端中指定脚本名称来启动ij
工具。 第二行使用derbyrun.jar
文件运行ij
。
sysinfo
工具提供有关操作系统,Java 和 Derby 的信息。 它将打印 Java 版本,Java 主目录,操作系统版本,Java 运行时版本,Derby 版本,当前和支持的语言环境。 该工具对于跟踪 Derby 的某些安装或配置问题很有用。
$ $DERBY_HOME/bin/sysinfo
------------------ Java Information ------------------
Java Version: 1.8.0_111
Java Vendor: Oracle Corporation
Java home: /home/janbodnar/bin/jdk1.8.0_111/jre
Java classpath: /home/janbodnar/bin/jdk1.8.0_111/db/lib/derby.jar:/home/janbodnar/bin/jdk1.8.0_111/db/lib/derbynet.jar:/home/janbodnar/bin/jdk1.8.0_111/db/lib/derbytools.jar:/home/janbodnar/bin/jdk1.8.0_111/db/lib/derbyoptionaltools.jar:/home/janbodnar/bin/jdk1.8.0_111/db/lib/derbyclient.jar
OS name: Linux
OS architecture: amd64
OS version: 4.4.0-66-generic
...
这是特定系统上提供的信息的摘录。
ij
是一个交互式脚本工具。 它用于对 Derby 数据库运行脚本或交互式查询。
$ cat cars.sql
SET SCHEMA USER12;
CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
INSERT INTO CARS(Name, Price) VALUES('Audi', 52642);
INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127);
INSERT INTO CARS(Name, Price) VALUES('Skoda', 9000);
INSERT INTO CARS(Name, Price) VALUES('Volvo', 29000);
INSERT INTO CARS(Name, Price) VALUES('Bentley', 350000);
INSERT INTO CARS(Name, Price) VALUES('Citroen', 21000);
INSERT INTO CARS(Name, Price) VALUES('Hummer', 41400);
INSERT INTO CARS(Name, Price) VALUES('Volkswagen', 21600);
我们有一个cars.sql
文件,它创建一个数据库模式和一个CARS
表。
$ $DERBY_HOME/bin/ij
ij version 10.11
ij> CONNECT 'jdbc:derby:testdb;user=user12;create=true';
我们启动ij
工具。 我们创建一个testdb
数据库并建立连接。
ij> SHOW CONNECTIONS;
CONNECTION0* - jdbc:derby:testdb
* = current connection
SHOW CONNECTIONS
语句显示与 Derby 数据库的打开的连接。
ij> RUN 'cars.sql';
ij> CREATE SCHEMA USER12;
0 rows inserted/updated/deleted
ij> CREATE TABLE CARS(ID INT PRIMARY KEY, NAME VARCHAR(30), PRICE INT);
0 rows inserted/updated/deleted
ij> INSERT INTO CARS VALUES(1, 'Audi', 52642);
1 row inserted/updated/deleted
ij> INSERT INTO CARS VALUES(2, 'Mercedes', 57127);
1 row inserted/updated/deleted
ij> INSERT INTO CARS VALUES(3, 'Skoda', 9000);
...
我们加载并执行cars.sql
网站。 我们被告知正在进行的操作。
ij> SELECT * FROM CARS;
ID |NAME |PRICE
------------------------------------------------------
1 |Audi |52642
2 |Mercedes |57127
3 |Skoda |9000
4 |Volvo |29000
5 |Bentley |350000
6 |Citroen |21000
7 |Hummer |41400
8 |Volkswagen |21600
8 rows selected
我们从CARS
表中选择所有行。
ij> CONNECT 'jdbc:derby:testdb;shutdown=true';
ERROR 08006: Database 'testdb' shutdown.
在 Derby 中关闭数据库会导致异常。 预期错误 08006。
ij> SHOW CONNECTIONS;
No current connection
连接已关闭。
ij> EXIT;
我们使用EXIT
命令退出ij
工具。 请注意,每个命令后都有分号。
dblook
工具用于保存数据库对象的数据定义语言,包括表,视图,索引和触发器。
$DERBY_HOME/bin/dblook -d jdbc:derby:testdb
-- Timestamp: 2017-03-13 20:05:43.281
-- Source database is: testdb
-- Connection URL is: jdbc:derby:testdb
-- appendLogs: false
– DDL Statements for schemas
CREATE SCHEMA “USER12”;
– DDL Statements for tables
CREATE TABLE “USER12”.“CARS” (“ID” INTEGER NOT NULL, “NAME” VARCHAR(30), “PRICE” INTEGER);
CREATE TABLE “APP”.“CARS” (“ID” BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), “NAME” VARCHAR(30), “PRICE” INTEGER);
– DDL Statements for keys
– PRIMARY/UNIQUE
ALTER TABLE “APP”.“CARS” ADD CONSTRAINT “SQL170313140819740” PRIMARY KEY (“ID”);
ALTER TABLE “USER12”.“CARS” ADD CONSTRAINT “SQL170313200304680” PRIMARY KEY (“ID”);
在上面的示例中,我们已从testdb
数据库中转储了对象。 使用-d
选项,我们提供了数据库的连接 URL。 在我们的案例中,dblook
工具保存了一个数据库架构和一个表。 使用-o
选项,可以将输出重定向到文件。
startNetworkServer
和stopNetworkServer
这些脚本启动和停止 Derby Network 服务器。 如果是联网服务器,则可以创建到 Derby 数据库的多个连接。
$ $DERBY_HOME/bin/startNetworkServer &
[1] 12421
$ Mon Mar 13 20:12:39 CET 2017 : Security manager installed using the Basic server security policy.
Mon Mar 13 20:12:40 CET 2017 : Apache Derby Network Server - 10.11.1.2 - (1629631) started and ready to accept connections
在这里,我们使用startNetworkServer
脚本启动 Derby Network Server。
ij> CONNECT 'jdbc:derby://localhost:1527/testdb';
在这里,我们通过 Derby Network Server 连接到testdb
数据库。 网络连接的连接 URL 是不同的。
ij> SELECT * FROM USER12.CARS;
ID |NAME |PRICE
------------------------------------------------------
1 |Audi |52642
2 |Mercedes |57127
3 |Skoda |9000
4 |Volvo |29000
5 |Bentley |350000
6 |Citroen |21000
7 |Hummer |41400
8 |Volkswagen |21600
8 rows selected
我们从CARS
表中选择所有汽车。 由于我们没有在连接 URL 中提供数据库模式,因此我们现在必须指定它。 数据库模式是用户名; 在我们的情况下USER12
。
$ $DERBY_HOME/bin/stopNetworkServer
Mon Mar 13 20:15:42 CET 2017 : Apache Derby Network Server - 10.11.1.2 - (1629631) shutdown
$ Mon Mar 13 20:15:42 CET 2017 : Apache Derby Network Server - 10.11.1.2 - (1629631) shutdown
我们已经使用stopNetworkServer
脚本停止了服务器。
NetworkServerControl
NetworkServerControl
是一个系统工具,可以启动和停止 Derby 网络服务器并配置或检索诊断信息。 除ping
以外,所有命令只能从运行服务器的计算机上执行。
$ $DERBY_HOME/bin/NetworkServerControl start &
使用start
命令,我们启动 Derby 服务器。
$ $DERBY_HOME/bin/NetworkServerControl ping
Tue Mar 21 15:53:29 CET 2017 : Connection obtained for host: localhost, port number 1527.
ping
命令测试 Derby 服务器是否已启动。
$ $DERBY_HOME/bin/NetworkServerControl sysinfo
--------- Derby Network Server Information --------
Version: CSS10110/10.11.1.2 - (1629631) Build: 1629631 DRDA Product Id: CSS10110
-- listing properties --
derby.drda.traceDirectory=/home/janbodnar/.derby/
derby.drda.maxThreads=0
derby.drda.sslMode=off
derby.drda.keepAlive=true
...
sysinfo
命令提供系统信息。
$ $DERBY_HOME/bin/NetworkServerControl runtimeinfo
--- Derby Network Server Runtime Information ---
---------- Session Information ---------------
Session # :3
-------------------------------------------------------------
# Connection Threads : 1
# Active Sessions : 1
# Waiting Sessions : 0
Total Memory : 78643200 Free Memory : 75359512
runtimeinfo
命令提供有关正在运行的网络服务器的会话,线程,预备语句以及内存使用的大量调试信息。
$ $DERBY_HOME/bin/NetworkServerControl shutdown
Tue Mar 21 15:56:43 CET 2017 : Apache Derby Network Server - 10.11.1.2 - (1629631) shutdown
Tue Mar 21 15:56:44 CET 2017 : Apache Derby Network Server - 10.11.1.2 - (1629631) shutdown
shutdown
命令停止 Derby 服务器。
在本章中,我们写了有关 Derby 工具的文章。
从FRIENDS
表中选择了三行。 由于该表不在当前模式中,因此我们必须完全限定该表名。
ij> INSERT INTO APP.FRIENDS(Name) VALUES ('Robert');
1 row inserted/updated/deleted
ij> SELECT ID, NAME FROM APP.FRIENDS WHERE ID=4;
ID |NAME
-------------------------------------
4 |Robert
1 row selected
我们在FRIENDS
表中插入新行,然后选择它。
Derby 系统目录包含数据库文件,配置数据或日志文件。 如果我们不提供 Derby 系统目录,则假定当前目录为 Derby 系统目录。 为了提供 Derby 系统目录,我们分配了derby.system.home
属性。 可以通过 JVM 选项,配置文件,环境变量或 Java 文件来完成。
$ java -Dderby.system.home=/home/janbodnar/.derby \
> -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.11
在这里,我们使用-D
JVM 选项指定 Derby 系统目录。 derby.log
文件在系统目录中创建。 每次我们连接到 Derby 数据库时,都会重新创建derby.log
文件。 我们可以看一下时间戳。 如果derby.log
文件出现在预期的目录中,则我们尚未正确设置 Derby 系统目录。
我们可能不想每次都指定 Derby 系统目录。 我们可以利用DERBY_OPTS
环境变量。
$ export DERBY_OPTS=-Dderby.system.home=/home/janbodnar/.derby
Derby 将自动尝试连接到指定系统目录中的数据库。
ij
属性启动ij
工具时,我们可以在命令行或属性文件中指定属性。 这些属性是ij
工具采用的各种参数。 它们可以为我们节省一些重复的工作。
$ java -Dij.user=USER12 -Dij.database=testdb -Dij.protocol=jdbc:derby://localhost/ \
> -Dderby.system.home=/home/janbodnar/.derby \
> -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.11
CONNECTION0* - jdbc:derby://localhost:1527/testdb
* = current connection
ij> SELECT * FROM CARS WHERE ID = 1;
ID |NAME |PRICE
------------------------------------------------------
1 |Audi |52642
1 row selected
ij>
我们使用-D
选项在命令行上提供三个ij
属性。 ij.user
指定用于建立连接的用户名。 提供的用户名将成为当前架构。 ij.database
具有我们连接到的数据库名称。 ij.protocol
属性指定数据库连接 URL 的默认协议。 我们准备启动 SQL 语句。
在下一个示例中,我们创建一个ij.properties
文件,在其中设置三个ij
属性。
$ cat ij.properties
ij.user=USER12
ij.database=testdb
ij.protocol=jdbc:derby://localhost:1527/
使用cat
命令,显示ij.properties
文件的内容。 我们设置与第一个示例相同的属性。
$ java -Dderby.system.home=/home/janbodnar/.derby \
> -jar $DERBY_HOME/lib/derbyrun.jar ij -p ij.properties
ij version 10.11
CONNECTION0* - jdbc:derby://localhost:1527/testdb
* = current connection
ij> SELECT * FROM CARS WHERE ID=2;
ID |NAME |PRICE
------------------------------------------------------
2 |Mercedes |57127
1 row selected
ij
工具的-p
选项采用属性文件名。
在本章中,我们介绍了ij
工具。