ZetCode

ij 工具

最后修改于 2020 年 7 月 6 日

在第四章中,我们将更详细地介绍 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> 

Derby ij 可以使用 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

运行 SQL 脚本

与 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

我们检查数据。该表已成功创建。

SQL 文件的名称可以作为参数由 ij 工具获取。

$ cat cars2.sql 
CONNECT 'jdbc:derby://: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);

我们在 cars2.sql 文件中添加一个 CONNECT 语句。当我们启动 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://:1527/testdb';

CONNECT 命令连接到数据库。在我们的例子中,数据库名称是 testdb。此示例假定我们已经设置了 Derby 系统目录。(更多内容请参见下一节。)默认情况下,Derby 不需要用户名和密码。我们可以配置 Derby 以要求它。

ij> SHOW CONNECTIONS;
CONNECTION0* - 	jdbc:derby://: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'; 命令。

SQL 语句

ij 工具的主要目的是发出 SQL 命令。我们重新连接到 testdb 数据库。

$ $DERBY_HOME/bin/ij
ij version 10.11
ij> CONNECT 'jdbc:derby:///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

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 系统目录,我们分配 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:/// \
> -Dderby.system.home=/home/janbodnar/.derby \ 
> -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.11
CONNECTION0* - jdbc:derby://: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://: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://:1527/testdb
* = current connection
ij> SELECT * FROM CARS WHERE ID=2;
ID         |NAME                          |PRICE      
------------------------------------------------------
2          |Mercedes                      |57127      

1 row selected

ij 工具的 -p 选项采用属性文件名。

在本章中,我们介绍了 ij 工具。