SSH系列教程之四:整合Hibernate4

蒲公英 提交于 周四, 08/17/2017 - 09:36
JavaEE

准备工作:

  1. 下载最新的 Hibernate(当前:Hibernate ORM 4.1.7),解压备用。
  2. 在 Mysql 中创建 sample 数据库,并创建 employee 表,录入几条模拟数据。
    CREATE TABLE IF NOT EXISTS `employee` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(100) NOT NULL,
      `age` tinyint(3) NOT NULL,
      `email` text NOT NULL,
      `updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `createtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

第一步:添加以下 Hibernate 相关 Jar 包

  1. Hibernate 内 lib/required 下的所有 Jar 包
  2. aopalliance-x.x.jar
  3. aspectjweaver-x.x.x.jar
  4. commons-dbcp-x.x.jar
  5. commons-pool-x.x.jar

第二步:完善与数据库表 employee 对应的 Bean
重构 com.sample.domain 下的 Employee 类,使其结构与 employee 表完全相同。  

第三步:创建映射文件
创建 Employee 类与表 employee 之间的映射文件 Employee.hbm.xml,也保存在 com.sample.domain 包 。

<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.sample.domain">
  <class name="Employee" table="employee">
    <id name="id" column="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <property name="age"/>
    <property name="email"/>
    <property name="updatetime" type="timestamp" column="updatetime"/>
    <property name="createtime" type="timestamp" column="createtime"/>
  </class>
</hibernate-mapping>

第四步:对 Spring 的配置文件执行以下操作

  1. 配置数据源
    <!-- 数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/sample"/>
      <property name="username" value="数据库用户名"/>
      <property name="password" value="数据库密码"/>
    </bean>
  2. 配置 SessionFactory
    <!-- SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <property name="mappingResources">
        <list>
          <value>com/sample/domain/Employee.hbm.xml</value>
        </list>
      </property>
      <property name="hibernateProperties">
        <value>
          hibernate.dialect=org.hibernate.dialect.MySQLDialect
          hibernate.show_sql=true
        </value>
      </property>
    </bean>
  3. 配置事务 对 Service 接口内以 get,insert,update,delete 开头的方法进行事务管理。
    <!-- 事务 -->
    <aop:config>
      <aop:pointcut id="serviceMethods" expression="execution(* *..*Service.*(..))"/>
      <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>
    
    <tx:advice id="txAdvice" transaction-manager="txManager">
      <tx:attributes>
        <tx:method name="get*" read-only="true" />
        <tx:method name="insert*" />
        <tx:method name="update*" />
        <tx:method name="delete*" />
      </tx:attributes>
    </tx:advice>
    
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
  4. 把 sessionFactory 注入 Dao 修改原有配置为:
    <bean id="employeeDao" class="com.sample.dao.EmployeeDaoImpl">
      <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

第五步:重构 Dao

  1. 创建 BaseDao,在其内定义 sessionFactory 属性(我想你一定知道原因 :))
    package com.sample.dao;
    
    import org.hibernate.SessionFactory;
    
    public class BaseDao {
        protected SessionFactory sessionFactory;
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    }
  2. EmployeeDaoImpl 继承 BaseDao,并重构读取雇员信息部分
    public List<Employee> getAllEmployee() {
        List<Employee> employeeList;
    
        employeeList = this.sessionFactory.getCurrentSession().
                       createQuery("from Employee order by updatetime").
                       list();
    
        return employeeList;
    }

第六步:重新运行
http://localhost:8080/sampleApp  

附件:  sampleApp-SSH.7z