💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# `ij`工具 > 原文: [http://zetcode.com/db/apachederbytutorial/ij/](http://zetcode.com/db/apachederbytutorial/ij/) 在第四章中,我们将更详细地介绍 Derby 的`ij`工具。 `ij`是 Derby 随附的交互式脚本工具。 它是 Derby 数据库系统的命令行客户端。 它可以以两种方式使用:运行 SQL 文件或以交互方式执行 SQL 语句。 `ij`位于 Derby 安装目录的`bin`目录中。 ```java $ ls $DERBY_HOME/bin | grep ij ij ij.bat ``` 有两个脚本:扩展名为`.bat`的脚本适用于 Windows。 ## 启动`ij` `ij`可以通过三种基本方式启动。 ```java $ $DERBY_HOME/bin/ij ij version 10.11 ij> ``` 可以使用`ij`脚本启动 Derby `ij`。 ```java $ java -cp $DERBY_HOME/lib/derbytools.jar org.apache.derby.tools.ij ij version 10.11 ij> ``` 另一种方法是执行已编译的 Java 程序。 我们的类路径中必须有`derbytools.jar`。 第一种方法在脚本文件中执行的操作基本相同。 它还可以与环境变量一起使用。 ```java $ java -jar $DERBY_HOME/lib/derbyrun.jar ij ij version 10.11 ij> ``` 在第三种方法中,我们使用`derbyrun.jar`文件启动`ij`。 ## 运行 SQL 脚本 与 MySQL 或 PostgreSQL 命令行工具不同,`ij`非常简单。 它没有命令的历史记录。 不能使用光标键。 ```java $ 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`表,并插入了五行。 ```java 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`的目录中。 ```java 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 文件名用作参数。 ```java $ 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`工具时,我们尚未连接到数据库。 ```java ij> DROP TABLE CARS; 0 rows inserted/updated/deleted ij> EXIT; $ ``` 我们在执行`cars2.sql`脚本之前先删除表。 ```java $ 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`命令,标识符和关键字都不区分大小写。 ```java 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`命令的列表 ```java ij> CONNECT 'jdbc:derby://localhost:1527/testdb'; ``` `CONNECT`命令连接到数据库。 在我们的例子中,数据库名称为`testdb`。 本示例假定我们已经设置了 Derby 系统目录。 (有关下一部分的更多信息。)默认情况下,Derby 不需要用户名和密码。 我们可以配置 Derby 以要求它。 ```java ij> SHOW CONNECTIONS; CONNECTION0* - jdbc:derby://localhost:1527/testdb * = current connection ``` `SHOW CONNECTIONS`语句列出了所有打开的连接。 在我们的例子中,我们可以看到与`testdb`数据库的打开连接。 ```java ij> SHOW TABLES; TABLE_SCHEM |TABLE_NAME |REMARKS ------------------------------------------------------------------------ SYS |SYSALIASES | SYS |SYSCHECKS | SYS |SYSCOLPERMS | ... ``` `SHOW TABLES`命令显示数据库中的所有表。 有一些`SYS`表。 ```java ij> SHOW TABLES IN USER12; TABLE_SCHEM |TABLE_NAME |REMARKS ------------------------------------------------------------------------ USER12 |CARS | 1 row selected ``` 我们可以列出特定架构中的表。 `SHOW TABLES IN USER12`显示`USER12`模式中的表。 ```java 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`模式不是连接的当前模式,则必须在表名之前指定它。 当前模式在连接字符串中指定为用户名。 ```java ij> DISCONNECT; ij> SHOW CONNECTIONS; No connections available. ``` `DISCONNECT`命令与数据库断开连接。 随后的`SHOW CONNECTIONS`命令显示没有可用的连接。 ```java ij> EXIT; $ ``` 最后,我们退出`ij`工具。 在嵌入式环境中,它也会关闭数据库。 等效于`CONNECT 'jdbc:derby:testdb;shutdown=true';`命令。 ## SQL 语句 `ij`工具的主要目的是发出 SQL 命令。 我们重新连接到`testdb`数据库。 ```java $ $DERBY_HOME/bin/ij ij version 10.11 ij> CONNECT 'jdbc:derby://localhost/testdb;user=USER12'; ``` 现在,当前架构为`USER12`架构。 当为位于`USER12`模式中的表发布 SQL 语句时,我们可以省略模式名称。 ```java 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` ```java 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`表。 ```java ij> SELECT * FROM APP.FRIENDS; ID |NAME ------------------------------------- 1 |Jane 2 |Thomas 3 |Beka 3 rows selected ``` 从`FRIENDS`表中选择了三行。 由于该表不在当前模式中,因此我们必须完全限定该表名。 ```java 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 $ 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`环境变量。 ```java $ export DERBY_OPTS=-Dderby.system.home=/home/janbodnar/.derby ``` Derby 将自动尝试连接到指定系统目录中的数据库。 ## `ij`属性 启动`ij`工具时,我们可以在命令行或属性文件中指定属性。 这些属性是`ij`工具采用的各种参数。 它们可以为我们节省一些重复的工作。 ```java $ 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`属性。 ```java $ cat ij.properties ij.user=USER12 ij.database=testdb ij.protocol=jdbc:derby://localhost:1527/ ``` 使用`cat`命令,显示`ij.properties`文件的内容。 我们设置与第一个示例相同的属性。 ```java $ 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`工具。