// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= 使用 Java DB (Derby) 数据库
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: 使用 Java DB (Derby) 数据库 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, 使用 Java DB (Derby) 数据库

本文档说明了如何在 NetBeans IDE 中设置与 link:http://www.oracle.com/technetwork/java/javadb/overview/index.html[+Java DB+] 数据库的连接。在建立连接之后，即可开始在 IDE 中使用该数据库，您可以执行的操作包括创建表、用数据填充表、运行 SQL 语句和查询等。

Java DB 数据库是 Sun 支持的 link:http://db.apache.org/derby/[+Apache Derby+] 版本。Java DB 是完全事务型、安全且基于标准的数据库服务器，它全部采用 Java 编写，并且完全支持 SQL、JDBC API 和 Java EE 技术。Java DB 数据库与 link:http://glassfish.dev.java.net/[+GlassFish+] 应用服务器打包在一起，也包含在 link:http://download.oracle.com/javase/6/[+JDK 6+] 中。有关 Java DB 数据库的详细信息，请查阅link:http://www.oracle.com/technetwork/java/javadb/documentation/index.html[+正式文档+]。


image::images/netbeans-stamp-80-74-73.png[title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0"]


*要学习本教程，您需要具备以下软件和资源。*

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |7.2、7.3、7.4、8.0、Java EE 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java 开发工具包 (JDK)+] |版本 7 或 8 

|Java DB |版本 10.4.x、10.5.x 
|===

*注：*

* Java DB 是在安装 JDK 7 或 JDK 8 时安装的（在 Mac OS X 上除外）。如果使用的是 Mac OS X，则可以手动下载并安装 link:http://www.oracle.com/technetwork/java/javadb/downloads/index.html[+Java DB+]，也可以使用通过 Java EE 版的 NetBeans IDE 安装程序安装的 Java DB。


== 配置数据库

如果您在 NetBeans IDE 安装中注册了 GlassFish Server，则将自动注册 Java DB。因此，可以向下跳转至<<starting,启动服务器并创建数据库>>。

如果您单独下载了 GlassFish Server，并需要获取有关在 NetBeans IDE 中对其进行注册的帮助，请参见 IDE 的“帮助目录”（F1 键）中的*注册 GlassFish Server 实例*。

如果仅下载了 Java DB 本身，请执行以下步骤。

1. 运行自解压文件。将在与该文件相同的位置创建一个名为 "javadb" 的文件夹。如果仅下载了 Java DB，并且希望将该数据库服务器放在与其解压缩位置不同的位置中，现在应重新对其定位。
2. 在系统上，创建一个新目录，作为数据库服务器的各实例的主目录。例如，可以在 Java DB 根目录 (javadb) 或其他任意位置创建此文件夹。

在继续执行下一步操作之前，应了解 Java DB 根目录的各个组成部分，这一点很重要：

*  ``demo``  子目录包含演示程序。
*  ``bin``  子目录包含用于执行实用程序和设置环境的脚本。
*  ``javadoc``  子目录包含通过源代码注释生成的 API 文档。
*  ``docs``  子目录包含 Java DB 文档。
*  ``lib``  子目录包含 Java DB jar 文件。


== 在 NetBeans IDE 中注册数据库

配置了数据库之后，执行以下步骤在 IDE 中注册 Java DB。

1. 在 "Services"（服务）窗口中，右键单击 "Java DB Database"（Java DB 数据库）节点，然后选择 "Properties"（属性），以打开 "Java DB Settings"（Java DB 设置）对话框。
2. 在 "Java DB Installation"（Java DB 安装）文本字段中，输入在上一步中指定的 Java DB 根目录 (javadb) 的路径。
3. 对于 "Database Location"（数据库位置），请使用默认位置（如果已提供位置）。单击 "OK"（确定）。

例如，在 Windows 计算机上，默认位置可能类似于  ``C:\Documents and Settings\username\.netbeans-derby`` 。

image::images/javadb-props.png[title="Java DB 服务器和数据库的默认设置示例"]

*注：*如果 "Database Location"（数据库位置）字段为空，将需要设置数据库所在目录的路径。将需要为数据库创建目录（如果不存在）。


== 启动服务器并创建数据库

