在本章中,我们介绍了 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
。
-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 系统。
DriverManager.getConnection("jdbc:derby:testdb;shutdown=true");
DriverManager.getConnection("jdbc:derby:;shutdown=true");
第一个 JDBC 调用将关闭testdb
数据库。 第二个调用结束整个 Derby 系统。 请注意,系统关闭时会弹出SQLExpection
。 此异常应以编程方式处理。 在关闭数据库或系统之前,我们还应该关闭所有现有资源。
在客户机/服务器模式下,Derby 服务器以startNetworkServer
脚本启动,以stopNetworkServer
脚本结束。 它们位于安装目录的bin
子目录中。
JAR 文件
在安装目录的lib
子目录中,我们可以找到几个库。 每个 JAR 文件都具有特定功能。
$ 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 指定连接的特征。
jdbc:derby:[subsubprotocol:][databaseName][;attribute=value]*
上面是 Derby 数据库连接 URL 的语法。 默认子协议为directory:
,通常会省略。 当指定memory:
子协议时,我们只能在内存中使用数据库。 databaseName
是我们要创建和/或连接到的数据库的名称。
我们可以在连接 URL 中使用几个属性。 我们可以使用属性来创建数据库,并使用用户名和密码连接到受保护的数据库。 此外,我们使用连接属性来关闭数据库或 Derby 系统,加密数据或从备份还原数据库。
jdbc:derby:testdb
jdbc:derby://localhost:1527/testdb
我们使用不同的连接字符串来连接嵌入式系统和客户端-服务器 Derby 系统。 第一个连接字符串连接到嵌入式数据库,第二个连接字符串连接到客户服务器数据库。 Derby 的默认端口是 1527。
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
-- 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
-- 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 数据库的基本概念。