SSH開發實踐part1:Spring與Hibernate整合

大魔王薩格拉斯發表於2014-06-12

1

之前把SSH看完了,現在從頭開始進行專案實踐。現在講整個過程中的點滴記錄下來,希望對後來者有參考。

 

2

SSH是一個輕量級的java開發框架,struts負責MVC開發模式中的controller角色,hibernate則是負責物件的持久化,也就是對DB的訪問,spring則是利用其IOC反轉控制來完成對bean物件的管理,包括對hibernate的管理。好吧,這些東西相信大家都不陌生。現在我們正式開始,整個開發步驟主要包括以下幾點:

  • 新建web project專案
  • 增加spring與hibernate類庫檔案
  • 新建spring的配置檔案:applicationContext.xml
  • 新建POJO及對應的hibernate對映檔案
  • 編寫DAO介面
  • 實現DAO各方法
  • 完善applicationContext.xml配置,整合spring與hibernate

3.新建project和新增spring和hibernate就不多說了,如果嫌麻煩的話,可以通過myEclipse匯入也可以。

  值得注意的就是別忘記新增你所用資料庫(我用的mysql)JDBC驅動,c3p0的類庫,spring orm/oxm/jdbc的類庫檔案。

  由於hibernate不能自動建立資料庫,只能建立表結構,所以在開始專案之前我們先需要建立一個測試用的資料庫,字元請選用UTF-8.

  關於applicationContext.xml的配置,主要是先配置dataSource以及sessionFactory,通過spring來進行管理,然後注入需要的DAO類中。

  以下是參考配置。

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost/hrsystem"/>
        <property name="user" value="root"/>
        <property name="password" value="root"/>
        <property name="maxPoolSize" value="40"/>
        <property name="minPoolSize" value="1"/>
        <property name="initialPoolSize" value="1"/>
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
               
</list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=true hibernate.format_sql=true; </value> </property> </bean>

  需要值得注意的是:

  • sessionFactory的實現類一定要寫正確了,如果你用的是hibernate4以上的版本,那麼記得改class屬性。
  • mappingResources這裡我們先留空,待後續完善bean配置檔案再進行引入。
  • dialect注意寫你的資料庫對應的方言
  • hibernate.hbm2ddl.auto=update可以讓hibernate自動生成表結構

4.編寫POJO以及hibernate對映檔案

  POJO的編寫就根據大家的需求自己寫了,可以建立一個簡單物件,同時寫幾個屬性,通過IDE自動生成setter和getter函式

  別忘記建立一個空的構建函式。

  比如看看我的。

public class Employee {
    private int id;
    private String name;
    private String password;
    private int age;
    
    public Employee(){}

  //隱藏各屬性的get/set函式
  }

  然後根據POJO建立hibernate對映檔案。

<hibernate-mapping package="com.souvenir.bean">
    <class name="Employee" table="Employee">
        <!-- 對映標識屬性 -->
        <id name="id" column="emp_id"
            type="int">
            <!-- 指定主鍵生成器策略 -->
            <generator class="identity"/>
        </id>
        <!-- 對映普通屬性 -->
        <property name="name" type="string"/>
        <property name="password" type="string"/>
        <property name="age" type="int"/>
    </class>
</hibernate-mapping>


5.更新spring的配置檔案

  將上面建立的bean對映檔案引入到applicationContext.xml

<list>
       <value>com/souvenir/bean/Employee.hbm.xml</value>
</list>


6.建立DAO介面

  至於為什麼要用介面,我就不多說了,大家可以自行百度。

  在介面中主要定義了需要使用的方法:

public interface EmployeeDAO {
    
    Employee get(int id);
    
    Integer save(Employee emp);
    
    void update(Employee emp);
    
    void delete(Employee emp);
    
    void delete(int id);
    
    List<Employee> findByName(String name);
    
    List<Employee> findAllEmp();
    
    int getEmpNums();
    
}


7.實現DAO介面

  DAO介面的實現主要是與hibernate打交道,完成對資料的持久化,或者常規的CRUD操作。

  hibernate提供一個很方便的持久層訪問模板:HibernateTemplate,有個這個模板再加上sessionfactory,我們就可以很方面的對資料庫進行OOP操作了。

  以下是實現程式碼:

  

public class EmployeeDaoImp implements EmployeeDAO {
    private SessionFactory sessionFactory;
    private HibernateTemplate ht=null;
    

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    private  HibernateTemplate getHibernateTemplate()
    {
        if (ht == null)
        {
            ht = new HibernateTemplate(sessionFactory);
        }
        return ht;
    }
    
    @Override
    public Employee get(int id) {
        // TODO Auto-generated method stub
        return getHibernateTemplate().get(Employee.class, id);
    }

    @Override
    public Integer save(Employee emp) {
        // TODO Auto-generated method stub
        return (Integer) getHibernateTemplate().save(emp);
    }

    @Override
    public void update(Employee emp) {
        getHibernateTemplate().update(emp);
        
    }

    @Override
    public void delete(Employee emp) {
        // TODO Auto-generated method stub
        getHibernateTemplate().delete(emp);
        
    }

    @Override
    public void delete(int id) {
        // TODO Auto-generated method stub
        getHibernateTemplate().delete(get(id));
    }

    @Override
    public List<Employee> findByName(String name) {
        // TODO Auto-generated method stub
        return getHibernateTemplate().find("from Employee e where e.name=?",name);
    }

    @Override
    public List<Employee> findAllEmp() {
        // TODO Auto-generated method stub
        return (List<Employee>) getHibernateTemplate().find("from Employee");
    }

    @Override
    public int getEmpNums() {
        // TODO Auto-generated method stub
        return (int)getHibernateTemplate().find("select count(*) from Employee").get(0);
    }
    

  通過程式碼我們可以看出,通過HibernateTemplate,我們的資料操作會很簡單,很多常規的操作都已經實現了。

  然後這裡我們會發現一個問題,sessionfactory怎麼來呢?

  這裡就需要說回spring了,我們通過spring對EmployeeDaoImp 這個類注入sessionfactory例項。

  OK,看配置!

 

8.向DAO實現類注入sessionfactory

  回到之前的spring配置檔案,我們需要增加一些關於employeedao的配置。

<bean id="EmployeeDao" class="com.souvenir.daoImp.EmployeeDaoImp">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

  這裡新配置了一個EmployeeDao的bean物件,並且向其注入了sessionfactory。

 

9.測試

  好了,到這裡我們第一階段的工作基本上結束了,都是按照上面的幾個步驟來完成。

  因為我們這裡暫時沒有引入struts,所以暫時不進行相關action配置。

  這裡通過一個簡單的main函式來測試我們的整個開發配置是正確:

  

public static void main(String[] args) {
        
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        EmployeeDAO empDao=(EmployeeDAO) ctx.getBean("EmployeeDao");
        for(int i=1;i<=10;i++){
            System.out.println("oooo==="+i);
            empDao.save(new Employee("souvenir"+i,i+1,"password"+i));
        }
    }

  通過載入applicationContext.xml配置,然後獲取到dao物件,進行實體bean的操作。

 

  

  

 

 

  

  

  

相關文章