在 "Services"（服务）窗口中右键单击 "Java DB" 节点时，将显示 Java DB 数据库菜单选项。通过这些上下文菜单项，可以启动和停止数据库服务器、创建新的数据库实例，以及在 IDE 中注册数据库服务器（如以上步骤所示）。要启动数据库服务器，请执行以下操作：

1. 在 "Services"（服务）窗口中，右键单击 "Java DB" 节点，然后选择 "Start Server"（启动服务器）。请注意 "Output"（输出）窗口中的以下输出内容，该内容指示服务器已经启动：
image::images/output-start-db.png[]
2. 右键单击 "Java DB" 节点，然后选择 "Create Database"（创建数据库），以打开 "Create Java DB Database"（创建 Java DB 数据库）对话框。
3. 键入  ``contact``  作为数据库名称。
4. 键入  ``nbuser``  作为用户名和口令。单击 "OK"（确定）。
image::images/javadb-createdb.png[]

*注：*"Database Location"（数据库位置）是从 GlassFish 安装 Java DB 期间设置的默认位置。如果单独安装了 Java DB，则此位置可能会有所不同。

在创建数据库之后，如果在 "Services"（服务）窗口中展开 "Databases"（数据库）节点，您可以看到 IDE 已创建数据库连接，并且该数据库已添加到 "Java DB" 节点下的列表中。


== 连接到数据库

到目前为止，已在 IDE 中成功启动了数据库服务器并创建了一个名为  ``contact``  的数据库实例。在 IDE 的 "Services"（服务）窗口中，可以对数据库结构执行以下常见任务。

* 创建、删除和修改表
* 用数据填充表
* 查看表格数据
* 执行 SQL 语句和查询

要开始使用  ``contact``  数据库，需要创建到该数据库的连接。要连接至  ``contact``  数据库，请执行以下步骤。

1. 在 "Services"（服务）窗口中展开 "Databases"（数据库）节点，然后找到新数据库和数据库连接节点。

数据库连接节点 (image::images/connection-node-icon.png[]) 显示在 "Databases"（数据库）节点下。数据库名称显示在 "Java DB" 节点下。

image::images/services-window.png[]

*注：*您还将看到作为默认数据库方案的 `sample [app on APP]` 数据库连接。

