首页 > 代码库 > SSH开发实践part1:Spring与Hibernate整合

SSH开发实践part1:Spring与Hibernate整合

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