Spring+Hibernate整合
在进行整合前,我认为将Hibernate的配置整合到Spring的配置中,由Spring进行管理,由Hibernate进行对数据库的操作。
后来在网上找了一些整合的方法,但是整合都失败了,因为我的Hibernate的版本是5,所以有些包被集成进其他包,在Spring的xml文件中配置,是找不到那个包的,而且我也不清楚Hibernate5将这个包放在哪里,或者未来还将有多少类似的事情发生,所以还是重新下载Hibernate3.3来用。
项目目录如下:

下载好了Hibernate3.3后,我们开始整合Spring和Hibernate!
1. 建立一个User Library,向其中导入Hibernate需要用到的jar包。
在这里,我们一定要注意,宁可少导包,报错后按照提示进行导包,也不要多导,否则会出问题。以下是使用Hibernate3.3需要导入的包:

a) 连接mysql的jar包,我是为了方便直接导入了。
b) hibernate-distribution-3.3.2.GA目录下的hibernate3.jar。
这是Hibernate3.3的核心包
c) 将hibernate-distribution-3.3.2.GA\lib\required目录下的6个jar包全部导入。
d) 因为我们要使用注解,就需要添加和注解有关的jar包,需要下载
hibernate-annotation-3.4.0.GA的所有jar包。
将hibernate-annotations-3.4.0.GA目录下的hibernate-annotations.jar导入。
e) 将hibernate-annotations-3.4.0.GA\hibernate-annotations-3.4.0.GA\lib目录下的ejb3-persistence.jar以及hibernate-sommons-annotations.jar导入。
f) 最后需要下载slf4j-1.5.8(一定要和上面导入的slf4j-api-1.5.8.jar版本相同)将目录下的slf4j-nop-1.5.8.jar导入。
至此,Hibernate需要的包全部导入了。
2. 建立Spring的User Library。
需要的包如下:还是注意,宁可多导,不能少导。