[start=2]
. 右键单击 *contact* 数据库连接节点 ( ``jdbc:derby://localhost:1527/contact [nbuser on NBUSER]`` )，然后选择 "Connect"（连接）。

"connection node"（连接节点）图标将完全显示出来 (image::images/connection-node-icon.png[])，这表示连接成功。

[start=3]
. 为数据库创建适当的显示名称，方法是右键单击数据库连接节点 ( ``jdbc:derby://localhost:1527/contact [nbuser on NBUSER]`` )，然后选择 "Rename"（重命名）。在文本字段中键入  ``Contact DB`` ，然后单击 "OK"（确定）。


== 创建表

刚创建的  ``contact``  数据库当前为空。该数据库尚未包含任何表或数据。在 NetBeans IDE 中，可以通过下列任一方法添加数据库表：使用 "Create Table"（创建表）对话框，或输入 SQL 语句并从 SQL 编辑器中直接运行该语句。要了解这两种方法的具体操作步骤，请参见以下部分：

* <<createTable,使用 "Create Table"（创建表）对话框>>
* <<sqlEditor,使用 SQL 编辑器>>


=== 使用 "Create Table"（创建表）对话框

1. 展开  ``Contact DB``  连接节点，您会看到其中有若干方案子节点。app 方案是适用于本教程的唯一方案。右键单击 APP 节点，然后选择 "Set as Default Schema."（设置为默认方案）。

2. 展开 APP 节点，请注意，该节点下面有三个子文件夹："Tables"（表）、"Views"（视图）和 "Procedures"（过程）。右键单击 "Tables"（表）节点，然后选择 "Create Table"（创建表）以打开 "Create Table"（创建表）对话框。
3. 在 "Table Name"（表名称）文本字段中，键入  ``FRIENDS`` 。
4. 单击 "Add Column"（添加列）。随即出现 "Add Column"（添加列）对话框。
5. 在列的 "Name"（名称）中，输入  ``id`` 。对于数据 "Type"（类型），从下拉列表中选择  ``INTEGER`` 。
6. 在 "Constraints"（约束）下，选中 "Primary Key"（主键）复选框以将此列指定为表的主键。关系数据库中的所有表都必须包含主键。请注意，在选中 "Primary Key"（主键）复选框时，还将会自动选中 "Index"（索引）和 "Unique"（唯一）复选框，而 "Null"（空值）复选框则会取消选中。这是因为主键用于标识数据库中的唯一行，并且默认情况下用作表索引。由于必须标识所有行，因此主键不能包含 ``空`` 值。
image::images/add-column.png[]
7. 接下来，重复执行此过程，以便指定下表中所示的字段：

|===

|Key（键） |Index（索引） |Null（空值） |Unique（唯一） |Column Name（列名） |Data Type（数据类型） |Size（大小） 

|[选中] |[选中] |[选中] |id |INTEGER |0 

|[选中] |firstName |VARCHAR |20 

|[选中] |lastName |VARCHAR |20 

|[选中] |nickName |VARCHAR |30 

|[选中] |friendSince |DATE |0 

|[选中] |email |VARCHAR |60 
|===

您将创建一个名为  ``FRIENDS``  的表，其中为每条联系人记录包含以下数据：

* *名字*
* *姓氏*
* *昵称*
* *交友开始日期*
* *电子邮件地址*

image::images/create-table-friends.png[]

[start=9]
. 在确保 "Create Table"（创建表）对话框包含与上图所示相同的内容后，单击 "OK"（确定）。IDE 会在数据库中生成  ``FRIENDS``  表，并且您可以看到 "Tables"（表）节点下显示一个新的  ``FRIENDS``  表节点 (image::images/table-node.png[])。在表节点下将列出从主键 (image::images/primary-key-icon.png[]) 开始的各个列 (字段)。

image::images/friends-table.png[]


=== 使用 SQL 编辑器：

1. 在 "Service"（服务）窗口中，右键单击  ``Contact DB``  连接节点或该节点下的 "Tables"（表）节点，然后选择 "Execute Command"（执行命令）。会在 SQL 编辑器的主窗口中打开一个空画布。
2. 在 SQL 编辑器中输入以下查询。这是将要创建的 COLLEAGUES 表的表定义：

[source,sql]
----

CREATE TABLE "COLLEAGUES" (
    "ID" INTEGER not null primary key,
    "FIRSTNAME" VARCHAR(30),
    "LASTNAME" VARCHAR(30),
    "TITLE" VARCHAR(10),
    "DEPARTMENT" VARCHAR(20),
    "EMAIL" VARCHAR(60)
);
----

*请注：*SQL 编辑器中形成的语句和查询将以结构化查询语言进行解析。SQL 遵循严格的语法规则，在 IDE 的编辑器中工作时应先熟悉一下这些规则。根据不同的数据库管理系统，SQL 语法也会有所不同。有关详细的准则，请参见《link:http://www.oracle.com/technetwork/java/javadb/documentation/index.html[+JavaDB 参考手册+]》。

[start=3]
. 单击编辑器顶部任务栏中的 "Run SQL"（运行 SQL）(image::images/run-sql-button.png[]) 按钮（Ctrl-Shift-E 组合键）以执行查询。在 "Output"（输出）窗口（Ctrl-4 组合键）中，将显示一条消息，指示已成功执行该语句。

image::images/run-query.png[]

[start=4]
. 要验证更改，请在 "Services"（服务）窗口中右键单击  ``Contact DB``  连接节点，然后选择 "Refresh"（刷新）。此操作会将运行时 UI 组件更新为指定数据库的当前状态。当从 NetBeans IDE 中的 SQL 编辑器运行查询时，必须执行此步骤。您会看到，现在新的 COLLEAGUES 表节点 (image::images/table-node.png[]) 显示在 "Services"（服务）窗口中的 "Tables"（表）下。


== 添加表数据

现在，您已在  ``contact``  数据库中创建了一个或多个表，接下来可以开始用数据填充表。您可以使用多种方法向表中添加记录。

* 在 SQL 编辑器中<<sqlstatement,编写 SQL 句>>，为表方案中的每个字段提供值。
* <<usesqleditor,使用 SQL 编辑器>>将记录添加到表中。
* <<using,使用外部 SQL 脚本>>将记录导入到表中。

阅读下节，了解如何使用用数据填充  ``FRIENDS``  表的所有方法。


=== 运行 SQL 语句

1. 在 "Services"（服务）窗口中展开  ``Contact DB``  节点下的 "Tables"（表），右键单击  ``FRIENDS``  表，然后选择 "Execute Command"（执行命令）以打开 "SQL Editor"（SQL 编辑器）窗口。
2. 在 SQL 编辑器中，输入以下语句。

[source,sql]
----

INSERT INTO APP.FRIENDS VALUES (1,'Theodore','Bagwell','T-Bag','2004-12-25','tbag@foxriver.com')
----

键入时可以使用 SQL 编辑器代码完成。

[start=3]
. 在 SQL 编辑器中单击鼠标右键，然后选择 "Run Statement"（运行语句）。"Output"（输出）窗口将显示一条消息，指示已成功执行该语句。
. 要验证是否已将新记录添加到  ``FRIENDS``  表中，请在 "Services"（服务）窗口中右键单击  ``FRIENDS``  表节点，然后选择 "View Data"（查看数据）。

选择 "View Data"（查看数据）时，在 SQL 编辑器的上方窗格中自动生成一个查询，用于选择表中的所有数据。在 SQL 编辑器的下方窗格中显示该语句的结果。在这种情况下， ``FRIENDS``  表将显示在下方窗格中。请注意，已添加了一个新行，其中包含刚通过 SQL 语句提供的数据。

image::images/new-record.png[]


=== 使用 SQL 编辑器

1. 右键单击  ``FRIENDS``  表节点并选择 "View Data"（查看数据）（如果在上一部分的最后一步中没有执行此操作）。
2. 单击 "Insert Record"（插入记录）( ``Alt-I`` ) 按钮以添加一行。
即会显示 "Insert Record"（插入记录）对话框。

[start=3]
. 单击每个单元并输入记录。注意，对于“日期”数据类型的单元，可以从日历中选择一个日期。完成后单击 "OK"（确定）。

image::images/insert-records.png[]

在 SQL 编辑器中，可以通过单击行表头对结果进行排序、修改和删除现有记录，并查看编辑器中正在执行操作的 SQL 脚本（通过弹出式菜单显示 SQL 脚本命令）。


== 删除表

在下一步中，将使用外部 SQL 脚本创建一个新的  ``COLLEAGUES``  表。但是，在上文的<<sqlEditor,使用 SQL 编辑器>>部分中刚创建了一个  ``COLLEAGUES``  表。要确保 SQL 脚本确实创建一个新表，现在可以删除已创建的  ``COLLEAGUES``  表。要删除数据库表，请执行以下步骤。

1. 在“服务”窗口中展开数据库连接节点下的“表”节点。
2. 右键单击要删除的表，然后选择“删除”。


== 使用外部 SQL 脚本

从外部 SQL 脚本中发出命令是管理数据库的一种常用方式。您可能已在其他位置创建了 SQL 脚本，并希望将其导入到 NetBeans IDE 中，以对指定的数据库运行该脚本。

在本练习中，该脚本将创建一个名为  ``COLLEAGUES``  的新表，并使用数据填充它。执行以下步骤以在  ``contact``  数据库中运行该脚本。

1. 将 link:https://netbeans.org/project_downloads/usersguide/colleagues.sql[+colleagues.sql+] 下载到本地系统
2. 从 IDE 的主菜单中选择 "File"（文件）> "Open"（打开）。在文件浏览器中，导航至  ``colleagues.sql``  文件的保存位置，然后单击 "Open"（打开）。将自动在 SQL 编辑器中打开该脚本。

或者，也可以复制 link:https://netbeans.org/project_downloads/usersguide/colleagues.sql[+colleagues.sql+] 的内容，打开 SQL 编辑器，然后将该文件的内容粘贴到 SQL 编辑器。

[start=3]
. 确保从编辑器顶部工具栏的 "Connection"（连接）下拉框中选择了连接到  ``Contact DB`` 。

image::images/conn-drop-down.png[]

[start=4]
. 单击 "SQL Editor"（SQL 编辑器）任务栏中的 "Run SQL"（运行 SQL）(image::images/run-sql-button.png[]) 按钮。将对选定的数据库执行该脚本，并在 "Output"（输出）窗口中生成任何反馈。
. 要验证更改，请在 "Services"（服务）窗口中右键单击  ``Contact DB``  连接节点，然后选择 "Refresh"（刷新）。请注意，在 "Services"（服务）窗口中的  ``contact``  下面将显示通过 SQL 脚本创建的新  ``COLLEAGUES``  表的表节点。
. 要查看新表中包含的数据，请右键单击  ``COLLEAGUES``  表并选择 "View Data"（查看数据）。通过这种方法，还可以将表格数据与 SQL 脚本中包含的数据进行比较，以查看它们是否匹配。


== 重新创建来自其他数据库的表

如果您有一个来自其他数据库的表，并希望通过 NetBeans IDE 在所使用的数据库中重新创建该表，IDE 为此提供了非常方便的工具。首先，需要在 IDE 中注册第二个数据库，其过程与本教程开始部分描述的过程类似。就本教程而言，请使用与 Java DB 一起打包的  ``sample``  数据库。此过程实质上分两部分执行：首先“抓取”选定表的表定义，然后在选择的数据库中重新创建该表，具体操作如下所示：

1. 连接至  ``sample``  数据库，方法是：在 "Services"（服务）窗口中右键单击 "Databases"（数据库）节点下的连接节点，然后选择 "Connect"（连接）（用户名和口令分别为  ``app`` ）。
2. 
展开  ``sample``  数据库连接下的 "Tables"（表）节点，右键单击  ``CUSTOMER``  表节点，然后选择 "Grab Structure"（抓取结构）。

image::images/grab-structure.png[]

[start=3]
. 在打开的 "Grab Table"（抓取表）对话框中，指定计算机上的某一位置，以保存将要创建的抓取文件。单击 "Save"（保存）。

抓取文件记录选定表的定义。

[start=4]
. 展开  ``Contact DB``  数据库连接下的 "APP schema"（APP 方案）节点，右键单击 "Tables"（表）节点，然后选择 "Recreate Table"（重新创建表）以打开 "Recreate Table"（重新创建表）对话框。
. 在 "Recreate Table"（重新创建表）对话框中，导航到  ``CUSTOMER``  抓取文件的保存位置，然后单击 "Open"（打开）以便打开 "Name the Table"（命名表）对话框。

image::images/recreate-table.png[]

[start=6]
. 此时，可以更改表名称或编辑表定义。否则，请单击 "OK"（确定），以在  ``contact``  数据库中立即创建表。 ``Contact``  DB 连接节点下将显示新的  ``CUSTOMER``  表节点。

image::images/new-customer-node.png[]

如果查看新  ``CUSTOMER``  表中的数据，您将会发现数据库中没有任何记录，但该表的结构与抓取的表结构相同。

link:/about/contact_form.html?to=3&subject=Feedback:%20Working%20With%20Java%20DB[+请将您的反馈意见发送给我们+]

== 另请参见

以下内容是对“使用 Java DB (Derby) 数据库”教程的总结。本教程演示了如何在 NetBeans IDE 中设置 Java DB 数据库连接。接着，演示了如何在 IDE 的“服务”窗口中创建、查看、修改和删除表。此外，本教程还演示了如何使用 SQL 编辑器向表中添加数据，以及如何在 IDE 中使用来自其他数据库的定义重新创建表。

有关更多相关的高级教程，请参见以下资源：

* link:mysql.html[+连接 MySQL 数据库+]。演示了如何在 NetBeans IDE 中配置和连接 MySQL 数据库。
* link:../web/mysql-webapp.html[+使用 MySQL 数据库创建简单的 Web 应用程序+]。说明如何创建连接 MySQL 数据库服务器的简单 Web 应用程序。
* link:http://platform.netbeans.org/tutorials/nbm-crud.html[+NetBeans 平台 CRUD 应用程序教程。+]说明如何将 Java DB 数据库集成到 NetBeans 平台应用程序中。
