Apache Derby 简介
1. 概述
在本教程中,我们将了解 Apache Derby 数据库引擎,它是由 Apache Software Foundation 作为开源项目开发的基于 Java 的关系数据库引擎。
我们将从安装和配置它开始,然后查看它提供的与之交互的工具。创建示例数据库后,我们将学习如何使用 Derby 的命令行工具执行 SQL 命令。最后,我们将看到如何使用纯 JDBC 和 Spring Boot 应用程序以编程方式连接到数据库。
2. 部署模式
Apache Derby 有两个基本的部署选项:一个简单的嵌入式选项和一个客户端/服务器选项。
在嵌入式模式中,Derby 在同一个 Java 虚拟机 (JVM) 中作为简单的单用户 Java 应用程序运行。由于其自动启动和关闭,最终用户通常看不到它,也不需要管理员干预。在这种模式下,我们可以建立一个临时数据库,而无需对其进行管理。
在客户端/服务器模式下,Derby 在托管服务器的 Java 虚拟机 (JVM) 中运行,该虚拟机由提供跨网络的多用户连接的应用程序启动。
3. 安装配置
让我们看看如何安装 Apache Derby。
3.1. 安装
首先,我们可以从这里 下载最新版本的 Apache Derby。之后,我们提取下载的文件。解压后的安装包含几个子目录:
$ ls
bin demo docs index.html javadoc KEYS lib LICENSE NOTICE RELEASE-NOTES.html test
- bin包含用于执行实用程序和设置环境的脚本
- 演示包含示例程序
- javadoc包含 API 文档
- docs包含 Apache Derby 文档
- lib包含 Apache Derby .jar 文件
- test包含 Apache Derby 的回归测试
3.2. 配置
在启动数据库引擎之前,我们需要配置一些东西。
首先,我们将DERBY_HOME环境变量设置为我们提取 Apache Derby bin 的位置。例如,如果 Apache Derby 安装在/opt/derby-db目录中,我们可以使用以下命令:
export DERBY_HOME=/opt/derby-db
然后,我们将DERBY_HOME/bin目录添加到 PATH 环境变量中,以便我们可以从任何目录运行 Derby 脚本:
export PATH="$DERBY_HOME/bin:$PATH"
3.3. Derby库
在lib目录中有 Apache Derby 提供的各种库:
$ ls
derbyclient.jar derbynet.jar derbyshared.jar
derby.jar derbyoptionaltools.jar derbytools.jar
derbyrun.jar derby.war derbyLocale_XX.jar ...
每个库描述如下:
- derby.jar:嵌入式环境需要。对于客户端/服务器环境,我们只需要服务器上的这个库。
- *derbyshared.jar:*所有配置都需要,无论我们运行的是嵌入式引擎、网络服务器、远程客户端还是数据库工具。
- *derbytools.jar:*运行所有 Apache Derby 工具(IJ、DBLook 和导入/导出)所必需的。如果我们正在运行网络服务器或者我们的应用程序直接引用 JDBC 驱动程序,也需要。
- *derbyrun.jar:*用于启动 Apache Derby 工具
- *derbynet.jar:*启动 Apache Derby 网络服务器所必需的
- *derbyclient.jar:*需要使用 Apache Derby 网络客户端驱动程序
- *derbyLocale_XX.jar:*需要本地化 Apache Derby 的消息
4. 工具
Apache Derby 为不同的应用程序提供了许多工具。我们可以通过derbyrun.jar使用缩短的名称运行 Apache Derby 工具和实用程序,并且我们不需要设置 java CLASSPATH 环境变量。derbyrun.jar文件必须与其他 Derby JAR 文件位于同一文件夹中。
4.1. IJ
IJ 是一个基于 JDBC 的 Java 命令行应用程序。其主要目的是允许以交互方式或通过脚本执行 Derby SQL 语句。
首先,让我们运行 IJ 工具:
$ $DERBY_HOME/bin/ij
ij version 10.13
ij>
我们也可以使用下面的命令来执行它:
$ java -jar $DERBY_HOME/lib/derbyrun.jar ij
ij version 10.13
ij>
请注意,所有命令都以分号结尾。如果我们执行不带分号的命令,命令行将移至下一行。
在使用 SQL 语句的部分,我们将看到如何使用 IJ 执行多个命令。
此外,IJ 可以使用属性来执行命令。这可以帮助我们 通过 使用 IJ工具支持的 属性来节省一些重复性工作。
我们可以通过以下方式设置 IJ 属性:
- 通过在命令行上使用*-p property-file*选项指定属性文件
- 通过在命令行上使用*-D*选项
我们可以创建一个属性文件,添加所有需要的属性,然后运行以下命令:
$ java -jar derbyrun.jar ij -p file-name.properties
如果当前目录中不存在file-name.properties文件,我们将得到java.io.FileNotFoundException 。
例如,假设我们要创建到具有特定名称的特定数据库的连接。我们可以使用ij.database属性来做到这一点:
$ java -jar -Dij.protocol=jdbc:derby: -Dij.database=blogdemo derbyrun.jar ij
ij version 10.13
CONNECTION0* - jdbc:derby:blogdemo
* = current connection
4.2. DBLook
dblook工具提供数据库的DDL(数据定义语言)。比如我们可以将blogdemo数据库的DDL写到控制台:
$ $DERBY_HOME/bin/dblook -d jdbc:derby:blogdemo
-- Timestamp: 2021-08-23 01:29:48.529
-- Source database is: blogdemo
-- Connection URL is: jdbc:derby:blogdemo
-- appendLogs: false
-- ----------------------------------------------
-- DDL Statements for schemas
-- ----------------------------------------------
CREATE SCHEMA "basic_users";
-- ----------------------------------------------
-- DDL Statements for tables
-- ----------------------------------------------
CREATE TABLE "APP"."authors" ("id" INTEGER NOT NULL, "first_name" VARCHAR(255) , "last_name" VARCHAR(255));
-- ----------------------------------------------
-- DDL Statements for keys
-- ----------------------------------------------
-- PRIMARY/UNIQUE
ALTER TABLE "APP"."authors" ADD CONSTRAINT "SQL0000000000-582f8014-017b-6e26-ada1-00000644e000" PRIMARY KEY ("id");
dblook具有下面描述的其他选项。 我们可以使用*-o将 DDL 写入blogdemo.sql*之类的文件:
$ sudo $DERBY_HOME/bin/dblook -d jdbc:derby:blogdemo -o blogdemo.sql
我们还可以用*-z指定模式,用-t*指定表:
$ sudo $DERBY_HOME/bin/dblook -d jdbc:derby:blogdemo -o blogdemo.sql -z SCHEMA_NAME -t "TABLE_NAME"
4.3. 系统信息
Apache Derby sysinfo工具显示有关我们的 Java 环境和 Derby 版本的信息。此外,sysinfo工具在控制台上显示系统信息:
## $ java -jar $DERBY_HOME/lib/derbyrun.jar sysinfo
Java Version: 11.0.11
Java Vendor: Ubuntu
Java home: /usr/lib/jvm/java-11-openjdk-amd64
Java classpath: /opt/derby-db/lib/derbyrun.jar
OS name: Linux
OS architecture: amd64
OS version: 5.11.0-27-generic
Java user name: arash
Java user home: /home/arash
Java user dir: /opt/derby-db
java.specification.name: Java Platform API Specification
java.specification.version: 11
## java.runtime.version: 11.0.11+9-Ubuntu-0ubuntu2.20.04
[/opt/derby-db/lib/derby.jar] 10.13.1.1 - (1873585)
[/opt/derby-db/lib/derbytools.jar] 10.13.1.1 - (1873585)
[/opt/derby-db/lib/derbynet.jar] 10.13.1.1 - (1873585)
[/opt/derby-db/lib/derbyclient.jar] 10.13.1.1 - (1873585)
[/opt/derby-db/lib/derbyshared.jar] 10.13.1.1 - (1873585)
[/opt/derby-db/lib/derbyoptionaltools.jar] 10.13.1.1 - (1873585)
5. Apache Derby 中的 SQL 语句
在这里,我们将 检查Apache Derby 提供的一些基本 SQL 语句。我们将通过一个示例来查看每个语句的语法。
5.1. 创建数据库
我们可以使用connect命令和连接字符串中的create=true属性创建一个新数据库:
ij> connect 'jdbc:derby:databaseName;create=true';
5.2. 连接到数据库
当我们与 Derby 数据库交互时,IJ 会根据 URL 语法自动加载适当的驱动程序:
ij> connect 'jdbc:derby:blogdemo' user 'user1' password 'pass123';
5.3. 创建架构
CREATE SCHEMA语句定义了一个模式,这是一种为一组对象识别特定命名空间的方法:
CREATE SCHEMA schema_name AUTHORIZATION userName;
模式名称不能超过 128 个字符,并且在数据库中也必须是唯一的。此外,模式名称不能以前缀 SYS 开头。 下面是一个名为blogdemo_authors的模式示例:
ij> CREATE SCHEMA blogdemo_authors;
此外,我们可以为blogdemo_authors创建一个模式,只有ID 为arash的特定用户才能访问:
ij> CREATE SCHEMA blogdemo_authors AUTHORIZATION arash;
5.4. 删除模式
我们可以 使用 DROP SCHEMA语句删除一个 模式 ,而且目标模式必须为空才能使DROP SCHEMA成功。我们不能删除APP模式(默认用户模式)或 SYS模式:
DROP SCHEMA schema_name RESTRICT;
通过使用 RESTRICT关键字,我们可以强制 规定不能在指定模式中定义任何对象 ,以便从数据库中删除模式。
让我们看一个删除模式的示例:
ij> DROP SCHEMA blogdemo_authors RESTRICT;
5.5. 创建表
我们可以使用CREATE TABLE语句来创建一个包含列和约束的表:
CREATE TABLE table_name (
column_name1 column_data_type1 constraint (optional),
column_name2 column_data_type2 constraint (optional),
);
让我们看一个例子:
ij> CREATE TABLE posts(post_id INT NOT NULL, publish_date DATE NOT NULL,
view_number INT DEFAULT 0, PRIMARY KEY (post_id));
如果我们不指定默认值 ,则在列中 插入 NULL 作为默认值。
用于 CRUD 操作的其他 SQL 语句(如 INSERT、UPDATE、DELETE 和 SELECT)与标准 SQL 类似。
6. 使用 Apache Derby 进行 JDBC 编程
在这里,我们将学习如何创建一个使用 Apache Derby 作为数据库引擎的 Java 应用程序。
6.1. Maven 依赖项
Maven 中有两个 Derby驱动程序:derby和derbynet。前者用于嵌入式应用程序,而后者用于 客户端/服务器应用程序。
让我们为derby 添加一个 Maven 依赖项:
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.13.1.1</version>
</dependency>
此外,我们为derbyclient 添加 Maven 依赖项:
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derbyclient</artifactId>
<version>10.13.1.1</version>
</dependency>
6.2. JDBC URL 连接
我们可以为 客户端/服务器和嵌入式应用程序使用 不同 的连接字符串参数 连接到 数据库。
在下面的语法中,我们可以将它用于嵌入模式:
jdbc:derby:[subsubprotocol:][databaseName][;attribute=value]
此外,我们可以将以下语法用于客户端/服务器模式:
jdbc:derby://server[:port]/databaseName[;attribute=value]
数据库 URL 不包含嵌入式模式下的主机名和端口号。例如:
String urlConnection = "jdbc:derby:blogdemo;create=true";
6.3. 在嵌入式模式下使用 Apache Derby
让我们以嵌入式模式连接到 Apache Derby 数据库,如果当前目录不存在,则在当前目录中创建它,创建表,然后使用 SQL 语句将行插入表中:
String urlConnection = "jdbc:derby:blogdemo;create=true";
Connection con = DriverManager.getConnection(urlConnection);
Statement statement = con.createStatement();
String sql = "CREATE TABLE authors (id INT PRIMARY KEY,first_name VARCHAR(255),last_name VARCHAR(255))";
statement.execute(sql);
sql = "INSERT INTO authors VALUES (1, 'arash','ariani')";
statement.execute(sql);
6.4. 在客户端/服务器模式下使用 Apache Derby
首先,我们运行以下命令以客户端/服务器模式启动 Apache Derby:
$ java -jar $DERBY_HOME/lib/derbyrun.jar server start
Sat Aug 28 20:47:58 IRDT 2021 : Security manager installed using the Basic server security policy.
Sat Aug 28 20:47:58 IRDT 2021 : Apache Derby Network Server - 10.13.1.1 -
(1873585) started and ready to accept connections on port 1527
我们使用 JDBC API 连接到 localhost 上的 Apache Derby 服务器,并从blogdemo数据库的authors表中选择所有条目:
String urlConnection = "jdbc:derby://localhost:1527/blogdemo";
try (Connection con = DriverManager.getConnection(urlConnection)) {
Statement statement = con.createStatement();
String sql = "SELECT * FROM authors";
ResultSet result = statement.executeQuery(sql);
while (result.next()) {
// We can print or use ResultSet here
}
} catch (SQLException ex) {
ex.printStackTrace();
}
7. 使用 Spring Boot 的 Apache Derby
本节不会详细介绍如何基于Spring Boot 创建应用程序,而只会介绍与 Apache Derby 数据库交互相关的设置。
7.1. Apache Derby 的依赖项
我们只需将 Spring Boot 中的Spring Data 和 Apache Derby 依赖项添加到项目中即可将 Apache Derby 合并到其中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derbyclient</artifactId>
<version>10.13.1.1</version>
</dependency>
7.2. Spring引导配置
通过添加以下应用程序属性,我们可以使用 Derby 作为我们的持久数据库:
spring.datasource.url=jdbc:derby://localhost:1527/blogdemo
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DerbyTenSevenDialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=org.apache.derby.jdbc.ClientDriver