原文: http://zetcode.com/db/apachederbytutorial/ij/

在第四章中,我们将更详细地介绍 Derby 的ij工具。

ij是 Derby 随附的交互式脚本工具。 它是 Derby 数据库系统的命令行客户端。 它可以以两种方式使用:运行 SQL 文件或以交互方式执行 SQL 语句。 ij位于 Derby 安装目录的bin目录中。

  1. $ ls $DERBY_HOME/bin | grep ij
  2. ij
  3. ij.bat

有两个脚本:扩展名为.bat的脚本适用于 Windows。

启动ij

ij可以通过三种基本方式启动。

  1. $ $DERBY_HOME/bin/ij
  2. ij version 10.11
  3. ij>

可以使用ij脚本启动 Derby ij

  1. $ java -cp $DERBY_HOME/lib/derbytools.jar org.apache.derby.tools.ij
  2. ij version 10.11
  3. ij>

另一种方法是执行已编译的 Java 程序。 我们的类路径中必须有derbytools.jar。 第一种方法在脚本文件中执行的操作基本相同。 它还可以与环境变量一起使用。

  1. $ java -jar $DERBY_HOME/lib/derbyrun.jar ij
  2. ij version 10.11
  3. ij>

在第三种方法中,我们使用derbyrun.jar文件启动ij

运行 SQL 脚本

与 MySQL 或 PostgreSQL 命令行工具不同,ij非常简单。 它没有命令的历史记录。 不能使用光标键。

  1. $ cat cars.sql
  2. -- SQL for the CARS table
  3. SET SCHEMA USER12;
  4. CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
  5. (START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
  6. INSERT INTO CARS(Name, Price) VALUES('Audi', 52642);
  7. INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127);
  8. INSERT INTO CARS(Name, Price) VALUES('Skoda', 9000);
  9. INSERT INTO CARS(Name, Price) VALUES('Volvo', 29000);
  10. INSERT INTO CARS(Name, Price) VALUES('Bentley', 350000);
  11. INSERT INTO CARS(Name, Price) VALUES('Citroen', 21000);
  12. INSERT INTO CARS(Name, Price) VALUES('Hummer', 41400);
  13. INSERT INTO CARS(Name, Price) VALUES('Volkswagen', 21600);

在模式USER12中创建了CARS表,并插入了五行。

  1. ij> RUN 'cars.sql';
  2. ij> -- SQL for the CARS table
  3. SET SCHEMA USER12;
  4. 0 rows inserted/updated/deleted
  5. ij> CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
  6. (START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
  7. 0 rows inserted/updated/deleted
  8. ij> INSERT INTO CARS(Name, Price) VALUES('Audi', 52642);
  9. 1 row inserted/updated/deleted
  10. ij> INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127);
  11. 1 row inserted/updated/deleted
  12. ...

我们使用RUN命令执行cars.sql文件。 该文件位于启动ij的目录中。

  1. ij> SELECT * FROM CARS;
  2. ID |NAME |PRICE
  3. ------------------------------------------------------
  4. 1 |Audi |52642
  5. 2 |Mercedes |57127
  6. 3 |Skoda |9000
  7. 4 |Volvo |29000
  8. 5 |Bentley |350000
  9. 6 |Citroen |21000
  10. 7 |Hummer |41400
  11. 8 |Volkswagen |21600
  12. 8 rows selected

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

ij工具可以将 SQL 文件名用作参数。

  1. $ cat cars2.sql
  2. CONNECT 'jdbc:derby://localhost:1527/testdb';
  3. SET SCHEMA USER12;
  4. CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
  5. (START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
  6. INSERT INTO CARS(Name, Price) VALUES('Audi', 52642);
  7. INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127);
  8. INSERT INTO CARS(Name, Price) VALUES('Skoda', 9000);
  9. INSERT INTO CARS(Name, Price) VALUES('Volvo', 29000);
  10. INSERT INTO CARS(Name, Price) VALUES('Bentley', 350000);
  11. INSERT INTO CARS(Name, Price) VALUES('Citroen', 21000);
  12. INSERT INTO CARS(Name, Price) VALUES('Hummer', 41400);
  13. INSERT INTO CARS(Name, Price) VALUES('Volkswagen', 21600);

