目前,SSH(Struts+Spring+Hibernate)是Web开发的一种常用框架组合,Struts实现了MVC,Hibernate实现了关系对象映射,Spring实现了基于Bean的配置管理。本文使用 MyEclipse实现Spring+Hibernate的整合。

软件和框架使用版本:

MyEclipse:8.0

Spring:2.5

Hibernate:3.2

MySQL:5.1

1.创建数据库连接

1)首先在MyEclipse下切换Perspective至MyEclipse Database Explorer,在左侧DB Browser中右键点击,在对话框中选择“New”,创建数据库连接MySQL。数据库连接的配置如图1所示,需要填写URL、用户名、密码、驱动等信息。

MyEclipse下Spring+Hibernate整合_第1张图片

图 1

2)数据库连接配置成功后,左侧DB Browser中会显示该连接,右键点击该连接,在对话框中选择“Open connection”,显示数据库中的详细信息,如图2所示。在数据库中已有一user表,在下面将使用Spring+Hibernate实现对该表的操作。

MyEclipse下Spring+Hibernate整合_第2张图片 

图 2

2.新建Web工程,并配置Spring

1)切换Perspective至MyEclipse Java Enterprise,新建Web工程ssh,如图3所示。如果在随后的工作中还需整合Struts 2,则J2EE Specification Level应选择Java EE 5.0,此处暂选用默认配置J2EE 1.4。 

MyEclipse下Spring+Hibernate整合_第3张图片

 图 3

2)右键点击该工程,在对话框中选择“MyEclipse->Add Spring Capabilities...”,添加Spring,并进行相关配置,如图4所示,采用默认配置即可。

MyEclipse下Spring+Hibernate整合_第4张图片

图 4

3.配置Hibernate

1)右键点击该工程,在对话框中选择“MyEclipse->Add Hibernate Capabilities...”,添加Hibernate,并进行相关配置,如图5、图6、图7、图8、图9所示。

由于需要使用Spring配置Hibernate,因此选中所有的Library。

MyEclipse下Spring+Hibernate整合_第5张图片 

图 5

选择Spring的配置文件applicationContext.xml进行配置。

MyEclipse下Spring+Hibernate整合_第6张图片 

图 6

选择已有的Spring配置文件,并使用Spring配置Hibernate中的SessionFactory,SessionFactory的bean id为sessionFactory。

MyEclipse下Spring+Hibernate整合_第7张图片

图 7

配置数据源DataSource的bean id为dataSource,且其配置信息采用数据库连接MySQL。

MyEclipse下Spring+Hibernate整合_第8张图片

图 8

不另写SessionFactory类,而采用Spring为Hibernate已设计的SessionFactory类。

MyEclipse下Spring+Hibernate整合_第9张图片

图 9

4.数据库逆向工程

1)切换Perspective至MyEclipse Hibernate,右键点击数据表user,在对话框中选择“Hibernate Reverse Engineering...”,对user表的关系对象映射进行配置,如图10所示,其中第一个红框用于选择Java源文件目录,第二个红框用于选择是否创建关系对象映射文件,以hbm.xml结尾,第三个红框用于选择是否创建数据对象类,第四个红框用于选择是否创建数据访问对象类,均选择是,其他采用默认配置即可。

MyEclipse下Spring+Hibernate整合_第10张图片 

图 10

4.分析和测试

按上述步骤配置后就可以在工程中实现Spring和Hibernate的整合,以及user表的关系对象映射,工程目录如图11所示,其中src目录下的applicationContext.xml是Spring和Hibernate的核心配置文件,pojo包中的三个文件是与user表对应的数据对象类User.java、数据访问对象类UserDAO.java、关系对象映射文件User.hbm.xml。

MyEclipse下Spring+Hibernate整合_第11张图片 

图 11

