第九章 数据持久化—使用 Hibernate
9.2 Hibernate 简单应用
本节将向读者展示一个简单的 Hibernate 应用,希望能让读者了解 Hibernate 的简单使用
方法。
配合 Hibernate 的使用,还要有存放数据的地方。这里,作者使用的是 MySQL 数据库 系统,版本号为 MySQL5.0.24a。MySQL 是 Eclipse 开发环境中数据库应用开发的最佳选择,
它是支持并发连接、多用户、多线程的关系型数据库管理系统,在 Java 应用的开发中得到 广泛的应用。虽然它不是一个完全开源的数据库管理系统,但是可以从它的官网上下载并 使用。更多的数据库操作方法,请读者参见 MySQL 的相关文档,这里就不再多讲了。
另外,MySQL 还有一个图形化管理工具 MySQL Query Browser,它的使用将会在很大程度 上方便 MySQL 的使用。
有了数据库系统,为了能与 Java 程序通信,还要下载 MySQL 的 JDBC 驱动包。这个驱 动包能让 Java 代码访问和发送 SQL 命令给数据库服务器软件。需要说明的是,驱动程序是 与数据库相关的,它实现 javax.sql.Driver 接口,屏蔽了不同数据库的差别,让 JDBC 能与不 同类型的数据库连接。实际上,Hibernate 的核心就是一个 JDBC 封装器,它是离不开 MySQL 驱动程序的。
到 MySQL 网站选择最新版本的 JDBC 驱动下载到本地机器上,这里得到的是一个.zip 文件,本书使用的是下面的这个版本:mysql-connector-java-5.0.3.zip。解压缩该文件,在目 录 mysql-connector-java-5.0.3 下包含一个名为 mysql-connector-java-5.0.3-bin.jar 的 JAR 文件,
它包含了驱动程序,在以后的应用中,就是把它添加到 Java 构建路径中的。
首先在 Eclipse 里创建一个新项目,这里取名为 SimpleHibUse,然后将所需的 JAR 文件 导入,这里有两种方法。
方法一:
右击 Project 名字,在弹出菜单中选择属性,再在弹出的窗口中单击 Java 构建路径,选 中库标签,选择“添加外部 JAR”,找到 JDBC 驱动,即 mysql-connector-java-5.0.3-bin.jar,
将其添加进来,按照同样的方法将解压得到的 Hibernate 目录下的 hibernate3.jar 和 lib 目录下 的 jar 包添加进来,这样就完成了构建路径。
注意:用这种方法添加的 JAR 包,并有直接添加到 WEB-INF/lib 里,而用的是绝对路径,
因此在这个项目移到别的机器上后,要重新修改上面所做的这部分内容,可见这很不方便。
下面的方法二将不会有这种问题。
方法二:
直接将所要的 JAR 包拷贝到项目的 WebRoot/WEB-INF/lib 下面,Eclipse 会自动加载这 些资源。这里,笔者建议这么做。
导入了所需要的 JAR 包后,在 src 目录下创建 Hibernate 配置文件 hibernate.cfg.xml,在 src 文件夹上右击,在弹出的菜单中选择新建包,输入包的名字为 example,然后在 example 包下创建源文件,方法为:右击 example 包,在弹出的菜单中选择新建类,来创建.java 文件,选择新建xml,来创建.xml 文件;或者选择新建文件,来创建想要的文件,注意 这种方法要输入文件的扩展名,比如 User.hbm.xml。这里要创建的源文件有:User 类文件 User.java、Hibernate 的映射文件 User.hbm.xml 和包含操作的类文件 Test.java。最后建好的项 目结构如图 9-2 所示。
图 9-2 SimpleHibUse 文件目录结构
下面来看各文件的内容。首先是 Hibernate 的配置文件 Hibernate.cfg.xml,该文件是 Hibernate 的初始化配置文件,说明了与数据库系统连接有关的信息,这里代码如下:
Hibernate.cfg.xml
<?xml version="1.0" encoding ='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/simhib</property>
<property name="connection.username">root</property>
<property name="connection.password">luddong</property>
<property name="connection.pool_size">5</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_seccsion_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<!--<property name="hbm2ddl.auto">create</property>-->
<mapping resource="example/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这 里 使 用 JDBC 连 接 数 据 库 ( 这 也 是 Hiberante 默 认 的 , 它 使 用 org.hibernate.transaction.JDBCTransaction 作为 Transaction 的实现),因此指定了如下 5 个属 性,如表 9-1 所示。
表 9-1 JDBCTransaction 的属性
connection.driver_class 用于连接到 JDBC 数据库的类,这里用的是
MySQLC 的 JDBC 类。
connection.url 连接数据库的完整的 JDBC URL。
connection.username 要连接到的数据库的用户名。
connection.password 要连接到的数据库的用户的密码。
dialect 要使用的 SQL 方言。
该配置文件说明连接的数据库是 simhib,用户名和密码分别是 root 和 luddong。其它的 属性,比如 show_sql,告诉 Hibernate 要不要在控制台输出执行操作的 SQL 语句等。而 mapping 元素指定了映射文件的路径,这也是必不可少的。
注意:其中的 hbm2ddl.auto 元素,是用来告诉 Hiernate 在添加新的元组到数据库中的时候,
是否清除将要被添加数据的表中原来已有的数据。如果将其设为 true,那么每次执行插入操 作时,Hibernate 会自动把以前表中原有的数据清除掉。
在上面的配置文件中,mapping 标签指定了一个映射文件 User.hbm.xml,该文件的作用 是把另外一个类文件 User.java 映射到数据库中的某个表,这里先看类文件 User.java:
User.java
package example;
public class User extends Object{
private int id;
private String username;
private String password;
/*省略 getter 和 setter*/
}
这是一个典型的 JavaBean 风格的类,定义了需要的变量和与变量对应的 getter、setter 方法。这些方法有时 Struts2 会在后台调用,有时则是程序显式地调用。
User.java 类的映射文件 User.hbm.xml 代码如下:
User.hbm.xml
<?xml version="1.0" encoding ='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="example.User" table="usertable">
<id name="id">
<generator class="native"/>
</id>
<property name="username"/>
<property name="password"/>
</class>
</hibernate-mapping>
这个文件告诉 Hibernate 将 User 这个类映射到表 usertable,其中,id 为主键,生成方式 为 native。Property 告诉 Hibernate,类和表中的元素的对映关系,完整的应为<property name=”username” column=”username”/>,但是因为这里类和表中的 username、password 元素 的名字相同,所以不必将 column=”username” 也写上。
这里给出表 usertable 的 SQL 脚本,如下所示:
DROP TABLE IF EXISTS `simhib`.`usertable`;
CREATE TABLE `simhib`.`usertable` (
`id` int(10) unsigned NOT NULL auto_increment, `username` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL, PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
通过上面的配置,现在可以通过 SQL 语句对数据库进行读写。这里,创建一个类 Test.java 来实现对数据库的操作,该类的代码如下:
Test.java
package example;
/*省略 import*/
public class Test{
public static void main(String args[]){
SessionFactory sessionFactory;
try {
图 9-4 数据库的变化
这就是这个项目的结果,即通过 Hibernate 实现了对数据库的操作。该项目并没有涉及 到有关 Struts2 方面的内容,从这里也可以看出,Hibernate 本身就是一个独立的框架,它是 可以单独使用的。相信通过本节内容的学习,读者已经能了解 Hibernate 的工作原理了,这 将是下面学习的基础。