我们将CONNECT语句添加到cars2.sql文件中。 当我们启动ij工具时,我们尚未连接到数据库。

  1. ij> DROP TABLE CARS;
  2. 0 rows inserted/updated/deleted
  3. ij> EXIT;
  4. $

我们在执行cars2.sql脚本之前先删除表。

  1. $ java -Dderby.system.home=/home/janbodnar/.derby \
  2. > -jar $DERBY_HOME/lib/derbyrun.jar ij cars2.sql

我们设置 Derby 系统目录,并以cars2.sql作为参数启动ij工具。 再次创建CARS表。

基本命令

我们可以发出两种命令。 ij工具和 SQL 语句专用的命令。 ij中的每个命令都以分号终止。 所有ij命令,标识符和关键字都不区分大小写。

  1. ij> HELP;
  2. Supported commands include:
  3. PROTOCOL 'JDBC protocol' [ AS ident ];
  4. -- sets a default or named protocol
  5. DRIVER 'class for driver'; -- loads the named class
  6. CONNECT 'url for database' [ PROTOCOL namedProtocol ] [ AS connectionName ];
  7. -- connects to database URL
  8. -- and may assign identifier
  9. ...

HELP命令显示ij命令的列表

  1. ij> CONNECT 'jdbc:derby://localhost:1527/testdb';

CONNECT命令连接到数据库。 在我们的例子中,数据库名称为testdb。 本示例假定我们已经设置了 Derby 系统目录。 (有关下一部分的更多信息。)默认情况下,Derby 不需要用户名和密码。 我们可以配置 Derby 以要求它。

  1. ij> SHOW CONNECTIONS;
  2. CONNECTION0* - jdbc:derby://localhost:1527/testdb
  3. * = current connection

SHOW CONNECTIONS语句列出了所有打开的连接。 在我们的例子中,我们可以看到与testdb数据库的打开连接。

  1. ij> SHOW TABLES;
  2. TABLE_SCHEM |TABLE_NAME |REMARKS
  3. ------------------------------------------------------------------------
  4. SYS |SYSALIASES |
  5. SYS |SYSCHECKS |
  6. SYS |SYSCOLPERMS |
  7. ...

SHOW TABLES命令显示数据库中的所有表。 有一些SYS表。

  1. ij> SHOW TABLES IN USER12;
  2. TABLE_SCHEM |TABLE_NAME |REMARKS
  3. ------------------------------------------------------------------------
  4. USER12 |CARS |
  5. 1 row selected

我们可以列出特定架构中的表。 SHOW TABLES IN USER12显示USER12模式中的表。

  1. ij> DESCRIBE USER12.CARS;
  2. COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
  3. ------------------------------------------------------------------------------
  4. ID |BIGINT |0 |10 |19 |AUTOINCRE&|NULL |NO
  5. NAME |VARCHAR |NULL|NULL|30 |NULL |60 |YES
  6. PRICE |INTEGER |0 |10 |10 |NULL |NULL |YES
  7. 3 rows selected

DESCRIBE命令提供对指定表或视图的解密。 如果USER12模式不是连接的当前模式,则必须在表名之前指定它。 当前模式在连接字符串中指定为用户名。

  1. ij> DISCONNECT;
  2. ij> SHOW CONNECTIONS;
  3. No connections available.

DISCONNECT命令与数据库断开连接。 随后的SHOW CONNECTIONS命令显示没有可用的连接。

  1. ij> EXIT;
  2. $

最后,我们退出ij工具。 在嵌入式环境中,它也会关闭数据库。 等效于CONNECT 'jdbc:derby:testdb;shutdown=true';命令。

SQL 语句

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

  1. $ $DERBY_HOME/bin/ij
  2. ij version 10.11
  3. ij> CONNECT 'jdbc:derby://localhost/testdb;user=USER12';

现在,当前架构为USER12架构。 当为位于USER12模式中的表发布 SQL 语句时,我们可以省略模式名称。

  1. ij> SELECT * FROM CARS WHERE ID IN (1, 3, 5);
  2. ID |NAME |PRICE
  3. ------------------------------------------------------
  4. 1 |Audi |52642
  5. 3 |Skoda |9000
  6. 5 |Bentley |350000
  7. 3 rows selected

在上面的 SQL 语句中,我们为 ID 为 1、3 和 5 的行选择所有三列。