3. 先建立个实体类
建立实体类的时候,实体类名称尽量不要与Mysql的关键字重复,否则容易引起冲突。我在此建立一个Student实体类。在这里加上@Entity,@Id,@generatedValue注解。
1 package com.spring_hibernate.model; 2 3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.Id; 6 7 @Entity 8 public class Student { 9 private int id; 10 private String name; 11 private int age; 12 13 @Id 14 @GeneratedValue 15 public int getId() { 16 return id; 17 } 18 public void setId(int id) { 19 this.id = id; 20 } 21 public String getName() { 22 return name; 23 } 24 public void setName(String name) { 25 this.name = name; 26 } 27 public int getAge() { 28 return age; 29 } 30 public void setAge(int age) { 31 this.age = age; 32 } 33 @Override 34 public String toString() { 35 return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; 36 } 37 public Student(int id, String name, int age) { 38 super(); 39 this.id = id; 40 this.name = name; 41 this.age = age; 42 } 43 public Student() { 44 super(); 45 } 46 47 48 }
4. 写DAO接口
我们写一个StudentDao接口,其中有一个方法save(Student student)用于向数据库存储学生数据。
1 package com.spring_hibernate.dao; 2 import com.spring_hibernate.model.Student; 3 4 public interface StudentDao { 5 public void save(Student student); 6 }
5. 配置文件
在写Dao实现前,我们先把配置文件搞定,我们只需要写关于Spring的配置文件就可以,让Spring控制SessionFactory,在其中将Hibernate集成进去。建立一个beans.xml文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context-2.5.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 15 <context:annotation-config /> 16 <context:component-scan base-package="com.spring_hibernate" /> 17 18 <!-- 用Properties文件读取数据库连接信息 --> 19 <bean 20 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 21 <property name="locations"> 22 <value>classpath:jdbc.properties</value> 23 </property> 24 </bean> 25 26 <!-- 数据源定义 --> 27 <bean id="dataSource" destroy-method="close" 28 class="org.apache.commons.dbcp.BasicDataSource"> 29 <property name="driverClassName" value="${jdbc.driverClassName}" /> 30 <property name="url" value="${jdbc.url}" /> 31 <property name="username" value="${jdbc.username}" /> 32 <property name="password" value="${jdbc.password}" /> 33 </bean> 34 35 <!-- 最重要的配置:SessionFactory的配置 这里是用注解的SessionFactory --> 36 <bean id="sessionFactory" 37 class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 38 <!-- 注入数据源 --> 39 <property name="dataSource" ref="dataSource" /> 40 <!-- 注入实体类 --> 41 <property name="annotatedClasses"> 42 <list> 43 <value>com.spring_hibernate.model.Student</value> 44 </list> 45 </property> 46 <!-- 将Hibernate的配置信息集成进来 --> 47 <property name="hibernateProperties"> 48 <props> 49 <!-- 方言:这里是Mysql --> 50 <prop key="hibernate.dialect"> 51 org.hibernate.dialect.MySQLDialect 52 </prop> 53 <!-- 是否显示sql语句 --> 54 <prop key="hibernate.show_sql">true</prop> 55 <!-- sql语句按规范显示 --> 56 <prop key="hibernate.format_sql">true</prop> 57 <!-- 自动对表的操作 --> 58 <prop key="hibernate.hbm2ddl.auto">update</prop> 59 </props> 60 </property> 61 </bean> 62 </beans>
6. StudentDao的实现类
我们建立一个StudentDao的实现类StudentDaoImpl。因为在这里要进行对数据库操作的实现,所以要用到SessionFactory,我们将SessionFactory作为StudentDaoImpl的一个私有成员。然后实现StudentDao的save方法,用Hibernate的方式进行存储。这里要用到@Repository(Dao层),@Resource(在setSessionFactory方法上用到,对SessionFactory进行注入)
1 package com.spring_hibernate.daoImpl; 2 3 import javax.annotation.Resource; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.springframework.stereotype.Repository; 8 9 import com.spring_hibernate.dao.StudentDao; 10 import com.spring_hibernate.model.Student; 11 12 @Repository 13 public class StudentDaoImpl implements StudentDao{ 14 private SessionFactory sessionFactory; 15 16 public SessionFactory getSessionFactory() { 17 return sessionFactory; 18 } 19 20 @Resource 21 public void setSessionFactory(SessionFactory sessionFactory) { 22 this.sessionFactory = sessionFactory; 23 } 24 25 @Override 26 public void save(Student student) { 27 Session session = sessionFactory.openSession(); 28 session.beginTransaction(); 29 session.save(student); 30 session.getTransaction().commit(); 31 session.close(); 32 System.out.println("saved!"); 33 } 34 }
7. StudentService类
在StudentService中,将StudentDao作为私有成员。添加get/set方法。用到@Service(Service层) @Resource(自动注入studentDao的实现类)再添加一个add方法,调用StudentDao的save方法。
1 package com.spring_hibernate.service; 2 3 import javax.annotation.Resource; 4 import org.springframework.stereotype.Service; 5 import com.spring_hibernate.dao.StudentDao; 6 import com.spring_hibernate.model.Student; 7 8 @Service 9 public class StudentService { 10 private StudentDao studentDao; 11 12 public StudentDao getStudentDao() { 13 return studentDao; 14 } 15 @Resource 16 public void setStudentDao(StudentDao studentDao) { 17 this.studentDao = studentDao; 18 } 19 20 public void add(Student student){ 21 studentDao.save(student); 22 } 23 }
8. ServiceTest类
新建一个test源目录,书写ServiceTest类。
1 package com.spring_hibernate.test; 2 import org.junit.Test; 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 import com.spring_hibernate.model.Student; 5 import com.spring_hibernate.service.StudentService; 6 7 public class ServiceTest { 8 @Test 9 public void testService(){ 10 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 11 StudentService service = (StudentService)ctx.getBean("studentService"); 12 service.add(new Student(0, "li", 20)); 13 ctx.destroy(); 14 } 15 }
如果我们用到了properties文件保存数据库连接信息,我们要在src下添加jdbc. properties。
如果我们要显示hibernate日志信息,log4j.properties也加在src目录下。
成功运行:

看一下数据库:表是自动创建的

成功添加数据!
请尊重劳动成果,转载请注明链接。
