Ryan's Java world!

          something about Java and opensource!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            51 Posts :: 25 Stories :: 59 Comments :: 0 Trackbacks

          ?

          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處理,和自定義屬性編輯器的實現.

          posted on 2006-05-27 11:01 冰雨 閱讀(1906) 評論(0)  編輯  收藏 所屬分類: Spring

          JSF中文技術文摘
          主站蜘蛛池模板: 鄂温| 瑞丽市| 当涂县| 亚东县| 汉源县| 稷山县| 阳江市| 巫山县| 高邑县| 湟源县| 江口县| 遂川县| 芜湖县| 皋兰县| 蒲江县| 九台市| 阿勒泰市| 屯昌县| 石景山区| 湘潭市| 横山县| 景德镇市| 泸定县| 东乡族自治县| 双江| 大埔县| 喀什市| 怀柔区| 白山市| 遂川县| 南安市| 梁山县| 罗平县| 石阡县| 常宁市| 阜南县| 穆棱市| 淮滨县| 饶河县| 吴桥县| 临泽县|