2.3 数据持久化的最佳利器:Hibernate
Hibernate是目前最受关注,也是最常用的数据持久化(也可称为对象持久化)框架。Hibernate的核心功能是记录与Java对象之间的映射。这些Java对象所对应的Java类称为实体Bean。Hibernate支持对这些Java对象的基本操作,这些操作与相应的数据库操作(SQL语句)对应。例如,对数据的增、删、改操作。除此之外,Hibernate还提供了一种类似于SQL的语言:HQL。HQL独立于数据库,因此,通过HQL可以很容易地开发出跨数据库的应用系统。
2.3.1 Hibernate最新版的下载与安装
在笔者写本书时,Hibernate的最新版本是Hibernate 3.3.2。读者可以从下面的地址下载最新版本:
https://www.hibernate.org/6.html
在下载完Hibernate的压缩包后,将其解压。在解压目录有一个hibernate3.jar文件,将这个文件复制到WEB-INF\lib目录中。
除了需要hibernate3.jar文件外,还要将<Hibernate解压目录>\lib\required目录中的所有jar文件复制到WEB-INF\lib目录中。最后,还需要复制几个Hibernate发行包中没有的jar文件。这些jar文件如下:
· slf4j-log4j12-1.5.8.jar
· log4j-1.2.15.jar
· mysql-connector-java-3.0.17-ga-bin.jar
其中slf4j-log4j12-1.5.8.jar文件包含在slf4j框架中,该框架可以从如下的地址下载:
http://www.slf4j.org/download.html
log4j-1.2.15.jar包含在log4j框架中,该框架可以从如下的地址下载:
http://logging.apache.org/log4j/1.2/download.html
mysql-connector-java-3.0.17-ga-bin.jar文件是MySQL的JDBC驱动程序,该文件包含在MySQL的JDBC驱动程序发行包中。该发行包可以从如下的地址下载:
http://dev.mysql.com/downloads/connector/j/3.0.html
注意
由于本书提供的例子已经将所有的jar文件复制到所有的Eclipse工程的WEB-INF\lib目录中,因此,读者在运行本书提供的源代码时并不需要下载和复制这些jar文件。
2.3.2 做一个程序来试一下Hibernate
在本例中给出了一个程序来测试一下Hibernate的数据持久化功能。这个例子很简单,在一个Action类的execute方法中通过Hibernate向t_map表插入两条记录。这个例子涉及的t_map表的结构如图2.3所示。
图2.3 t_map的结构
1 建立MapEntity类。
MapEntity类是与t_map表对应的实体Bean。该类的代码如下:
package net.blogjava.nokiaguy.entity; public class MapEntity { private int id; private String keyword; private String value; ... ... // 此处省略了属性的getter和setter方法 }
2 映射MapEntity类。
要想将实体Bean与相应的t_map进行映射,需要编写一个映射文件。在src目录中建立一个Map.hbm.xml文件,并输入如下的代码:
<? xml version="1.0"? > <! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="net.blogjava.nokiaguy.entity.MapEntity" table="t_map"> <! -- 将id属性映射成自增类型 --> <id name="id" column="id" type="int"> <generator class="increment" /> </id> <property name="keyword" column="keyword"/> <property name="value" column="value" /> </class> </hibernate-mapping>
3 配置Hibernate。
Hibernate需要连接数据库以及指定映射文件的具体位置。这些内容需要在hibernate. cfg.xml文件中配置。在src目录中建立一个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"> <! -- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="connection.url"> jdbc:mysql://localhost/kxw? characterEncoding=UTF8 </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.username">root</property> <property name="connection.password">1234</property> <! -- 显示Hibernate生成的SQL语句 --> <property name="show_sql">true</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <! -- 指定Map.hbm.xml文件的位置 --> <mapping resource="Map.hbm.xml" /> </session-factory> </hibernate-configuration>
4 编写MapAction类。
MapAction是一个Action类,在execute方法中通过Hibernate向t_map表中插入两条记录。MapAction类的代码如下:
package net.blogjava.nokiaguy.actions; import javax.servlet.http.HttpServletRequest; import net.blogjava.nokiaguy.entity.MapEntity; import org.apache.struts2.interceptor.ServletRequestAware; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class MapAction implements ServletRequestAware { private HttpServletRequest request; private String result; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } public String getResult() { return result; } public String execute() throws Exception
{ Configuration configuration = new Configuration(); SessionFactory sessionFactory; configuration.configure("hibernate.cfg.xml"); sessionFactory = configuration.buildSessionFactory(); // 开始一个会话 Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // 开始事务 transaction.begin(); MapEntity mapEntity1 = new MapEntity(); mapEntity1.setKeyword("bike"); mapEntity1.setValue("自行车"); MapEntity mapEntity2 = new MapEntity(); mapEntity2.setKeyword("computer"); mapEntity2.setValue("计算机"); // 持久化两个对象 session.save(mapEntity1); session.save(mapEntity2); // 提交事务 transaction.commit(); session.close(); result = "保存成功!"; return "success"; } }
5 配置MapAction类。
MapAction类的配置代码如下:
<action name="map" class="net.blogjava.nokiaguy.actions.MapAction"> <result name="success">/WEB-INF/map.jsp</result> </action>
其中map.jsp页面非常简单,只是使用如下语句显示MapAction类的result属性值:
<s:property value="result"/>
启动Tomcat后,在浏览器地址栏中输入如下的URL:
http://localhost:8080/sshregister/map.action
在访问上面的URL后,系统就会向t_map表插入两条记录,如图2.4所示。
图2.4 向t_map表插入的两条记录
在浏览器的当前页面中会输出“保存成功”信息。在Eclipse的Console页面中会输出如下的三条SQL语句:
Hibernate: select max(id) from t_map Hibernate: insert into t_map (keyword, value, id) values (? , ? , ? ) Hibernate: insert into t_map (keyword, value, id) values (? , ? , ? )