准备工作:
- 下载最新的 Hibernate(当前:Hibernate ORM 4.1.7),解压备用。
- 在 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 包
- Hibernate 内 lib/required 下的所有 Jar 包
- aopalliance-x.x.jar
- aspectjweaver-x.x.x.jar
- commons-dbcp-x.x.jar
- 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 的配置文件执行以下操作
- 配置数据源
<!-- 数据源 --> <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>
- 配置 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>
- 配置事务 对 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>
- 把 sessionFactory 注入 Dao 修改原有配置为:
<bean id="employeeDao" class="com.sample.dao.EmployeeDaoImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
第五步:重构 Dao
- 创建 BaseDao,在其内定义 sessionFactory 属性(我想你一定知道原因 :))
package com.sample.dao; import org.hibernate.SessionFactory; public class BaseDao { protected SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }
- 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