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 的行选择了所有三列。
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
工具。