Spring in Action 笔记(III) -- 在Spring下的Hibernate操作数据库

Spring in Action 笔记(III) -- 在Spring下的Hibernate操作数据库

Spring in Action 笔记(III)

By: icess blog: http://blog.matrix.org.cn/page/icess

这次来看看使用Spring的Hibernate模板来操作数据, Spring提供了Hibernate的一层包装,使Hibernate使用起来更加方便,尤其是结合Hibernate Annotation时, 配置文件更少,维护更加简单. 下面来看看吧.

下面是一个测试数据实体类TestData.java 和前一篇提到的实体类一样,只不过用了Annotation注释. 

package  test.orm.hibernate.model;

import  javax.persistence.Basic;
import  javax.persistence.Entity;
import  javax.persistence.Id;
import  javax.persistence.Table;


@Entity
@Table(name =  "test" ,schema =  "APP" )
public class  TestData {
   private int  id;
   private  String name;
   public  TestData( int  id, String name) {
     this .id = id;
     this .name = name;
   }
   public  TestData() {}
  
   @Id
   public int  getId() {
     return  id;
   }
   public void  setId( int  id) {
     this .id = id;
   }
   @Basic
   public  String getName() {
     return  name;
   }
   public void  setName(String name) {
     this .name = name;
   }
}

下面是测试Hibernate模板的类, TestHibernateTemplate.java

package  test.orm.hibernate;

import  java.sql.SQLException;

import  org.hibernate.HibernateException;
import  org.hibernate.Session;
import  org.springframework.orm.hibernate3.HibernateCallback;
import  org.springframework.orm.hibernate3.HibernateTemplate;

import  test.orm.hibernate.model.TestData;


public class  TestHibernateTemplate {
   private  HibernateTemplate hibernateTemplate;
  
   public  TestHibernateTemplate() {}

   public  HibernateTemplate getHibernateTemplate() {
     return  hibernateTemplate;
   }

   public void  setHibernateTemplate(HibernateTemplate hibernateTemplate) {
     this .hibernateTemplate = hibernateTemplate;
   }
  
   //测试使用HibernateTemplate来操作数据
   public  TestData getTestData( final int  id) {
     return  (TestData) hibernateTemplate.execute( new  HibernateCallback() {

       public  Object doInHibernate(Session s)  throws  HibernateException, SQLException {
         // TODO Auto-generated method stub
         return  s.get(TestData.class, id);
       }
      
     });
   }
//  上面查询数据的方法 使用了HibernateCallBack接口,对于这样简单的查询,可以使用下面由HibernateTemplate 提供的更简单的方法
   public  TestData getTestData2( final int  id) {
     return  (TestData) hibernateTemplate.get(TestData.class, id);
   }
   /* 如果上面的两处方法使用Load 方法的时, 抛出延迟加载属性异常, Spring管理Session的问题, 应该是Spring用完Session 然后就关闭了,
    * 所以不可以延迟加载, 也就不可以使用load 方法了,,????? 为什么????*/
  
   // 其他操作数据方法 如: 插入,修改.... 和使用Hibernate session 差不多, HibernateTemplate只是Session的包装
}

可以看到使用Hibernate模板来操作数据,是多么简单,

注意: 上面注释中,提到了在使用Load方法时候,会有问题, Session in view 时候使用load是不会出问题的, 这里Spring提供的方法应该是按照Hibernate的语义写的吧.

下面就是用来测试上面的类是否正常工作的测试类了.TestApp.java

package  test.orm.hibernate;

import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.ClassPathXmlApplicationContext;

import  test.jdbc.DatabaseUtils;
import  test.orm.hibernate.model.TestData;

public class  TestApp {

   /**
    *  @param  args
    */
   public static void  main(String[] args) {
     // TODO Auto-generated method stub
     DatabaseUtils dataUtils =  new  DatabaseUtils();
     dataUtils.connect();
     System.out.println( "Open database:!" );
     ApplicationContext context =  new  ClassPathXmlApplicationContext( "test/orm/hibernate/spring-hibernate.xml" );
    
     TestHibernateTemplate hibernateTemplate = (TestHibernateTemplate) context.getBean( "testDao" );
    
     System.out.println( "name : "  );
     TestData data = hibernateTemplate.getTestData( 9 );
     System.out.println( "name : "  + data.getName());
     data = hibernateTemplate.getTestData2( 3 );
     System.out.println( "name 2: "  + data.getName());
    
    
     dataUtils.disconnect();
    
   }

}

 

注意: 本测试中用到了上一篇使用到的DatabaseUtils.java 工具类来操作Derby数据库.

以上实例可以看出,在Spring中使用Hibernate,效率更高一些. 你不这样认为吗?

同时 Spring也提供了 JDO等其他一些数据操作框架的包装,使用上基本上 是一样的这里就不在详述了.

下一次我们来看看Spring的I18N处理,和自定义属性编辑器的实现.

你可能感兴趣的:(Spring in Action 笔记(III) -- 在Spring下的Hibernate操作数据库)