在 Java Swing 应用程序中使用 Hibernate
在本教程中,使用 NetBeans IDE 来创建和部署显示数据库中数据的 Java Swing 应用程序。该应用程序使用 Hibernate 框架作为持久层来检索关系数据库中的 POJO (plain old Java object) 对象。
Hibernate 是一个为对象关系映像 (ORM) 提供工具的框架。本教程将演示 IDE 提供的 Hibernate 框架支持,以及如何使用向导创建必要的 Hibernate 文件。创建 Java 对象并配置应用程序使用 Hibernate 之后,您将创建一个 GUI 界面来用于搜索和显示数据。
您在本教程中构建的应用程序是针对 DVD Store Web 应用程序 的 companion 管理应用程序。本教程创建的应用程序允许您根据使用者的姓名来查询他们的配置文件。如果愿意,您可以扩展应用程序,添加查询影片详细信息和添加/更新/删除项目的功能。本教程使用 MySQL 和 Sakila 数据库,但是您可以使用任何支持 Hibernate 应用程序的数据库服务器。Sakila 数据库是一个样例数据库,您可以从 MySQL 站点下载它。以下部分提供了用于建立 Sakila DB 的信息。
在开始本教程之前,您可以先阅读下面这些文档。
目录

要学习本教程,您需要具备以下软件和资源。
创建数据库
本教程使用名为 sakila 的 MySQL 数据库。当您安装 IDE 时,样例数据库并未包括在内,因此您需要先创建数据库才能完成本教程。
Sakila 数据库中免费的样例 MySQL 数据库,可以从 MySQL 站点获得。 要创建 sakila 数据库,您可以使用插件管理器下载并安装 Sakila 样例数据库插件。 安装好插件之后,您可以在“服务”窗口中创建 sakila 数据库。sakila 数据库已添加到“创建 MySQL 数据库”对话框的数据库列表中。
有关配置 IDE 使用 MySQL 的详细信息,请参见连接到 MySQL 数据库教程。
- 打开插件管理器,安装 Sakila 样例数据库插件。
- 安装插件之后,启动 MySQL 数据库,方法是在“服务”窗口中展开“数据库”节点,右键单击“MySQL 服务”节点并选择“启动”。
- 右键单击“MySQL 服务器”节点并选择“创建数据库”。
- 在“创建 MySQL 数据库”对话框中,从“新数据库名称”下拉列表中选择“Sakila 数据库”。单击“确定”。
单击“确定”后,“MySQL 服务器”节点下面将出现一个“Sakila”节点。
- 右键单击“Sakila”节点并选择“连接”。
单击“连接”后,“数据库”节点下面将出现一个 Sakila 数据库连接节点(jdbc:mysql://localhost:3306/sakila [username on Default])。 打开连接之后,您可以通过展开连接节点来查看数据库中的数据。
创建 Java Swing 应用程序项目
在本练习中,您将创建一个简单的 Java Swing 应用程序项目,名称为 DVDStoreAdmin。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。从“Java”类别中选择“Java 应用程序”并单击“下一步”。
- 键入 DVDStoreAdmin 作为项目名称并设置项目位置。
- 取消选中“使用专用文件夹存储库”选项(如果该选项处于选中状态)。
(对于本教程,没有理由将项目库复制到指定文件夹,因为您将需要与其他用户共享库)。
- 取消选中“创建主类”。单击“完成”。
单击“完成”后,IDE 将创建 Java 应用程序项目。项目没有设置主类。您将创建一个窗体,然后将该窗体设置为主类。
在项目中添加 Hibernate 支持
要在 J2SE 项目中添加 Hibernate 支持,您需要将 Hibernate 库添加到项目中。Hibernate 库包含在 IDE 中,并且可以将它添加到任何项目中,方法是在“项目”窗口中右键单击“库”节点,选择“添加库”,然后在“添加库”对话框中选择 Hibernate 库。
IDE 提供的向导可以帮助您创建在项目中需要的 Hibernate 文件。您可以使用 IDE 中的向导来创建 Hibernate 配置文件和实用帮助类。如果您使用向导创建了 Hibernate 配置文件,则 IDE 会自动将 Hibernate 库添加到项目中。
创建 Hibernate 配置文件
Hibernate 配置文件(hibernate.cfg.xml)包含关数据库连接、资源映像和其他连接属性的信息。在使用向导创建 Hibernate 配置文件时,您可以从 IDE 的注册数据库连接列表中选择数据库连接。生成配置文件时,IDE 会根据所选的数据库连接自动添加连接详细信息和方言信息。该向导还会自动将 Hibernate 库添加到项目类路径中。创建配置文件之后,您可以使用多视图编辑器来编辑文件,也可以直接在 XML 编辑器中编辑 XML 文件。
- 在“项目”窗口中右键单击项目节点,然后选择“新建”>“其他”以打开“新建文件”向导。
- 从“Hibernate”类别中选择“Hibernate 配置文件”。单击“下一步”。
- 保留“名称”和“位置”窗格中的缺省设置。单击“下一步”。
- 在“数据库连接”下拉列表中,选择 sakila 连接。单击“完成”。
单击“完成”,IDE 将在源编辑器中打开 hibernate.cfg.xml。IDE 将在应用程序的上下文类路径的根目录下创建配置文件(“文件”窗口中的 WEB-INF/classes)。 在“项目”窗口中,该文件位于 <default package> 源包中。配置文件包含关于单一数据库的信息。如果您计划连接到多个数据库,您可以在项目中创建多个配置文件,每个文件用于各自的数据库服务器,但在缺省情况下,帮助实用类将使用根目录中的 hibernate.cfg.xml 文件。
如果您在“项目”窗口中展开“库”节点,您可以看到 IDE 已经添加了必需的 Hibernate JAR 文件和 MySQL 连接器 JAR。
修改 Hibernate 配置文件
在本练习中,您将编辑 hibernate.cfg.xml 中指定的缺省属性来启用 SQL 语句的调试日志记录。本练习为可选。
- 在“设计”标签中打开 hibernate.cfg.xml。 可以通过展开“项目”窗口中的“配置文件”节点并双击 hibernate.cfg.xml 来打开该文件。
- 在“可选属性”下,展开“配置属性”节点。
- 单击“添加”以打开“添加 Hibernate 属性”对话框。
- 在此对话框中,选择 hibernate.show_sql 属性并将值设置为 true。单击“确定”。这将启用 SQL 语句的调试日志记录。
如果单击编辑器中的 XML 标签,则可以在 XML 视图中看到此文件。该文件应该如下所示:
<hibernate-configuration>
<session-factory name="session1">
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">######</property>
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
- 保存对该文件所做的更改。
运行项目时,您将能够在 IDE 的“输出”窗口中看到输出的 SQL 查询。
创建 HibernateUtil.java 帮助文件
要使用 Hibernate,您需要创建一个帮助类来处理服务器启动,它将访问 Hibernate 的 SessionFactory 来获取会话对象。 该类将调用 Hibernate 的 configure() 方法,装入 hibernate.cfg.xml 配置文件,然后构建 SessionFactory 来获取会话对象。
在本节中,使用“新建文件”向导创建帮助类 HibernateUtil.java。
- 右键单击“源包”节点并选择“新建”>“其他”以打开“新建文件”向导。
- 从“类别”列表中选择 Hibernate,从“文件类型”列表中选择 HibernateUtil.java。单击“下一步”。
- 键入 HibernateUtil 作为类名,并键入 sakila.util 作为包名。单击“完成”。
单击“完成”后,HibernateUtil.java 将在编辑器中打开。由于不需要编辑该文件,因此可以关闭该文件。
生成 Hibernate 映像文件和 Java 类
在本教程中,您将使用 POJO Actor.java 表示数据库中的 ACTOR 表的数据。该类为表中的列指定字段并使用简单的 setter 和 getter 检索和编写数据。要将 Actor.java 映像到 ACTOR 表,您可以使用 Hibernate 映像文件或使用类中的注释。
您可以使用“通过数据库生成 Hibeernate 映像文件和 POJO”向导根据您选择的数据库表创建多个 POJO 和映像文件。或者,您可以借助 IDE 中的向导来从头创建各 POJO 和映像文件。
如果您希望为多个表创建文件,则最有可能使用“通过数据库生成 Hibeernate 映像文件和 POJO”向导。但是,在本教程中,您只需要创建一个 POJO 和一个映像文件,因此单独创建各文件相当简单。您可以在本教程的结束部分看到 单独创建 POJO 和映像文件 的步骤。
通过数据库生成 Hibernate 映像文件和 POJO
“通过数据库生成 Hibernate 映像文件和 POJO”向导根据数据库中的表生成文件。使用该向导时,选择 POJO 和映像文件的所有表。然后,IDE 将根据数据库表生成文件并将映像条目添加到 hibernate.cfg.xml 中。在使用向导时,您可以选择希望 IDE 生成的文件(比如说,仅生成 POJO),并选择代码生成选项(比如说,生成使用 EJB 3 注释的代码)。
- 在“项目”窗口中右键单击“源包”节点,然后选择“新建”>“其他”以打开“新建文件”向导。
- 在“Hibernate”类别中选择“通过数据库生成 Hibernate 映像文件和 POJO”。单击“下一步”。
- 保留“名称”和“位置”窗格中的缺省值。单击“下一步”。
- 从“配置文件”下拉列表中选择 hibernate.cfg.xml(如果为未选中状态)。
- 从“可用表”中选择 actor,然后单击“添加”将该表添加到“选定表”中。单击“下一步”。
- 确保选中了 域代码 和 Hibernate XML 映像 选项。
- 键入 sakila.entity 作为包名。单击“完成”。
单击“完成”后,IDE 将生成具备所有必要字段的 POJO Actor.java,并生成一个 Hibernate 映像文件,然后将映像条目添加到 hibernate.cfg.xml 中。向导还将生成一个 hibernate.reveng.xml 反向工程文件。由于不需要编辑该文件,因此可以关闭反向工程文件。
您已经创建了 POJO 和所需的 Hibernate 相关文件,现在,您可以为应用程序创建一个简单的 Java GUI 前端。您还将创建并添加一个 HQL 查询,用于查询数据库以检索数据。在此过程中,我们还将使用 HQL 编辑器来构建和测试查询。
创建应用程序 GUI
在本练习中,您将创建一个简单的 JFrame 窗体,并添加一些字段用于输入和显示数据。您还将添加一个按钮,用于触发检索数据的数据库查询。
如果您不知道如何使用 GUI 生成器创建窗体,可以阅读 GUI 生成简介 教程。
创建 JFrame 窗体
- 在“项目”窗口中右键单击项目节点,然后选择“新建”>“其他”以打开“新建文件”向导。
- 从“Swing GUI 窗体”类别中选择“JFrame 窗体”。单击“下一步”。
- 键入 DVDStoreAdmin 作为类名,并键入 sakila.ui 作为包名。单击“完成”。
单击“完成”后,IDE 将创建类并在编辑器的“设计”视图中打开 JFrame 窗体。
在窗体中添加元素
现在,您需要在窗体中添加 UI 元素。在编辑器的“设计”视图中打开窗体后,“组件面板”将出现在 IDE 的左侧。在窗体中添加元素的方法是将“组件面板”中的元素拖动到窗体区域。将元素添加到窗体之后,您需要修改元素“变量名称”属性的缺省值。
- 从“组件面板”中拖出一个“标签”元素,并将文本更改为 名字。
- 拖放一个“文本字段”元素到 First Name 标签旁边,并删除缺省文本。
- 从“组件面板”中拖出一个“标签”元素,并将文本更改为 姓氏。
- 拖放一个“文本字段”元素到“姓氏”标签旁边,并删除缺省文本。
- 从“组件面板”中拖出一个“按钮”元素,并将文本更改为 查询。
- 从“组件面板”中拖放一个“表”元素到窗体中。
- 根据下表中的值更改以下 UI 元素的“变量名称”值。
您可以更改元素的“变量名称”值,方法是右键单击“设计视图”中的元素并选择“更改变量名称”或者,您可以直接在“检查器”窗口中更改变量名称。
您不需要为“标签”元素指定变量名称。
| “名字”文本字段 |
firstNameTextField |
| “姓氏”文本字段 |
lastNameTextField |
| “查询”按钮 |
queryButton |
| 表 |
|
- 保存所做的更改。
在“设计”视图中,您的窗体应与下图类似。
现在,您已经创建了窗体。接下来,您需要创建为窗体元素指定活动的代码。在下一练习中,您将根据 Hibernate 查询语言构建查询来检索数据。 构建查询之后,您将在窗体中添加一些方法,用于在单击“查询”按钮时调用适当的查询。
在 HQL 查询编辑器中创建查询
在 IDE 中,您可以使用 HQL 查询编辑器根据 Hibernate 查询语言来构建和测试查询。键入查询时,编辑器将显示等价的(经过转换的)SQL 查询。单击工具栏中的“运行 HQL 查询”按钮后,IDE 将执行查询并在编辑器底部显示结果。
在本练习中,您将使用 HQL 编辑器构建简单的 HQL 查询,用于根据姓氏和名字查询使用者的详细信息。将查询添加到类中之前,您需要使用 HQL 查询编辑器测试连接运行正常,且查询生成了预期的结果。
- 展开“项目”窗口中的 <default package> 源包节点。
- 右键单击 hibernate.cfg.xml 配置文件,然后选择“运行 HQL 查询”以打开 HQL 编辑器。
- 通过在 HQL 查询编辑器中键入 from Actor 来测试连接。 单击工具栏中的“运行 HQL 查询”按钮(
)。
单击“运行 HQL 查询”按钮之后,您应该能在 HQL 查询编辑器的底部窗格中看到查询结果。
如果您单击结果上方的 SQL 按钮,您应该能看到与以下等价的 SQL 查询。
select actor0_.actor_id as col_0_0_ from sakila.actor actor0_

- 在 HQL 查询编辑器中键入以下查询,然后单击“运行 HQL 查询”查询搜索字符串为 'PE' 时的查询结果。
from Actor a where a.firstName like 'PE%'
该查询返回姓氏以 'PE' 开头的使用者详细信息列表。
- 打开一个新的 HQL 查询编辑器标签,在编辑器窗格中键入以下查询。单击“运行 HQL 查询”。
from Actor a where a.lastName like 'MO%'
该查询返回名字以 'PE' 开头的使用者详细信息列表。
测试表明,查询返回了预期结果。下一步需要在应用程序中实现查询,以便单击窗体中的“查询”按钮能调用正确的查询。
在窗体中添加查询
现在,您需要修改 DVDStoreAdmin.java,添加一些查询字符串并创建一些方法,用于构建和调用合并输入变量的查询。您还需要修改按钮事件处理程序,以调用正确的查询,并添加一个用于在表中显示查询结果的方法。
- 打开 DVDStoreAdmin.java 并单击“源”标签。
- 将以下查询字符串(粗体)添加到类中:
public DVDStoreAdmin() {
initComponents();
}
private static String QUERY_BASED_ON_FIRST_NAME="from Actor a where a.firstName like '";
private static String QUERY_BASED_ON_LAST_NAME="from Actor a where a.lastName like '";
可以将 HQL 查询编辑器标签中的查询复制到文件中,然后再修改代码。
- 添加以下方法,以根据用户输入字符串创建查询。
private void runQueryBasedOnFirstName() {
executeHQLQuery(QUERY_BASED_ON_FIRST_NAME + firstNameTextField.getText() + "%'");
}
private void runQueryBasedOnLastName() {
executeHQLQuery(QUERY_BASED_ON_LAST_NAME + lastNameTextField.getText() + "%'");
}
这些方法调用一个名称为 executeHQLQuery() 的方法,并通过结合查询字符串与用户输入的搜索字符串来创建查询。
- 添加 executeHQLQuery() 方法。
private void executeHQLQuery(String hql) {
try {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Query q = session.createQuery(hql);
List resultList = q.list();
displayResult(resultList);
session.getTransaction().commit();
} catch (HibernateException he) {
he.printStackTrace();
}
}
executeHQLQuery() 方法调用 Hibernate 来执行选定的查询。该方法利用 HibernateUtil.java 实用类来获取 Hibernate 会话。
- 修复您的导入,为 Hibernate 库(org.hibernate.Query, org.hibernate.Session)和 java.util.List 添加导入语句。
- 切换到“设计”视图并双击“查询”按钮,创建一个“查询”按钮事件处理程序。
IDE 将创建 queryButtonActionPerformed 方法并在“源”视图中显示该方法。
- 在“源”视图中修改 queryButtonActionPerformed 方法,添加以下代码,以便查询能在用户单击按钮时正确运行。
private void queryButtonActionPerformed(java.awt.event.ActionEvent evt) {
if(!firstNameTextField.getText().trim().equals("")) {
runQueryBasedOnFirstName();
} else if(!lastNameTextField.getText().trim().equals("")) {
runQueryBasedOnLastName();
}
}
- 添加以下方法,在 JTable 中显示结果。
private void displayResult(List resultList) {
Vector<String> tableHeaders = new Vector<String>();
Vector tableData = new Vector();
tableHeaders.add("ActorId");
tableHeaders.add("FirstName");
tableHeaders.add("LastName");
tableHeaders.add("LastUpdated");
for(Object o : resultList) {
Actor actor = (Actor)o;
Vector<Object> oneRow = new Vector<Object>();
oneRow.add(actor.getActorId());
oneRow.add(actor.getFirstName());
oneRow.add(actor.getLastName());
oneRow.add(actor.getLastUpdate());
tableData.add(oneRow);
}
resultTable.setModel(new DefaultTableModel(tableData, tableHeaders));
}
- 修复导入,添加 java.util.Vector 并保存您的更改。
保存窗体之后,您可以运行项目。
运行项目
- 右键单击“项目”窗口中的项目节点,然后选择“属性”。
- 在“项目属性”对话框中选择“运行”类别。
- 键入 sakila.ui.DVDStoreAdmin 作为主类。单击“确定”。
或者,您可以单击“浏览”按钮并在对话框中选择主类。

- 单击主工具栏中的“运行主类”,以启动应用程序。
在“姓氏”或“名字”字段中键入搜索字符串,并单击“查询”来搜索使用者并查看详细信息。

如果您查看 IDE 的“输出”窗口,您可以看到检索显示结果的 SQL 查询。
分别创建 POJO 和映像文件
由于 POJO 是一个简单的 Java 类,因此您可以使用“新建 Java 类”向导创建类,然后在源编辑器中编辑该类,添加必要的字段以及 getter 和 setter 方法。创建 POJO 之后,您可以使用向导创建一个 Hibernate 映像文件,用于将类映射到表,并将映像信息添加到 hibernate.cfg.xml。从头开始创建映像文件时,您需要在 XML 编辑器中将字段映射到列。
注意:本练习为可选,描述如何使用“通过数据库生成 Hibernate 映像文件和 POJO”向导创建 POJO 和映像文件。
- 右键单击“项目”窗口中的“源包”节点并选择“新建”>“Java 类”以打开“新建 Java 类”向导。
- 在该向导中,键入 类名 作为类名,键入 sakila.entity 作为包名。单击“完成”。
- 对类进行以下更改(显示为粗体)以实现“可序列化”接口并为表列添加字段。
public class Actor implements Serializable {
private Short actorId;
private String firstName;
private String lastName;
private Date lastUpdate;
}
- 为字段生成 getter 和 setter 方法,方法是将光标放置在源编辑器中,按下 Alt-Insert 并选择“Getter 和 Setter”。
- 在“生成 Getter 和 Setter”对话框中,选择所有字段并单击“生成”。
在“生成 Getters 和 Setters”对话框中,您可以使用键盘中的向上箭头将所选项目移动到 Actor 节点中,然后敲击空格栏选择 Actor 中的所有字段。
- 修复导入并保存更改。
为表创建 POJO 之后,您希望为 Actor.java 创建一个 Hibernate 映像文件。
- 在“项目”窗口中右键单击 sakila.entity 源包节点,然后选择“新建”>“其他”以打开“新建文件”向导。
- 从“Hibernate”类别中选择“Hibernate 配置文件”。单击“下一步”。
- 键入 Actor.hbm 作为文件名,并检查文件夹为 src/sakila/entity。单击“下一步”。
- 键入 sakila.entity.Actor 作为要映像的类,然后从“数据库表”下拉列表中选择 actor。单击“完成”。
单击“完成”后,Actor.hbm.xml Hibernate 映像文件将在源编辑器中打开。IDE 还会自动在 hibernate.cfg.xml 中添加一个映像资源条目。 您可以通过在 hibernate.cfg.xml“设计”视图或在 XML 视图中展开“映像”节点来查看条目详细信息。XML 视图中的 mapping 条目如下所示:
<mapping resource="sakila/entity/Actor.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 对 Actor.hbm.xml 执行以下更改(黑体),将 Actor.java 中的字段映射到 ACTOR 表中的列。
<hibernate-mapping>
<class name="sakila.entity.Actor" table="actor">
<id name="actorId" type="java.lang.Short">
<column name="actor_id"/>
<generator class="identity"/>
</id>
<property name="firstName" type="string">
<column length="45" name="first_name" not-null="true"/>
</property>
<property name="lastName" type="string">
<column length="45" name="last_name" not-null="true"/>
</property>
<property name="lastName" type="string">
<column length="45" name="last_name" not-null="true"/>
</property>
<property name="lastUpdate" type="timestamp">
<column length="19" name="last_update" not-null="true"/>
</property>
</class>
</hibernate-mapping>
在编辑器中修改映像文件时,您可以使用使用代码完成功能完成各值。
注意:缺省情况下,生成的 class 元素具有一个结束标记。 因为需要在打开和关闭 class 元素标记之间添加属性元素,所以需要进行以下更改(显示为粗体)。进行更改之后,可以在 class 标记之间使用代码完成。
<hibernate-mapping>
<class name="sakila.entity.Actor"table="actor">
</class></hibernate-mapping>
- 单击工具栏中的“验证 XML”按钮并保存更改。
创建单独的 POJO 和 Hibernate 映像文件可能是进一步定制应用程序的便捷方法。
另请参见
有关创建 Swing GUI 应用程序的额外信息,请参见以下教程。