- 人人都玩開心網:Ext JS+Android+SSH整合開發Web與移動SNS
- 李寧編著
- 1141字
- 2018-12-27 18:57:25
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 (? , ? , ? )