官术网_书友最值得收藏!

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 (? , ? , ? )
主站蜘蛛池模板: 太仓市| 闽清县| 临朐县| 呼和浩特市| 库尔勒市| 勐海县| 蕉岭县| 祁连县| 呈贡县| 公安县| 姜堰市| 宁安市| 会宁县| 灵山县| 蓬莱市| 铁力市| 丁青县| 泌阳县| 固镇县| 弥勒县| 曲阜市| 曲松县| 永济市| 博罗县| 青海省| 通许县| 甘肃省| 梁山县| 勃利县| 上杭县| 南木林县| 固始县| 临桂县| 三亚市| 师宗县| 通城县| 泌阳县| 乌兰察布市| 江永县| 盐边县| 蓝田县|