# Derby 简介

> 原文： [http://zetcode.com/db/apachederbytutorial/derby/](http://zetcode.com/db/apachederbytutorial/derby/)

在本章中，我们介绍了 Derby 的基本概念和定义。

_Derby_ 是用 Java 编写的关系数据库管理系统。 它实现了 SQL-92 核心子集以及一些 SQL-99 功能。 它使用 IBM DB2 SQL 语法。 Derby 的占用空间很小，约为 2MB。 它具有事务支持。 Derby 使用的数据库格式是可移植的且与平台无关。

## 部署选项

Derby 可以两种模式运行：嵌入式或客户端服务器。 在嵌入式模式中，Derby 引擎在应用的 Java 虚拟机中运行。 该应用直接且排他地访问数据库。 没有其他应用可以同时访问数据库。 连接到数据库之前，无需设置 Derby 服务器。 当我们加载嵌入式驱动程序时，将启动 Derby 引擎。

在客户端-服务器模式下，Derby 提供跨网络的多用户连接。 Derby 引擎在服务器的 JVM 中运行。 其他应用可以从不同的 JVM 连接到数据库。 连接到数据库之前，我们必须启动数据库服务器。 这类似于其他 RDBMS，例如 Oracle 或 MySQL。

## Derby 系统

Derby 系统由 Derby 引擎及其环境的实例组成。 它包括系统目录，数据库和系统范围的配置。 每个数据库位于系统目录的子目录中，该子目录的名称与数据库相同。 此外，它还有一个错误日志文件和一个可选的`derby.properties`文件。 Derby 将信息和错误消息写入默认名称为`derby.log`的日志文件中。 该属性文件包含特定于 Derby 系统的配置数据和参数。 Derby 系统不是持久性的。 我们必须在每次启动时提供系统的位置。

通过`derby.system.home`属性指定 Derby 系统。 如果属性中指定的目录不存在，则 Derby 会自动创建它。 如果我们未明确指定属性，则使用当前目录。 当前目录是 JVM `user.dir`属性的值。 建议始终明确指定`derby.system.home`。

```java
-Dderby.system.home=/home/janbodnar/.derby

```

可以在命令行，环境变量，对话框（如果使用 IDE 的情况下）或`derby.properties`文件中设置属性。

## Derby 属性

`derby.properties`是 Derby 系统的配置文件。 它是一个简单的文本文件，使我们能够配置整个 Derby 系统，特定的数据库或企业集团。 企业集团是 Derby 中的表或索引。 我们可以配置几个选项，例如用户授权，要启动的数据库，日志文件的名称，系统目录的位置。 `derby.properties`不会自动创建； 如果要使用它，我们必须创建该文件。

## 启动和停止 Derby 数据库

在嵌入式模式下，数据库在应用首次建立连接时启动。 当 Derby 系统以`derby.system.bootAll`属性开头时，可以将其配置为引导所有可用的数据库。 数据库启动后，将消息写入`derby.log`文件。 通过在连接 URL 中指定`shutdown=true`属性来关闭数据库。 我们可以关闭数据库或整个 Derby 系统。

```java
DriverManager.getConnection("jdbc:derby:testdb;shutdown=true");
DriverManager.getConnection("jdbc:derby:;shutdown=true");

```

第一个 JDBC 调用将关闭`testdb`数据库。 第二个调用结束整个 Derby 系统。 请注意，系统关闭时会弹出`SQLExpection`。 此异常应以编程方式处理。 在关闭数据库或系统之前，我们还应该关闭所有现有资源。

在客户机/服务器模式下，Derby 服务器以`startNetworkServer`脚本启动，以`stopNetworkServer`脚本结束。 它们位于安装目录的`bin`子目录中。

## JAR 文件

在安装目录的`lib`子目录中，我们可以找到几个库。 每个 JAR 文件都具有特定功能。

```java
$ ls lib
derbyclient.jar        derbyLocale_it.jar     derbyLocale_zh_TW.jar
derby.jar              derbyLocale_ja_JP.jar  derbynet.jar
derbyLocale_cs.jar     derbyLocale_ko_KR.jar  derbyoptionaltools.jar
derbyLocale_de_DE.jar  derbyLocale_pl.jar     derbyrun.jar
derbyLocale_es.jar     derbyLocale_pt_BR.jar  derbytools.jar
derbyLocale_fr.jar     derbyLocale_ru.jar     derby.war
derbyLocale_hu.jar     derbyLocale_zh_CN.jar

```

`derby.jar`是用于嵌入式数据库的库。 我们需要在嵌入式应用的类路径中具有此 JAR 文件。 在客户端-服务器模式下，该库必须在服务器上。 `derbynet.jar`用于启动 Derby 网络服务器。 连接到 Derby Network Server 的客户端使用`derbyclient.jar`。 `derbytools.jar`与 Derby 工具一起使用。 `derbyrun.jar`文件是一个特殊的 jar 文件，可简化我们调用 Derby 工具和网络服务器的方式。 最后，还有一些语言环境库。 它们用于提供翻译后的消息。 例如，`derbyLocale_cs.jar`提供捷克信息。

## Derby 模式

在数据库理论中，模式是数据库的结构。 用正式语言（SQL）描述。 它是指数据的组织。 数据库模式的正式定义是一组公式，称为对数据库施加的完整性约束。

在 Derby 中，数据库模式的含义较窄。 它是用于对对象进行逻辑分组的容器。 它类似于 Java 包或 C++ 名称空间。 Derby 数据库可能具有多个架构。 我们可以创建两个具有相同名称的表，前提是它们被放置在两个不同的模式中。 Derby 的默认架构为 APP。 如果我们不提供任何模式，则会将数据库对象分配给该默认模式。

使用`CREATE SCHEMA`语句在 Derby 中创建模式。 如果我们连接到数据库，则在连接 URL 中提供的用户名将成为连接的当前模式。 所有数据库对象都将在此架构内创建。 可以使用`SET SCHEMA`语句更改当前模式。 还有一个称为 SYS 的内置模式，用于隔离系统表。

Derby 有一个名为`dblook`的工具，可以转储数据库及其架构。 该工具的输出是 DDL（数据定义语言）对数据库的形式化描述。

## 连接网址

加载驱动程序后，将创建与数据库的连接。 连接是与数据库的会话。 在工作结束时，与数据库的连接已关闭。 为了建立连接，我们调用`DriverManager`类的`getConnection()`方法。

连接 URL 指定连接的特征。

```java
jdbc:derby:[subsubprotocol:][databaseName][;attribute=value]*

```

上面是 Derby 数据库连接 URL 的语法。 默认子协议为`directory:`，通常会省略。 当指定`memory:`子协议时，我们只能在内存中使用数据库。 `databaseName`是我们要创建和/或连接到的数据库的名称。

我们可以在连接 URL 中使用几个属性。 我们可以使用属性来创建数据库，并使用用户名和密码连接到受保护的数据库。 此外，我们使用连接属性来关闭数据库或 Derby 系统，加密数据或从备份还原数据库。

```java
jdbc:derby:testdb
jdbc:derby://localhost:1527/testdb

```

我们使用不同的连接字符串来连接嵌入式系统和客户端-服务器 Derby 系统。 第一个连接字符串连接到嵌入式数据库，第二个连接字符串连接到客户服务器数据库。 Derby 的默认端口是 1527。

```java
jdbc:derby:testdb;create=true
jdbc:derby:testdb;shutdown=true
jdbc:derby:memory:testdb

```

我们还有另外三个连接字符串。 第一个连接字符串创建`testdb`数据库。 第二个关闭`testdb`数据库。 第三个连接到在内存中创建的`testdb`。

## SQL 文件

在以下两个 SQL 文件`cars.sql`和`authors_books.sql`中，我们创建了三个表，将在本教程中使用它们。

`cars.sql`

```java
-- 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);

```

`cars.sql`文件创建`CARS`表。

`authors_books.sql`

```java
-- SQL for AUTHORS and BOOKS tables

SET SCHEMA USER12;

CREATE TABLE AUTHORS(ID BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    (START WITH 1, INCREMENT BY 1), NAME VARCHAR(25));
CREATE TABLE BOOKS(ID BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    (START WITH 1, INCREMENT BY 1), AUTHOR_ID BIGINT, TITLE VARCHAR(150), 
    FOREIGN KEY(AUTHOR_ID) REFERENCES AUTHORS(ID));

INSERT INTO AUTHORS(NAME) VALUES('Jack London');
INSERT INTO AUTHORS(NAME) VALUES('Honore de Balzac');
INSERT INTO AUTHORS(NAME) VALUES('Lion Feuchtwanger');
INSERT INTO AUTHORS(NAME) VALUES('Emile Zola');
INSERT INTO AUTHORS(NAME) VALUES('Truman Capote');

INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(1, 'Call of the Wild');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(1, 'Martin Eden');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(2, 'Old Goriot');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(2, 'Cousin Bette');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(3, 'Jew Suess');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(4, 'Nana');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(4, 'The Belly of Paris');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(5, 'In Cold blood');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(5, 'Breakfast at Tiffany');

```

`authors_books.sql`文件创建两个表：`AUTHORS`和`BOOKS`。

## 数据来源

以下材料用于创建本教程：Derby 开发者指南，Derby 服务器和管理指南，Derby 入门，Derby 工具和工具指南以及 Derby 参考手册。

在本章中，我们介绍了 Derby 数据库的基本概念。