首页 > 代码库 > 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的操作。