🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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 数据库的基本概念。