Spring与Hibernate整合


Spring+Hibernate整合

       在进行整合前,我认为将Hibernate的配置整合到Spring的配置中,由Spring进行管理,由Hibernate进行对数据库的操作。

       后来在网上找了一些整合的方法,但是整合都失败了,因为我的Hibernate的版本是5,所以有些包被集成进其他包,在Springxml文件中配置,是找不到那个包的,而且我也不清楚Hibernate5将这个包放在哪里,或者未来还将有多少类似的事情发生,所以还是重新下载Hibernate3.3来用。

 

项目目录如下:

 

下载好了Hibernate3.3后,我们开始整合SpringHibernate

 

1.     建立一个User Library,向其中导入Hibernate需要用到的jar包。

  在这里,我们一定要注意,宁可少导包,报错后按照提示进行导包,也不要多导,否则会出问题。以下是使用Hibernate3.3需要导入的包:

 

a)     连接mysqljar包,我是为了方便直接导入了。

b)     hibernate-distribution-3.3.2.GA目录下的hibernate3.jar

这是Hibernate3.3的核心包

c)     hibernate-distribution-3.3.2.GA\lib\required目录下的6jar包全部导入。

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.     建立SpringUser 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 }
View Code

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 }
View Code

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>
View Code

6.     StudentDao的实现类

我们建立一个StudentDao的实现类StudentDaoImpl。因为在这里要进行对数据库操作的实现,所以要用到SessionFactory,我们将SessionFactory作为StudentDaoImpl的一个私有成员。然后实现StudentDaosave方法,用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 }
View Code

7.     StudentService

  StudentService中,将StudentDao作为私有成员。添加get/set方法。用到@Service(Service) @Resource(自动注入studentDao的实现类)再添加一个add方法,调用StudentDaosave方法。

 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 }
View Code

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 }
View Code

如果我们用到了properties文件保存数据库连接信息,我们要在src下添加jdbc. properties

如果我们要显示hibernate日志信息,log4j.properties也加在src目录下。

 

成功运行:

 

 

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

成功添加数据!

 

请尊重劳动成果,转载请注明链接。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM