Contents

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驱动程序:derbyderbynet。前者用于嵌入式应用程序,而后者用于 客户端/服务器应用程序。

让我们为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