Spring3 + Hibernate3.6 实现简单 CRUD

本来是想拿Spring整合Hibernate4的,事实证明我道行尚浅 未遂……


看到这个异常,且在用Hibernate4的同学就要考虑Hibernate的版本问题了

(解决完这个问题发现4里边把HibernateTemplate取消掉了,所以就没再死扣)。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ' XXXXX ': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateTemplate' defined in class path resource [applicationContext-common.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;


原来弄过spring+ibatis的整合,其实道理差不多

都是spring帮忙注入,OR框架去数据库中CRUD,仅有的一点区别就是ibatis的SQL是手动的,Hibernate的HQL是自动的,所以Hibernate要实体Student用Annotation声明一下

Spring3 + Hibernate3.6 实现简单 CRUD_第1张图片





一:model

用Hibernate的方式,声明实体、表名、主键等。

工程里不再需要 hibernate.cfg.xml 了,在spring配置文件的:hibernateProperties标签里配置就行了

[java]  view plain copy
  1. @Entity//测试程序里唯一一个实体  
  2. @Table(name="t_student")//指定表名t_student  
  3. public class Student   
  4. {  
  5.     private int studentid;  
  6.     private String name;  
  7.     private int age;  
  8.       
  9.     public String toString()  
  10.     {  
  11.         return " id=>"+studentid+" name=>"+name+" age=>"+age;  
  12.     }  
  13.       
  14.     //setter&getter  
  15.     @Id//主键  
  16.     @GeneratedValue//自增长  
  17.     public int getStudentid() {  
  18.         return studentid;  
  19.     }  




二:具体service

业务调用具体service时候,就需要其中聚合的DaoImpl,通过setter靠spring注入

@Resource(name="StudentDAOImpl01")指定注入的名字

[java]  view plain copy
  1. @Component("StudentService")//组件  
  2. public class StudentService {  
  3.       
  4.     //下边的setter定义了将要注入的实例  
  5.     private IStudentDAO studentDAO;    
  6.       
  7.     public void add(Student stu) {//test调用这个add方法  
  8.         studentDAO.addStudent(stu);  
  9.     }  
  10.     public List<Student> getAll() {  
  11.         return studentDAO.selectAll();  
  12.     }  
  13.   
  14.     public void delById(int id) {  
  15.         studentDAO.delStudentById(id);  
  16.     }  
  17.       
  18.     public void updateStudent(Student stu) {  
  19.         studentDAO.updateStudent(stu);  
  20.     }  
  21.       
  22.     public List<Student> selectByName(String name) {  
  23.         return studentDAO.selectStudentByName(name);  
  24.     }  
  25.       
  26.       
  27.       
  28.     //setter&getter  
  29.     public IStudentDAO getStudentDAO() {  
  30.         return studentDAO;  
  31.     }  
  32.     @Resource(name="StudentDAOImpl01")//等StudentDAOImpl的注入  
  33.     public void setStudentDAO(IStudentDAO studentDAO) {  
  34.         this.studentDAO = studentDAO;  
  35.     }  
  36.     /*其他注入方式*/    
  37. }  





三:DaoImpl

(IDao就几个接口就不说了)

要把自己通过@Component("StudentDAOImpl01")准备好,等spring注入到上边的具体service里,靠名字识别

ibatis这里还要找到实体的配置文件,这里直接用HQL就行了,Hibernate会帮忙生成SQL语句

这用到:

hibernateTemplate.save(stu);

hibernateTemplate.delete(stu);

hibernateTemplate.update(stu);

(Student)hibernateTemplate.get(Student.class,new Integer(id)); 

hibernateTemplate.find(hql,name); 

其中find里边直接写HQL就行了,需要传参的话可以第一参数是带占位符的String,后一个传值

[java]  view plain copy
  1. @Component("StudentDAOImpl01")//会作为组件,注入到servise里  
  2. public class StudentDAOImpl implements IStudentDAO  
  3. {     
  4.     private HibernateTemplate hibernateTemplate;  
  5.     public HibernateTemplate getHibernateTemplate() {  
  6.         return hibernateTemplate;  
  7.     }  
  8.     @Resource//等待spring配置文件里配的hibernateTemplate注入  
  9.     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {  
  10.         this.hibernateTemplate = hibernateTemplate;  
  11.     }  
  12.   
  13.     //下边是HQL的具体实现  
  14.     @Override  
  15.     public void addStudent(Student stu) {//不指定id就能自动BySequence  
  16.         hibernateTemplate.save(stu);  
  17.         System.out.println("插入时返回的对象=》"+stu.getStudentid());//打印返回的值      
  18.     }  
  19.   
  20.     @Override  
  21.     public void delStudentById(int id) {  
  22.         //应该先select检查一下  
  23.         Student stu = hibernateTemplate.load(Student.class,new Integer(id));    
  24.         hibernateTemplate.delete(stu);  
  25.     }  
  26.   
  27.     @Override  
  28.     public void updateStudent(Student stu) {  
  29.         hibernateTemplate.update(stu);  
  30.     }  
  31.   
  32.     @Override  
  33.     public Student selectStudentById(int id) {  
  34.         Student stu = new Student();  
  35.         stu = (Student)hibernateTemplate.get(Student.class,new Integer(id));   
  36.         return stu;  
  37.     }  
  38.   
  39.     @Override  
  40.     public List<Student> selectStudentByName(String name) {  
  41.         String hql = "from Student t where t.name IN ?";  
  42.         List<Student> stus = new ArrayList<Student>();  
  43.         stus = (List<Student>)hibernateTemplate.find(hql,name);   
  44.         return stus;  
  45.     }  
  46.   
  47.     @Override  
  48.     public List<Student> selectAll() {  
  49.         List<Student> stus = new ArrayList<Student>();  
  50.         stus = (List<Student>)hibernateTemplate.find("from Student");  
  51.         return stus;  
  52.     }  
  53.   
  54.       
  55. }  



四:spring的配置文件

1.JDBC配置

2.sessionFactory ,这里边要配上Hibernate.cfg.xml的内容

3.hibernateTemplate

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:tx="http://www.springframework.org/schema/tx"  
  4.        xmlns:aop="http://www.springframework.org/schema/aop"  
  5.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.        xmlns:context="http://www.springframework.org/schema/context"  
  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/tx   
  10.             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  11.             http://www.springframework.org/schema/aop   
  12.             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  13.             http://www.springframework.org/schema/context  
  14.             http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  15.   
  16.     <context:annotation-config />  
  17.     <context:component-scan base-package="com.rt" />  
  18.     
  19.     
  20.   <!-- 1.JDBC配置:dataSource -->  
  21.     <bean  
  22.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  23.         <property name="locations">  
  24.             <value>classpath:jdbc.properties</value>  
  25.         </property>  
  26.     </bean>  
  27.     <bean id="dataSource" destroy-method="close"  
  28.         class="org.apache.commons.dbcp.BasicDataSource">  
  29.         <property name="driverClassName"  
  30.             value="${jdbc.driverClassName}" />  
  31.         <property name="url" value="${jdbc.url}" />  
  32.         <property name="username" value="${jdbc.username}" />  
  33.         <property name="password" value="${jdbc.password}" />  
  34.     </bean>  
  35.   
  36. <!-- 2.sessionFactory -->  
  37.     <bean id="sessionFactory"  
  38.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  39.         <!-- hibernate具体配置,分项写在下边 -->  
  40.         <property name="hibernateProperties">  
  41.             <props>  
  42.                 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>  
  43.                 <prop key="hibernate.show_sql">true</prop>  
  44.                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
  45.             </props>  
  46.         </property>  
  47.         <!-- 注入dataSource对象 -->  
  48.         <property name="dataSource" ref="dataSource" />  
  49.   
  50.         <!-- 搜索带Annotation的实体 -->  
  51.         <property name="packagesToScan">  
  52.             <list>  
  53.                 <value>com.rt.sidemo.model</value>  
  54.                 <!--<value>com.rt.sidemo....</value> -->  
  55.             </list>  
  56.         </property>  
  57.   
  58.     </bean>  
  59. <!-- Template -->  
  60.     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  
  61.         <property name="sessionFactory" ref="sessionFactory"></property>  
  62.     </bean>  
  63.   
  64.    
  65.   
  66. </beans>  

JDBC的配置

[html]  view plain copy
  1. jdbc.driverClassName=oracle.jdbc.driver.OracleDriver  
  2. jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL  
  3. jdbc.username=scott  
  4. jdbc.password=890307  





五:test

[java]  view plain copy
  1. public class StudentServiceTest   
  2. {  
  3.     @Test  
  4.     public void testAdd() throws Exception {  
  5.           
  6.         //Spring读取spring配置信息  
  7.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");  
  8.         //相当于从代理类得到具体实例,由xml决定怎么选择类实例化    
  9.         StudentService service01 = (StudentService)ctx.getBean("StudentService");  
  10.               
  11.         Student stu = new Student();//手动组装User实例 u  
  12.         //stu.setStudentid(???); 用自动增长序列  
  13.         stu.setName("Spring+Hibernate");  
  14.         stu.setAge(777);  
  15.         service01.add(stu);//把组装好的u传给xml实例化的service  
  16.               
  17.         ctx.destroy();  
  18.     }  
  19.       
  20.     @Test  
  21.     public void testDelById() throws Exception {      
  22.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");  
  23.         StudentService service01 = (StudentService)ctx.getBean("StudentService");  
  24.               
  25.         service01.delById(23);//只需要把id传给实例化的service  
  26.           
  27.         ctx.destroy();  
  28.     }  
  29.       
  30.     @Test  
  31.     public void testGetAll() throws Exception {   
  32.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");  
  33.         StudentService service01 = (StudentService)ctx.getBean("StudentService");  
  34.               
  35.         System.out.println("查询全部:");  
  36.         List<Student> stusAll = (List<Student>)service01.getAll();  
  37.         for(int i=0;i<stusAll.size();i++)  
  38.         {  
  39.             System.out.println(stusAll.get(i));  
  40.         }  
  41.         ctx.destroy();  
  42.     }  
  43.       
  44.     @Test  
  45.     public void testUpdateStudent() throws Exception {  
  46.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");     
  47.         StudentService service01 = (StudentService)ctx.getBean("StudentService");  
  48.               
  49.         Student stu = new Student();//手动组装User实例 u  
  50.         stu.setStudentid(25);  
  51.         stu.setName("SH");  
  52.         stu.setAge(777);  
  53.         service01.updateStudent(stu);//把组装好的u传给spring实例化的service  
  54.               
  55.         ctx.destroy();  
  56.     }  
  57.       
  58.     @Test  
  59.     public void testSelectByName() throws Exception {     
  60.         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-common.xml");  
  61.         StudentService service01 = (StudentService)ctx.getBean("StudentService");  
  62.               
  63.         System.out.println("查询全部:");  
  64.         String name = "SH";  
  65.         List<Student> stusAll = (List<Student>)service01.selectByName(name);  
  66.         for(int i=0;i<stusAll.size();i++)  
  67.         {  
  68.             System.out.println(stusAll.get(i));  
  69.         }  
  70.         ctx.destroy();  
  71.     }  
  72.       
  73. }  

你可能感兴趣的:(Spring3 + Hibernate3.6 实现简单 CRUD)