生成 Java 桌面数据库应用程序
本教程介绍如何创建可用于访问和更新数据库的桌面 Java 应用程序。本教程将利用 NetBeans IDE 中对以下技术的支持:
- Java 持久性 API (JPA) - 帮助使用 Java 代码与数据库进行交互。
- Bean 绑定 (JSR-295) - 为不同的 JavaBeans 组件提供一种彼此同步属性值的方法。例如,可以使用 Bean 绑定来使 JTable 可视组件中单元格的值与实体类中的字段值保持同步。(而实体类又表示数据库表。)
- Swing 应用程序框架 (JSR-296) - 为快速创建桌面应用程序提供了一些有用的模块。
我们将创建一个数据库 CRUD(创建、读取、更新、删除)应用程序,其中包含一个用于对数据进行可视化(汽车设计预览)的定制组件。
本教程大量采用基于早期内部开发版本的 IDE 的截屏视频。某些用户界面从演示制作完成后就发生了变化,因此您可能会注意到本教程与演示之间存在一些差异。可以立即查看演示(大约 9 分钟)或下载演示的 zip 文件。
预计时间:45 分钟
目录

要学完本教程,您需要具备下表所列的软件和资源。
开始在 IDE 中创建桌面 CRUD(创建、读取、更新、删除)应用程序之前,应已将 IDE 连接到应用程序要使用的数据库。提前设置此连接,您便可以利用 IDE 中的自动将数据库绑定到应用程序这一功能。
在本教程中,我们提供了使用 Java DB 数据库的说明,因为存在一个便于从 IDE 启动和停止 Java DB 数据库服务器的接口。但是,可以毫不费力地使用其他的数据库服务器。
首先,验证是否在 IDE 中注册了 Java DB。在很多情况下,Java DB 是自动在 IDE 中注册的(例如当您在 IDE 中注册 GlassFish 应用程序服务器时,或者在 JDK 6 中运行时)。如果 Java DB 未在 IDE 中注册,则手动将它注册。
要验证 Java DB 是否已在 IDE 中注册,请执行以下操作:
- 打开“服务”窗口。
- 右键单击“数据库”> "Java DB" 节点,然后选择“属性”。
如果 Java DB 已注册,则“Java 数据库安装”和“数据库位置”这两个字段均已填写。
如果 Java DB 未注册,则填写以下两个字段:
- Java 数据库安装。输入指向数据库服务器的路径。
- 数据库位置。输入希望存储数据库的文件夹。
- 单击“确定”。
在向 IDE 注册 Java DB 之后,可以轻松地启动和停止数据库服务器,以及创建新数据库。
要在 IDE 中启动数据库服务器,请执行以下操作:
服务器启动之后,“Java DB 数据库进程”标签会在“输出”窗口中打开,并显示类似于以下内容的消息:
Apache Derby Network Server - 10.2.2.0 - (485682) started and ready
to accept connections on port 1527 at 2007-09-05 10:26:25.424 GMT
创建数据库,请执行以下操作:
- 在“服务”窗口中,右键单击“数据库”> "Java DB",然后选择“创建数据库”。
- 对于“数据库名称”文本字段,键入 car_database。还要将“用户名”和“口令”设置为 nbuser。
- 单击“确定”。
到目前为止,我们已成功启动了数据库服务器,并创建了一个数据库。但是,我们还需要连接新数据库,然后才能开始在 IDE 中使用该数据库。要连接 car_database 数据库,请执行以下操作:
- 切换到“服务”窗口 (Ctrl+5),然后展开“数据库”节点查看新数据库。
- 右键单击“数据库连接”节点 (jdbc:derby://localhost:1527/car_database[NBUSER 上的 nbuser]),选择“连接”。
现在,连接节点图标应该完全显示 (
),这表示连接已成功。

- 展开连接节点,右键单击其“表”子节点,然后选择“执行命令”。
- 复制 car.sql 文件的内容,并将其粘贴到源代码编辑器的“SQL 命令 1”标签中。
这是 SQL 脚本,该脚本将使用关于汽车的数据填充数据库。
- 在源代码编辑器工具栏中,单击“运行 SQL”按钮(
)以运行该脚本。
- 选择“文件”>“新建项目”。
- 在向导的第一个面板中,展开 "Java" 类别,并选择“Java 桌面应用程序”模板。单击“下一步”。
“Java 桌面应用程序”模板提供了可视应用程序的许多基本项,包括基本菜单项和命令。
- 在向导的“名称和位置”页中,执行以下操作:
- 在“项目名称”字段中,键入 CarsApp。此字段的值会为“项目”窗口中的项目设置显示名称。
- 选中“设置为主项目”复选框。
- (可选)编辑“项目位置”字段来更改项目 meta 数据的位置。
- (可选)选中“使用专用文件夹存储库”复选框,并指定库文件夹的位置。有关此选项的详细信息,请参见共享项目库。
- 在“选择应用程序 Shell”字段中,选择“数据库应用程序”。
- 单击“下一步”。
- 在向导的“主表”页中,选择 CAR 数据库的数据库连接。数据库的列表应该类似于以下内容:jdbc:derby://localhost:1527/car_database[NBUSER 上的 nbuser]
- 填写数据库的口令 (nbuser),并选中“在此会话期间记住口令”复选框。
在建立与数据库的连接后,“数据库表”字段应该显示 CAR,“要包含的列”列表应该包含 CAR 数据库的 10 个列的名称。目前,我们将在应用程序中只使用其中的 5 个列名称。
- 选择后五个列名称(以 SUN_ROOF 开头,以 MODERNNESS 结尾),然后单击 < 按钮将它们移到左列中。单击“下一步”。
- 在“详细信息选项”面板中,单击“完成”。
然后,向导将生成一个带有表和数据库连接的基本用户界面。IDE 生成项目和代码可能需要几秒钟的时间。
此时,已有了一个正在运行的基本应用程序,其中包含的图形用户界面 (GUI) 具有以下功能:
- 查看和修改 CAR 数据库中五个列值的功能。
- 基本菜单项。
- 会话间窗口状态的持久性。在关闭应用程序时,系统将记住窗口的位置和大小。这样在重新打开应用程序时,窗口会在关闭它时所在的同一个位置打开。
- “关于”对话框,可以轻松地对它进行定制。
- .properties 文件,其中包含用户界面中的标签。使用 .properties 文件是使代码逻辑与出现在应用程序用户界面中的文本分离的好方法。此外,这样的分离有利于简化程序的本地化。
要查看已内置到应用程序中的一些功能,请执行以下操作:
- 右键单击项目节点,然后选择“运行”。
几秒钟后,应用程序将启动并显示一个名为 "Database Application Example" 的窗口。此窗口包含一张表和若干可用于编辑 CAR 数据库的控件。
- 选择表中的第一条记录(关于 Acura)。
- 选择 "Price" 文本字段,并将现有值替换为 46999。然后按 Enter 键。
此时表中应显示更新后的值。(但是,在单击 "Save" 前,该值不会反映到数据库中。)
同样地,可以更新表中的其他任何值。
- 单击 "New" 创建一条新记录。然后填写每个字段 (Make, Model, Price, Body Style, Color) 的值。例如,可以填写 Trabant、Classic、1000、wagon 和 blue。单击 "Save" 将该条目保存到数据库中。
- 单击 "Database Application Example" 标题栏,并将应用程序拖到屏幕上的其他位置。
- 单击 "Database Application Example" 窗口的左边框并将其向左拖动以增大窗口。
- 在 "Database Application Example" 菜单栏中,选择 "File" > "Exit"。
- 在 IDE 中,右键单击项目节点,然后选择“运行”项目。
此时,"Database Application Example" 窗口将打开,其大小和所在位置与关闭应用程序时相同。
主表(JTable 组件)与数据库之间的连接是结合以下机制(所有这些机制都是由 IDE 生成的)进行处理的:
- Car.java 实体类 - 用于在 CAR 数据库表中进行读写数据的操作。实体类是一种特殊的类,使用它可以通过 Java 代码与数据库交互。实体类使用 Java 标注将类字段映射到数据库列。
- META-INF/persistence.xml 文件 - 定义数据库与实体类之间的连接。此文件也称为持久性单元。
- 使用 Bean 绑定连接实体类的属性与 JTable 组件的属性。Bean 绑定是一项基于 JSR 295 的新技术,该技术可能会包含在将来的 Java SE 发行版中。
- entityManager、query 和 list 对象 - 它们在 CarsView 类中定义,并且在“检查器”窗口中列出。
- entityManager(实体管理器)对象用于在已定义的持久性单元作用域内检索和提交数据。
- query(查询)对象定义如何从实体管理器检索数据收集。可以通过在“检查器”窗口中选择查询对象并更改属性表单中的 query 属性来更改查询对象的工作方式。query 属性使用 JPA 查询语言。
- list(列表)对象是保存查询到的数据的可观察集合。可观察的集合是一种特殊的集合,可以在其中放置侦听程序以查明对集合做出更改的时间。
使用“检查器”窗口和属性表单,可以执行以下步骤以了解如何将 JTable 绑定到数据:
- 在“检查器”窗口中,选择 "mainPanel[JPanel]" > "masterScrollPane [ScrollPane]" > "masterTable [JTable]" 节点。然后在“属性”窗口中单击“绑定”标签。
- 查看 "elements" 属性,确认其与列表已绑定。
- 单击省略号 [...] 按钮打开“绑定 masterTable.elements”定制器,可以在其中进一步定制表与数据库之间的绑定。例如,可以查看定制器可用来指定要绑定哪些表列。
除了属性表单中的“绑定”类别外,还可以使用上下文菜单中的“绑定”菜单。
添加其他控件
现在,我们要将最初排除的某些属性的控件添加到窗体中。除了使用表外,我们将添加 JSlider 组件(对于 tire size 和 modernness 属性)和 JCheckbox 组件(对于 sun roof 和 spoiler)。
执行以下步骤来添加其他组件:
- 添加第一个滑块,方法是单击“组件面板”窗口中的“滑块”按钮,然后单击 "New" 按钮正上方的窗体。在单击该窗体以插入滑块之前,请确保未显示水平槽式基准线。这些基准线指示滑块将插入字段或按钮所在的同一行。请参见下图以了解应将滑块拖到窗体中的哪个位置。

注意:如果将组件放到了非预期的位置,并因而导致不需要的布局更改,可以使用“撤消”命令来撤消更改。选择“编辑”>“撤消”,或按 Ctrl-Z 组合键。
- 如有必要,向左拉伸滑块以将它与文本字段组件的左边对齐。
- 向右拉伸滑块使其宽度相当于整个窗体的宽度。
- 在滑块的左边添加一个标签,并将其文本设置为 Tire Size。(单击标签使其可编辑。)
- 在第一个滑块下方添加另一个滑块,并根据需要调整其宽度和位置。
- 在 "Tire Size" 标签下方添加另一个标签,并将其文本设置为 Modernness。
- 在这两个滑块下添加两个复选框。将其文本分别设置为 Spoiler 和 Sun Roof。(确保显示文本可编辑,方法是单击复选框一次,暂停,然后再次单击该复选框。还可以右键单击复选框,并选择“编辑文本”。)
窗体应该类似于如下所示的屏幕快照。

现在,我们将使用 Bean 绑定功能将表单元格中显示的值绑定到已添加的控件状态。这将使您能够通过使用滑块和复选框来更改表中单元格的值。
要将滑块与其对应的表元素绑定,请执行以下操作:
- 在窗体中,右键单击 "Tire Size" 滑块,然后选择“绑定”> "value"。
- 在“绑定”对话框的“绑定源”下拉列表中,选择 "masterTable"。
- 在“绑定表达式”下拉列表中,选择 "selectedElement" > "tiresize" 节点。

- 在窗体中,右键单击 "Modernness" 滑块,然后选择“绑定”> "value"。
- 在“绑定”对话框的“绑定源”下拉列表中,选择 "masterTable"。
- 在“绑定表达式”下拉列表中,选择 "selectedElement" > "modernness"。
要将复选框与其对应的表元素绑定,请执行以下操作:
- 在窗体中,右键单击 "Spoiler" 复选框,然后选择“绑定”> "selected"。
- 在“绑定”对话框的“绑定源”下拉列表中,选择 "masterTable"。
- 在“绑定表达式”下拉列表中,选择 "selectedElement" > "spoiler"。
- 单击“确定”退出“绑定”对话框。
- 在窗体中,右键单击 "Sun Roof" 复选框,然后选择“绑定”> "selected"。
- 在“绑定”对话框的“绑定源”下拉列表中,选择 "masterTable"。
- 在“绑定表达式”下拉列表中,选择 "selectedRow" > "sunRoof"。
- 单击“确定”。
现在,应该能够使用滑块和复选框来更改数据库条目。
要验证滑块和复选框是否有效,请执行以下操作:
- 打开“服务”窗口。
- 确保 IDE 已连接到数据库,方法是右键单击“数据库”> "jdbc:derby;//localhost:1527/car_database",并选择“连接”。
- 右键单击“数据库”> "jdbc:derby;//localhost:1527/car_database" >“表”> "CAR" 节点,并选择“查看数据”。
- 查看第一条记录的 SUN_ROOF、SPOILER、TIRE_SIZE 和 MODERNNESS 值。
- 选择“运行”>“运行主项目”来执行应用程序。
正在运行的应用程序应该类似于如下所示的屏幕快照。

- 在正运行的应用程序中,选择第一条记录。
- 移动滑块并更改复选框选择。
- 单击“保存”将更改保存到数据库中。
- 在“服务”窗口中,再次使用“查看数据”命令。
数据库中的值应反映所做的更改。
为了运用更加图形化的方法来演示 Bean 绑定,让我们来添加将绘制所选汽车预览的定制组件。我们会将此组件的属性绑定到相应的表元素。然后,如果再次运行应用程序,则在更改选定的行并更改各种字段的值时,汽车预览也会被修改。
要使 CarPreview 组件适用 CarsApp 项目,请执行以下操作:
- 如果尚未生成 CarPreview 组件,则下载 CarPreview.zip 文件。
- 使用标准 zip 工具,提取 zip 文件的归档文件。
- 选择“文件”>“打开项目”,并导航至 zip 文件的提取内容,然后选择 CarPreview 项目。
- 单击“打开项目”。
此时该项目会在 IDE 中打开。
- 右键单击 "CarPreview" 节点,然后选择“清理并生成”。
该操作将编译该项目中的文件,以使您能够将 CarPreview 类用作可直接拖放到窗体中的 Bean。
此组件是作为 JavaBeans 组件编写的,因此可以将其添加到组件面板中,这样便于将该组件添加到多个应用程序中。但是现在我们会直接将此组件从“项目”窗口拖动到应用程序中。
要将 CarPreview 组件添加到应用程序中,请执行以下操作:
- 在“项目”窗口中,展开 "CarPreview" >“源包”> "carpreview" 节点。
- 将 CarPreview.java 类拖动到窗体中。要将该类插入菜单的正下方,请将其置于表的上方,与其他控件左对齐,并且折到菜单栏的底部,如下图所示。

- 在整个窗体上水平调整预览组件大小。
- 使用与将滑块和复选框绑定到 masterTable 组件中的元素相同的方法,将 CarPreview 组件的所有绑定属性绑定到 masterTable 的对应 selectedElement 属性。使用属性表单中的“绑定”弹出菜单或“绑定”标签。
- 再次运行 CarApp 应用程序。
在正运行的应用程序中,会在选择表中不同的行、更改表中的值、移动滑块以及选中和取消选中复选框时看到 CarPreview 组件的变化。
下图显示了正在运行的最终应用程序。

如果您对应用程序正常工作的现状感到满意,可以准备在 IDE 外部署应用程序。在此部分中,将生成应用程序的可发布输出,并从 IDE 之外运行应用程序。
生成应用程序
IDE 中的主生成命令是“清理并生成”命令。“清理并生成”命令可以删除以前编译的类和其他生成工件,然后从头开始重新生成整个项目。
注意:还有一个“生成”命令,该命令不会删除旧的生成工件,但此命令缺省情况下处于禁用状态。有关详细信息,请参见创建、导入和配置 Java 项目指南的“在保存时编译”部分。
生成应用程序:
- 选择“运行”>“清理并生成主项目”(Shift-F11)。
此时 Ant 生成脚本中的输出会显示在“输出”窗口中。如果未显示“输出”窗口,则可以通过选择“窗口”>“输出”>“输出”手动打开该窗口。
清理并生成项目时,会出现以下情况:
- 删除(“清理”)由以前的生成操作所生成的输出文件夹。(大多数情况下,这些文件夹为
build 和 dist 文件夹。)
- 将
build 和 dist 文件夹添加到项目文件夹(以下称为 PROJECT_HOME 文件夹)中。
- 将所有源都编译成
.class 文件,并将这些文件放置在 PROJECT_HOME/build 文件夹中。
- 在
PROJECT_HOME/dist 文件夹中创建包含项目的 JAR 文件。
- 如果您已为该项目指定了任何库(除了 JDK 之外),则在
dist 文件夹中将创建一个 lib 文件夹。这些库将被复制到 dist/lib 中。
- JAR 中的清单文件更新后将包括用于指定主类的条目以及项目的类路径中的所有库。
在 IDE 外部运行应用程序
在 IDE 外部运行应用程序:
- 从 IDE 外部启动 Java DB。请访问 http://db.apache.org/derby/docs/dev/getstart/
注意:还可以从 IDE 内部启动 Java DB,但在退出 IDE 时,服务器将停止。
- 使用系统的文件资源管理器或文件管理器导航至
CarsApp/dist 目录。
- 双击
CarsApp.jar 文件。
几秒钟后,将会启动应用程序。
注意:如果在双击 JAR 文件时没有启动应用程序,请参见本文以了解在操作系统中设置 JAR 文件关联的相关信息。
也可以通过命令行启动应用程序。
通过命令行启动应用程序:
- 从 IDE 外部启动 Java DB。
- 在您的系统上,打开命令提示符或终端窗口。
- 在命令提示符中,转至
CarsApp/dist 目录。
- 在命令行中,键入以下语句:
java -jar CarsApp.jar
将应用程序分发给其他用户
现在您已验证了应用程序能够在 IDE 外部运行,接下来便可以分发该应用程序。
分发应用程序:
- 在系统中,创建一个 zip 文件,其中包含应用程序的 JAR 文件 (
CarsApp.jar) 和附带的 lib(它包含应用程序需要的其他 JAR 文件)。
- 将该文件发送给要使用该应用程序的人员。指导他们解压缩 zip 文件,同时确保
CarsApp.jar 文件和 lib 文件夹放置在同一个文件夹中。
- 指示用户按照上面的在 IDE 外部运行应用程序部分中的步骤进行操作。
后续步骤
本教程介绍了 IDE 中对 Swing 应用程序框架和 Bean 绑定的支持。
有关创建包含一对多和多对一关系的应用程序以及单独数据条目对话框的信息,请参见
创建定制桌面数据库应用程序。
有关将 Hibernate 用于 Swing 应用程序的持久性层的信息,请参见在 Java Swing 应用程序中使用 Hibernate。
有关设计 GUI 应用程序的详细信息,请参见设计 Swing GUI。
有关在 IDE 中使用 Bean 绑定的详细信息,请参见在桌面应用程序中绑定 Bean 和数据。
另请参见