人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 (? , ? , ? )