friends.sql

  1. CREATE TABLE APP.FRIENDS(ID INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
  2. (START WITH 1, INCREMENT BY 1), NAME VARCHAR(25));
  3. INSERT INTO APP.FRIENDS(NAME) VALUES('Jane');
  4. INSERT INTO APP.FRIENDS(NAME) VALUES('Thomas');
  5. INSERT INTO APP.FRIENDS(NAME) VALUES('Beky');

我们在APP模式中有一个FRIENDS表。

  1. ij> SELECT * FROM APP.FRIENDS;
  2. ID |NAME
  3. -------------------------------------
  4. 1 |Jane
  5. 2 |Thomas
  6. 3 |Beka
  7. 3 rows selected

FRIENDS表中选择了三行。 由于该表不在当前模式中,因此我们必须完全限定该表名。

  1. ij> INSERT INTO APP.FRIENDS(Name) VALUES ('Robert');
  2. 1 row inserted/updated/deleted
  3. ij> SELECT ID, NAME FROM APP.FRIENDS WHERE ID=4;
  4. ID |NAME
  5. -------------------------------------
  6. 4 |Robert
  7. 1 row selected

我们在FRIENDS表中插入新行,然后选择它。

指定 Derby 系统目录

Derby 系统目录包含数据库文件,配置数据或日志文件。 如果我们不提供 Derby 系统目录,则假定当前目录为 Derby 系统目录。 为了提供 Derby 系统目录,我们分配了derby.system.home属性。 可以通过 JVM 选项,配置文件,环境变量或 Java 文件来完成。

  1. $ java -Dderby.system.home=/home/janbodnar/.derby \
  2. > -jar $DERBY_HOME/lib/derbyrun.jar ij
  3. ij version 10.11

在这里,我们使用-D JVM 选项指定 Derby 系统目录。 derby.log文件在系统目录中创建。 每次我们连接到 Derby 数据库时,都会重新创建derby.log文件。 我们可以看一下时间戳。 如果derby.log文件出现在预期的目录中,则我们尚未正确设置 Derby 系统目录。

我们可能不想每次都指定 Derby 系统目录。 我们可以利用DERBY_OPTS环境变量。

  1. $ export DERBY_OPTS=-Dderby.system.home=/home/janbodnar/.derby

Derby 将自动尝试连接到指定系统目录中的数据库。

ij属性

启动ij工具时,我们可以在命令行或属性文件中指定属性。 这些属性是ij工具采用的各种参数。 它们可以为我们节省一些重复的工作。

  1. $ java -Dij.user=USER12 -Dij.database=testdb -Dij.protocol=jdbc:derby://localhost/ \
  2. > -Dderby.system.home=/home/janbodnar/.derby \
  3. > -jar $DERBY_HOME/lib/derbyrun.jar ij
  4. ij version 10.11
  5. CONNECTION0* - jdbc:derby://localhost:1527/testdb
  6. * = current connection
  7. ij> SELECT * FROM CARS WHERE ID = 1;
  8. ID |NAME |PRICE
  9. ------------------------------------------------------
  10. 1 |Audi |52642
  11. 1 row selected
  12. ij>

我们使用-D选项在命令行上提供三个ij属性。 ij.user指定用于建立连接的用户名。 提供的用户名将成为当前架构。 ij.database具有我们连接到的数据库名称。 ij.protocol属性指定数据库连接 URL 的默认协议。 我们准备启动 SQL 语句。

在下一个示例中,我们创建一个ij.properties文件,在其中设置三个ij属性。

  1. $ cat ij.properties
  2. ij.user=USER12
  3. ij.database=testdb
  4. ij.protocol=jdbc:derby://localhost:1527/

使用cat命令,显示ij.properties文件的内容。 我们设置与第一个示例相同的属性。

  1. $ java -Dderby.system.home=/home/janbodnar/.derby \
  2. > -jar $DERBY_HOME/lib/derbyrun.jar ij -p ij.properties
  3. ij version 10.11
  4. CONNECTION0* - jdbc:derby://localhost:1527/testdb
  5. * = current connection
  6. ij> SELECT * FROM CARS WHERE ID=2;
  7. ID |NAME |PRICE
  8. ------------------------------------------------------
  9. 2 |Mercedes |57127
  10. 1 row selected

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

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