applicationContext.xml内容如下所示:

   
   
   
   
  1. xml version="1.0" encoding="UTF-8"?> 
  2. <beans 
  3.     xmlns="http://www.springframework.org/schema/beans" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xmlns:p="http://www.springframework.org/schema/p" 
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
  7.  
  8.  
  9.     <bean id="dataSource" 
  10.         class="org.apache.commons.dbcp.BasicDataSource"> 
  11.         <property name="driverClassName" 
  12.             value="com.mysql.jdbc.Driver"> 
  13.         property> 
  14.         <property name="url" value="jdbc:mysql://localhost:3306/web">property> 
  15.         <property name="username" value="root">property> 
  16.         <property name="password" value="root">property> 
  17.     bean> 
  18.     <bean id="sessionFactory" 
  19.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
  20.         <property name="dataSource"> 
  21.             <ref bean="dataSource" /> 
  22.         property> 
  23.         <property name="hibernateProperties"> 
  24.             <props> 
  25.                 <prop key="hibernate.dialect"> 
  26.                     org.hibernate.dialect.MySQLDialect  
  27.                 prop> 
  28.             props> 
  29.         property> 
  30.         <property name="mappingResources"> 
  31.             <list> 
  32.                 <value>pojo/User.hbm.xmlvalue>list> 
  33.         property>bean> 
  34.     <bean id="UserDAO" class="pojo.UserDAO"> 
  35.         <property name="sessionFactory"> 
  36.             <ref bean="sessionFactory" /> 
  37.         property> 
  38.     bean>beans> 

其中,bean dataSource实现数据库连接配置,bean sessionFactory实现Hibernate的SessionFactory,并使用bean dataSource的连接配置,bean UserDAO实现User数据对象访问,并使用bean sessionFactory创建会话。

User.java代码部分如下:

   
   
   
   
  1. public class User implements java.io.Serializable {  
  2.  
  3.     // Fields  
  4.  
  5.     private Integer id;  
  6.     private String password;  
  7.     private String name;  
  8.     private String school;  
  9.  
  10.     // Constructors  
  11.  
  12.     /** default constructor */ 
  13.     public User() {  
  14.     }  
  15.  
  16.     /** full constructor */ 
  17.     public User(String password, String name, String school) {  
  18.         this.password = password;  
  19.         this.name = name;  
  20.         this.school = school;  
  21.     }  
  22.  
  23.     // Property accessors
  24. ....
  25. } 

其中,对User对象类进行了定义,包括与user表字段对应的属性值、构造函数、Get/Set函数等。

UserDAO.java代码部分如下所示:

   
   
   
   
  1. public class UserDAO extends HibernateDaoSupport {  
  2.     private static final Log log = LogFactory.getLog(UserDAO.class);  
  3.     // property constants  
  4.     public static final String PASSWORD = "password";  
  5.     public static final String NAME = "name";  
  6.     public static final String SCHOOL = "school";  
  7.  
  8.     protected void initDao() {  
  9.         // do nothing  
  10.     }  
  11.  
  12.     public void save(User transientInstance) {  
  13.         log.debug("saving User instance");  
  14.         try {  
  15.             getHibernateTemplate().save(transientInstance);  
  16.             log.debug("save successful");  
  17.         } catch (RuntimeException re) {  
  18.             log.error("save failed", re);  
  19.             throw re;  
  20.         }  
  21.     }
  22. ...

该类继承了Spring的HibernateDaoSupport类,调用对象实例本身的getHibernateTemplate获取HibernateTemplate对象,进而调用其save、delete等方法实现数据的增加、删改等操作。

User.hbm.xml内容如下所示:

   
   
   
   
  1. xml version="1.0" encoding="utf-8"?> 
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  3.  
  4. <hibernate-mapping> 
  5.     <class name="pojo.User" table="user" catalog="web"> 
  6.         <id name="id" type="java.lang.Integer"> 
  7.             <column name="id" /> 
  8.             <generator class="identity" /> 
  9.         id> 
  10.         <property name="password" type="java.lang.String"> 
  11.             <column name="password" length="10" not-null="true" /> 
  12.         property> 
  13.         <property name="name" type="java.lang.String"> 
  14.             <column name="name" length="10" not-null="true" /> 
  15.         property> 
  16.         <property name="school" type="java.lang.String"> 
  17.             <column name="school" length="30" not-null="true" /> 
  18.         property> 
  19.     class> 
  20. hibernate-mapping> 

其中定义了user表和User类的关系对象映射。

在UserDAO中编写一个主函数实现向user表中写入数据,如下所示:

   
   
   
   
  1. public static void main(String args[])  
  2. {  
  3.     //从src/applicationContext.xml装载BeanFactory  
  4.     Resource res =new FileSystemResource("src/applicationContext.xml");       
  5.     BeanFactory factory = new XmlBeanFactory(res);  
  6.     //从BeanFactory获取UserDAO  
  7.     UserDAO userDAO = (UserDAO) factory.getBean("UserDAO");  
  8.     //添加新User  
  9.     User user = new User("123","Tom","Tsinghua");  
  10.     userDAO.save(user);       

执行后,查看user表,如果该表已新增一条记录,说明配置成功。

 

图 12