目前,SSH(Struts+Spring+Hibernate)是Web開發的一種經常使用框架組合,Struts實現了MVC,Hibernate實現了關係對象映射,Spring實現了基於Bean的配置管理。本文使用 MyEclipse實現Spring+Hibernate的整合。java
軟件和框架使用版本:mysql
MyEclipse:8.0web
Spring:2.5spring
Hibernate:3.2sql
MySQL:5.1數據庫
1.建立數據庫鏈接apache
1)首先在MyEclipse下切換Perspective至MyEclipse Database Explorer,在左側DB Browser中右鍵點擊,在對話框中選擇「New」,建立數據庫鏈接MySQL。數據庫鏈接的配置如圖1所示,須要填寫URL、用戶名、密碼、驅動等信息。session
圖 1app
2)數據庫鏈接配置成功後,左側DB Browser中會顯示該鏈接,右鍵點擊該鏈接,在對話框中選擇「Open connection」,顯示數據庫中的詳細信息,如圖2所示。在數據庫中已有一user表,在下面將使用Spring+Hibernate實現對該表的操做。框架
圖 2
2.新建Web工程,並配置Spring
1)切換Perspective至MyEclipse Java Enterprise,新建Web工程ssh,如圖3所示。若是在隨後的工做中還需整合Struts 2,則J2EE Specification Level應選擇Java EE 5.0,此處暫選用默認配置J2EE 1.4。
圖 3
2)右鍵點擊該工程,在對話框中選擇「MyEclipse->Add Spring Capabilities...」,添加Spring,並進行相關配置,如圖4所示,採用默認配置便可。
圖 4
3.配置Hibernate
1)右鍵點擊該工程,在對話框中選擇「MyEclipse->Add Hibernate Capabilities...」,添加Hibernate,並進行相關配置,如圖五、圖六、圖七、圖八、圖9所示。
因爲須要使用Spring配置Hibernate,所以選中全部的Library。
圖 5
選擇Spring的配置文件applicationContext.xml進行配置。
圖 6
選擇已有的Spring配置文件,並使用Spring配置Hibernate中的SessionFactory,SessionFactory的bean id爲sessionFactory。
圖 7
配置數據源DataSource的bean id爲dataSource,且其配置信息採用數據庫鏈接MySQL。
圖 8
不另寫SessionFactory類,而採用Spring爲Hibernate已設計的SessionFactory類。
圖 9
4.數據庫逆向工程
1)切換Perspective至MyEclipse Hibernate,右鍵點擊數據表user,在對話框中選擇「Hibernate Reverse Engineering...」,對user表的關係對象映射進行配置,如圖10所示,其中第一個紅框用於選擇Java源文件目錄,第二個紅框用於選擇是否建立關係對象映射文件,以hbm.xml結尾,第三個紅框用於選擇是否建立數據對象類,第四個紅框用於選擇是否建立數據訪問對象類,均選擇是,其餘採用默認配置便可。
圖 10
4.分析和測試
按上述步驟配置後就能夠在工程中實現Spring和Hibernate的整合,以及user表的關係對象映射,工程目錄如圖11所示,其中src目錄下的applicationContext.xml是Spring和Hibernate的核心配置文件,pojo包中的三個文件是與user表對應的數據對象類User.java、數據訪問對象類UserDAO.java、關係對象映射文件User.hbm.xml。
圖 11
applicationContext.xml內容以下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName"
- value="com.mysql.jdbc.Driver">
- </property>
- <property name="url" value="jdbc:mysql://localhost:3306/web"></property>
- <property name="username" value="root"></property>
- <property name="password" value="root"></property>
- </bean>
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.MySQLDialect
- </prop>
- </props>
- </property>
- <property name="mappingResources">
- <list>
- <value>pojo/User.hbm.xml</value></list>
- </property></bean>
- <bean id="UserDAO" class="pojo.UserDAO">
- <property name="sessionFactory">
- <ref bean="sessionFactory" />
- </property>
- </bean></beans>
其中,bean dataSource實現數據庫鏈接配置,bean sessionFactory實現Hibernate的SessionFactory,並使用bean dataSource的鏈接配置,bean UserDAO實現User數據對象訪問,並使用bean sessionFactory建立會話。
User.java代碼部分以下:
- public class User implements java.io.Serializable {
- // Fields
- private Integer id;
- private String password;
- private String name;
- private String school;
- // Constructors
- /** default constructor */
- public User() {
- }
- /** full constructor */
- public User(String password, String name, String school) {
- this.password = password;
- this.name = name;
- this.school = school;
- }
- // Property accessors
- ....
- }
其中,對User對象類進行了定義,包括與user表字段對應的屬性值、構造函數、Get/Set函數等。
UserDAO.java代碼部分以下所示:
- public class UserDAO extends HibernateDaoSupport {
- private static final Log log = LogFactory.getLog(UserDAO.class);
- // property constants
- public static final String PASSWORD = "password";
- public static final String NAME = "name";
- public static final String SCHOOL = "school";
- protected void initDao() {
- // do nothing
- }
- public void save(User transientInstance) {
- log.debug("saving User instance");
- try {
- getHibernateTemplate().save(transientInstance);
- log.debug("save successful");
- } catch (RuntimeException re) {
- log.error("save failed", re);
- throw re;
- }
- }
- ...
- }
該類繼承了Spring的HibernateDaoSupport類,調用對象實例自己的getHibernateTemplate獲取HibernateTemplate對象,進而調用其save、delete等方法實現數據的增長、刪改等操做。
User.hbm.xml內容以下所示:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <!--
- Mapping file autogenerated by MyEclipse Persistence Tools
- -->
- <hibernate-mapping>
- <class name="pojo.User" table="user" catalog="web">
- <id name="id" type="java.lang.Integer">
- <column name="id" />
- <generator class="identity" />
- </id>
- <property name="password" type="java.lang.String">
- <column name="password" length="10" not-null="true" />
- </property>
- <property name="name" type="java.lang.String">
- <column name="name" length="10" not-null="true" />
- </property>
- <property name="school" type="java.lang.String">
- <column name="school" length="30" not-null="true" />
- </property>
- </class>
- </hibernate-mapping>
其中定義了user表和User類的關係對象映射。
在UserDAO中編寫一個主函數實現向user表中寫入數據,以下所示:
- public static void main(String args[])
- {
- //從src/applicationContext.xml裝載BeanFactory
- Resource res =new FileSystemResource("src/applicationContext.xml");
- BeanFactory factory = new XmlBeanFactory(res);
- //從BeanFactory獲取UserDAO
- UserDAO userDAO = (UserDAO) factory.getBean("UserDAO");
- //添加新User
- User user = new User("123","Tom","Tsinghua");
- userDAO.save(user);
- }
執行後,查看user表,若是該表已新增一條記錄,說明配置成功。
圖 12