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的操作。