国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使用ORM工具進(jìn)行數(shù)據(jù)訪問(wèn)

2019-11-18 11:55:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  簡(jiǎn)介
  SPRing在資源治理,DAO實(shí)現(xiàn)支持以及實(shí)物策略等方面提供了與Hibernate, JDO和iBATIS SQL映射的集成。 對(duì)Hibernate,Spring使用了很多IoC的方便的特性提供了一流的支持,幫助你處理很多典型的Hibernate整合的問(wèn)題。所有的這些都遵守Spring通用的事務(wù)和DAO異常體系。
  
  當(dāng)您選擇使用O/R映射來(lái)創(chuàng)建數(shù)據(jù)訪問(wèn)應(yīng)用程序的時(shí)候,Spring的增加部分就會(huì)向您提供重要的支持。首先你應(yīng)該了解的是,一旦你使用了Spring對(duì)O/R映射的支持,你不需要親自作所有的事情。在決定花費(fèi)力氣,冒著風(fēng)險(xiǎn)建造類似的內(nèi)部底層結(jié)構(gòu)之前,我們都建議您考慮和利用Spring的解決方案。不管你使用的是何種技術(shù),大部分的O/R映射支持都可以以library樣式被使用,因?yàn)樗械臇|西都是被設(shè)計(jì)成一組可重復(fù)利用的javaBeans。在applicationContext和BeanFactory中使用更是提供了配置和部署簡(jiǎn)單的好處,因此,這一章里的大多數(shù)例子都是在ApplicationContext中配置。
  
  使用Spring構(gòu)建你的ORM應(yīng)用的好處包括:
  l 避免綁定非凡的技術(shù),答應(yīng)mix-and-match的實(shí)現(xiàn)策略。雖然Hibernate非常強(qiáng)大,靈活,開(kāi)源而且免費(fèi),但它還是使用了自己的特定的API。此外有人也許會(huì)爭(zhēng)辯:iBatis更輕便而且在不需要復(fù)雜的O/R映射策略的應(yīng)用中使用也很優(yōu)秀。能夠選擇的話,使用標(biāo)準(zhǔn)或抽象的API來(lái)實(shí)現(xiàn)主要的應(yīng)用需求,通常是更好的。尤其,當(dāng)你可能會(huì)因?yàn)楣δ埽阅芑蚱渌矫娴脑蚨枰袚Q到另一個(gè)實(shí)現(xiàn)的時(shí)候。舉例來(lái)說(shuō),Spring對(duì)Hibernate事務(wù)和異常的抽象,以及能夠讓你輕松交換mapper和DAO對(duì)象(實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)功能)的IoC機(jī)制,這兩個(gè)特性可以讓你在不犧牲Hibernate性能的情況下,在你的應(yīng)用程序中隔離Hibernate的相關(guān)代碼。處理DAO的高層次的service代碼不需要知道DAO的具體實(shí)現(xiàn)。這個(gè)方法可以很輕易使用mix-and-match方案互不干擾地實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)層(比如在一些地方用Hibernate,一些地方使用JDBC,其他地方使用iBatis),mix-and-match有利于處理遺留下來(lái)的代碼以及利用各種技術(shù)(JDBC,Hibernate,iBatis)的優(yōu)點(diǎn)。
  
  測(cè)試簡(jiǎn)單
  Spring的IoC使得很輕易替換掉不同的實(shí)現(xiàn),Hibernate sessionFacotory的位置,datasource, 事務(wù)治理, 映射對(duì)象的實(shí)現(xiàn)。這樣就很輕易隔離測(cè)試持久化相關(guān)代碼的各個(gè)部分。
  l 普通的資源治理。Spring的application context能夠處理諸如Hibernate 的SessionFactory, JDBC的datasource,iBatis的SQLMaps配置對(duì)象以及其他相關(guān)資源的定位和配置。這使得這些配置的值很輕易被治理和修改。Spring提供了有效,簡(jiǎn)單和安全的Hibernate Session處理。一般的使用Hibernate的代碼則需要使用同一個(gè)Hibernate Session對(duì)象以確保有效和恰當(dāng)?shù)厥聞?wù)處理。而Spring讓我們可以很輕易透明地創(chuàng)建和綁定一個(gè)session到當(dāng)前線程;你可以使用以下兩種辦法之一:聲明式的AOP方法攔截器,或通過(guò)使用一個(gè)外部的template包裝類在Java代碼層次實(shí)現(xiàn)。這樣,Spring就解決了在很多Hibernate論壇上出現(xiàn)的使用問(wèn)題。
  
  異常包裝
  Spring能夠包裝Hibernate異常,把它們從專有的,checked exception變?yōu)橐唤M抽象的runtime exception。這樣你就可以僅僅在恰當(dāng)?shù)膶犹幚泶蟛糠值牟豢苫謴?fù)的異常,使你避免了很多討厭的catch/throw以及異常聲明。你還是可以在你需要的地方捕捉和處理異常。回想一下JDBC異常(包括與DB相關(guān)的方言)被轉(zhuǎn)變?yōu)橥瑯拥漠惓sw系,這就意味著你可以在一致的編程模型中處理JDBC操作。
  l 綜合的事務(wù)治理。Spring答應(yīng)你包裝你的ORM代碼,通過(guò)使用聲明式的AOP方法攔截器或者在代碼級(jí)別使用外部的template包裝類。不管使用哪一種,事務(wù)相關(guān)的語(yǔ)義都會(huì)為你處理,萬(wàn)一有異常發(fā)生也會(huì)幫你做適當(dāng)?shù)氖聞?wù)操作(比如rollback)。就象我們下面要討論的一樣,你能夠使用和替換各種transaction managers,卻不會(huì)使你的Hibernate相關(guān)的代碼受到影響。更好的是,JDBC相關(guān)的代碼可以完全和Hibernate代碼integrate transactionaly。這對(duì)于處理那些沒(méi)有用Hibernate或iBatis實(shí)現(xiàn)的功能非常有用。
  
  1.2.Hibernate
  1.2.1.資源治理
  典型的應(yīng)用經(jīng)常會(huì)被重復(fù)的資源治理代碼搞胡亂。很多項(xiàng)目嘗試創(chuàng)造自己的方案解決這個(gè)問(wèn)題,有時(shí)會(huì)為了編程方便犧牲適當(dāng)?shù)墓收咸幚怼?duì)于恰當(dāng)?shù)馁Y源處理Spring提倡令人矚目的簡(jiǎn)單的解決方案:使用templating的IoC,比如基礎(chǔ)的class和回調(diào)接口,或者提供AOP攔截器。基礎(chǔ)的類負(fù)責(zé)固定的資源處理,以及將特定的異常轉(zhuǎn)換為unchecked異常體系。Spring引進(jìn)了DAO異常體系,可適用于任何數(shù)據(jù)訪問(wèn)策略。
  對(duì)于直接使用JDBC的情況,前面章節(jié)提到的JdbcTemplate類負(fù)責(zé)處理connection,正確地把SQLExeption變?yōu)镈ataaccessException體系(包括將與數(shù)據(jù)庫(kù)相關(guān)的SQL錯(cuò)誤代碼變成有意義的異常類)。它同時(shí)支持JTA和JDBC事務(wù),通過(guò)它們各自的Spring transaction managers。
  Spring同樣也提供了對(duì)Hibernate和JDO的支持:一個(gè)HibernateTemplate/JdoTemplate類似于JdbcTemplate,HibernateInterceptor/JdoInterceptor,以及一個(gè)Hibernate/JDO transaction manager。主要的目的是:能夠清楚地劃分應(yīng)用層次而不管使用何種數(shù)據(jù)訪問(wèn)和事務(wù)技術(shù);使應(yīng)用對(duì)象之間的耦合松散。業(yè)務(wù)對(duì)象(BO)不再依靠于數(shù)據(jù)訪問(wèn)和事務(wù)策略;不再有硬編碼的資源lookup;不再有難于替換的singletons;不再有自定義的服務(wù)注冊(cè)。一個(gè)簡(jiǎn)單且堅(jiān)固的方案連接了應(yīng)用對(duì)象,并且使它們可重用盡可能地不依靠容器。雖然所有的數(shù)據(jù)訪問(wèn)技術(shù)都能獨(dú)立使用,但是與Spring application context結(jié)合更好一些,它提供了基于xml的配置和普通的與Spring 無(wú)關(guān)的JavaBean實(shí)例。在典型的Spring app中,很多重要的對(duì)象都是JavaBeans:數(shù)據(jù)訪問(wèn)template,數(shù)據(jù)訪問(wèn)對(duì)象(使用template),transaction managers, 業(yè)務(wù)對(duì)象(使用數(shù)據(jù)訪問(wèn)對(duì)象和transaction managers),web view resolvers, web controller(使用業(yè)務(wù)對(duì)象)等等。
  
  1.2.2.在application context中定義資源
  為了避免將應(yīng)用對(duì)象貼緊硬編碼的資源lookup,Spring答應(yīng)你像定義普通bean一樣在application context中定義諸如JDBC DataSource,Hibernate SessionFactory的資源。需要訪問(wèn)這些資源的應(yīng)用對(duì)象只需要持有這些預(yù)定義實(shí)例的引用。下面的代碼演示如何創(chuàng)建一個(gè)JDBC DataSource和Hibernate SessionFactory:
  <beans>
  <bean id="myDataSource"
  class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName">
  <value>java:comp/env/jdbc/myds</value>
  </property>
  </bean>
  <bean id="mySessionFactory"
  class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="mappingResources">
  <list>
  <value>prodUCt.hbm.xml</value>
  </list>
  </property>
  <property name="hibernateProperties">
  <props>
  <prop key="hibernate.dialect">
  net.sf.hibernate.dialect.MySQLDialect
  </prop>
  </props>
  </property>
  <property name="dataSource">
  <ref bean="myDataSource"/>
  </property>
  </bean>
  ……
  </beans>
  你可以將一個(gè)JNDI定位的DataSource換為一個(gè)本地定義的如DBCP的BasicDataSource,如下面的代碼:
  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName">
  <value>org.hsqldb.jdbcDriver</value>
  </property>
  <property name="url">
  <value>jdbc:hsqldb:hsql://localhost:9001</value>
  </property>
  <property name="username">
  <value>sa</value>
  </property>
  <property name="passWord">
  <value></value>
  </property>
  </bean>
  
  當(dāng)然你也可以把本地的SessionFactory換為JNDI定位的,但是假如不是在EJB上下文中,這是不需要的。(查看“容器資源 vs 本地資源”一節(jié))
  
  1.2.3.反轉(zhuǎn)控制:Template和Callback
  對(duì)于可以成為定制的數(shù)據(jù)訪問(wèn)對(duì)象或業(yè)務(wù)對(duì)象的方法來(lái)說(shuō),基本的模板編程模型看起來(lái)像下面所示的代碼那樣。對(duì)于外部對(duì)象沒(méi)有任何實(shí)現(xiàn)特定接口的要求,它只需要提供一個(gè)Hibernate的SessionFacotry。它可以從任何地方得到,比較適宜的方法是作為從Spring 的application context中得到的bean引用:通過(guò)簡(jiǎn)單的setSessionFactory這個(gè)bean屬性setter。下面的代碼顯示了在application context中一個(gè)DAO的定義,它引用了上面定義的SessionFactory,同時(shí)展示了一個(gè)DAO方法的具體實(shí)現(xiàn)。
  <beans>
  <bean id=”myProductDao” class=”product.ProductDaoImpl”>
  <property name=”sessionFactory”>
  <ref bean=”mySessionFactory”/>
  </property>
  </bean>
  ….
  </beans>
  
  public class ProductDaoImpl implements productDao{
  private SessionFactory sessionFactory;
  public void setSessionFactory(SessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
  }
  public List loadProductsByCategory(final String category) {
  HibernateTemplate hibernateTemplate =
  new HibernateTemplate(this.sessionFactory);
  return (List) hibernateTemplate.execute(
  new Hi

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛学| 沂南县| 东台市| 诸暨市| 宁陵县| 长岭县| 江源县| 定边县| 新巴尔虎右旗| 万安县| 金坛市| 珲春市| 张家界市| 康定县| 湛江市| 丹江口市| 普定县| 南京市| 甘南县| 彭山县| 淄博市| 乌鲁木齐市| 罗平县| 三都| 谷城县| 深州市| 清镇市| 云龙县| 周至县| 陆良县| 蕉岭县| 桂东县| 凤阳县| 灵石县| 和林格尔县| 湖州市| 宜州市| 买车| 哈尔滨市| 日土县| 得荣县|