摘要:   閱讀全文
          posted @ 2009-06-11 21:05 旭日 閱讀(977) | 評論 (0)編輯 收藏
           



          組合:Spring+Hibernate+struts+java+jsp
          要求功能:比如又A,B,C三個數據庫,需要查詢A,B數據庫的某個數據,然后將此查詢到的數據存入C中。
          求問:此功能如何實現呢?
                      小弟急要,謝謝。

          posted @ 2009-06-06 12:21 旭日 閱讀(338) | 評論 (1)編輯 收藏
           
          Spring2.0.1以后的版本已經支持配置多數據源,并且可以在運行的時候動態加載不同的數據源。通過繼承AbstractRoutingDataSource就可以實現多數據源的動態轉換。目前做的項目就是需要訪問12個數據源,每個數據源的表結構都是相同的,所以要求數據源的變動對于編碼人員來說是透明,也就是說同樣SQL語句在不同的環境下操作的數據庫是不一樣的。具體的配置如下: 
          一、首先需要寫一個靜態的鍵值對照類: 


          代碼 
          package cn.com.xinli.ccp.dynamicds; 

          public class DataSourceMap 
          public static final String Admin="Admin"
          public static final String Yxh = "Yxh"
          }
           

           

          這個類主要在使用的時候當作獲得數據源的標志使用。 
          二、建立一個獲得和設置上下文的類: 


          代碼 
          package cn.com.xinli.ccp.dynamicds; 

          public class CustomerContextHolder 
          private static final ThreadLocal contextHolder = 
          new ThreadLocal(); 

          public static void setCustomerType(String customerType) 
          contextHolder.set(customerType); 
          }
           

          public static String getCustomerType() 
          return (String) contextHolder.get(); 
          }
           

          public static void clearCustomerType() 
          contextHolder.remove(); 
          }
           

          }
           

          這個主要負責設置上下文環境和獲得上下文環境。 
          三、建立動態數據源類,這個類必須繼承AbstractRoutingDataSource: 

          代碼 
          package cn.com.xinli.ccp.dynamicds; 

          import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

          public class DynamicDataSource extends AbstractRoutingDataSource 

          protected Object determineCurrentLookupKey() 
          // TODO Auto-generated method stub 
          return CustomerContextHolder.getCustomerType(); 
          }
           

          }
           

          這個類實現了determineCurrentLookupKey方法,該方法返回一個Object,一般是返回字符串,也可以是枚舉類型。該方法中直接使用了CustomerContextHolder.getCustomerType()方法獲得上下文環境并直接返回。
           
          四、編寫spring的配置文件配置數據源 

          代碼 
          <bean id="parentDataSource" 
          class
          ="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
          <property name="driverClassName"> 
          <value>COM.ibm.db2.jdbc.net.DB2Driver</value> 
          </property> 
          <property name="url"> 
          <value>jdbc:db2:127.0.0.1:TEST</value> 
          </property> 
          </bean> 

          <bean id="adminDataSource" parent="parentDataSource"> 
          <property name="username" value="admin"/> 
          <property name="password" value="master997mb"/> 
          </bean> 

          <bean id="yxhDataSource" parent="parentDataSource"> 
          <property name="username" value="yxh"/> 
          <property name="password" value="yxh"/> 
          </bean> 

          在這個配置中可以看到首先有個parentDataSource,這個主要配置一些數據源的公用信息,項目中都是鏈接DB2數據庫;adminDataSource和yxhDataSource是根據不同需要配置的個性化信息,但都必須加parent屬性,值為parentDataSource。這樣就配置好了2個數據源信息。當然如果鏈接的多數據源是不同類型的兩個數據庫,那么parentDataSource就可以不要了,直接配置兩個不同的數據源鏈接就可以了。 
          五、編寫spring配置文件配置多數據源映射關系 

          代碼 
          <bean id="dataSource" class="cn.com.xinli.ccp.dynamicds.DynamicDataSource"> 
          <property name="targetDataSources"> 
          <map key-type="java.lang.String"> 
          <entry key="Yxh" value-ref="yxhDataSource"/> 
          </map> 
          </property> 
          <property name="defaultTargetDataSource" ref="adminDataSource"/> 
          </bean> 

          在這個配置中第一個property屬性配置目標數據源,
          <map key-type="java.lang.String">中的key-type必須要和靜態鍵值對照類DataSourceMap中的值的類型相同;<entry key="Yxh" value-ref="yxhDataSource"/>中key的值必須要和靜態鍵值對照類中的值相同,如果有多個值,可以配置多個<entry>標簽。第二個property屬性配置默認的數據源。 
          六、配置hibernate。 
          Hibernate的配置和普通的hibernate、spring結合的配置一樣 

          代碼 
          <bean id="sessionFactory" 
          class
          ="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
          <!-- to override, use the "SpringDatasourceConfig" snippet in your project --> 
          <property name="dataSource"> 
          <ref local="dataSource" /> 
          </property> 
          <property name="mappingResources"> 
          <list> 
          <value> 
          cn/com/xinli/ccp/entity/User.hbm.xml 
          </value> 
          <value> 
          cn/com/xinli/ccp/entity/Test.hbm.xml 
          </value> 
          </list> 
          </property> 
          <property name="hibernateProperties"> 
          <props> 
          <prop key="hibernate.dialect"> 
          org.hibernate.dialect.DB2Dialect 
          </prop> 

          <prop key="hibernate.show_sql">true</prop> 
          <prop key="hibernate.use_outer_join">true</prop> 
          <prop key="hibernate.jdbc.batch_size">50</prop> 
          <prop key="hibernate.jdbc.fetch_size">5</prop> 
          <prop key="hibernate.connection.pool_size">2</prop> 
          <prop key="hibernate.connection.autocommit">false</prop> 
          <prop key="hibernate.cache.use_query_cache">false</prop> 
          <prop key="hibernate.max_fetch_depth">1</prop> 
          <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop> 
          </props> 
          </property> 
          </bean> 

          <bean id="mydao" class="cn.com.xinli.ccp.dao.HibernateBaseDao"> 
          <property name="sessionFactory"> 
          <ref local="sessionFactory" /> 
          </property> 
          </bean> 

          關于dao的代碼這里就省略了。 
          七、配置結束,可以使用了。 
          代碼 
          public class DaoTest extends TestCase 

          public void testSave() throws Exception
          CustomerContextHolder.setCustomerType(DataSourceMap.Admin);
          //設置數據源 
          //hibernate創建實體 
          Test test = new Test(); 
          test.setTest(
          "22222222"); 

          mydao.save(test);
          //使用dao保存實體 

          CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);
          //設置為另一個數據源 

          mydao.save(test);
          //使用dao保存實體到另一個庫中 

          }
           
          }
           
          在項目中對于編碼人員對多數據源的切換可以做成透明的,操作同樣的dao,就可以訪問不同的數據庫了


          posted @ 2009-05-30 21:36 旭日 閱讀(427) | 評論 (1)編輯 收藏
           
               摘要: 多數 java 程序員都非常清楚使用 jar 文件將組成 java 解決方案的各種資源(即 .class 文件、聲音和圖像)打包的優點。剛開始使用 jar 文件的人常問的一個問題是:“如何從 jar 文件中提取圖像呢?”本文將回答這個問題,并會提供一個類,...  閱讀全文
          posted @ 2009-05-30 21:27 旭日 閱讀(245) | 評論 (2)編輯 收藏
           
          今天整合SSH,出現了這個問題Context initialization failed,很是郁悶。

          ERROR [org.springframework.web.struts.ContextLoaderPlugIn] - Context initialization failed
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
          'headsService' defined in ServletContext resource [/WEB-INF/classes/applicationContext-heads.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'hDao' of bean class [com.forestryInfo.biz.impl.HeadsBizImpl]: No property 'hDao' found
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
          478)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$
          1.run(AbstractAutowireCapableBeanFactory.java:409)
           at java.security.AccessController.doPrivileged(Native Method)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:
          380)
           at org.springframework.beans.factory.support.AbstractBeanFactory$
          1.getObject(AbstractBeanFactory.java:264)
           at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:
          220)
           at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:
          261)
           at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
          185)
           at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:
          164)
           at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:
          429)
           at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:
          729)
           at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:
          381)
           at org.springframework.web.struts.ContextLoaderPlugIn.createWebApplicationContext(ContextLoaderPlugIn.java:
          354)
           at org.springframework.web.struts.ContextLoaderPlugIn.initWebApplicationContext(ContextLoaderPlugIn.java:
          295)
           at org.springframework.web.struts.ContextLoaderPlugIn.init(ContextLoaderPlugIn.java:
          225)
           at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:
          869)
           at org.apache.struts.action.ActionServlet.init(ActionServlet.java:
          336)
           at javax.servlet.GenericServlet.init(GenericServlet.java:
          212)
           at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:
          1139)
           at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:
          966)
           at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:
          3956)
           at org.apache.catalina.core.StandardContext.start(StandardContext.java:
          4230)
           at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:
          1116)
           at org.apache.catalina.startup.HostConfig.check(HostConfig.java:
          1214)
           at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:
          293)
           at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:
          120)
           at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:
          1306)
           at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
          1570)
           at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:
          1579)
           at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:
          1559)
           at java.lang.Thread.run(Thread.java:
          619)
          Caused by: org.springframework.beans.InvalidPropertyException: Invalid property 
          'hDao' of bean class [com.forestryInfo.biz.impl.HeadsBizImpl]: No property 'hDao' found
           at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:
          382)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:
          1287)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:
          1248)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:
          1008)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
          470


          這里主要提示:
          Error creating bean with name 'headsService' defined in ServletContext resource [/WEB-INF/classes/applicationContext-heads.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'hDao' of bean class 



          我找了好久錯誤的原因,但都沒有找到。
          后面,我干脆講“hDao”改為“dao”,整個程序就能運行起來了。
          很是無奈,想了好久還是想不明白。
          posted @ 2009-05-29 16:50 旭日 閱讀(6521) | 評論 (2)編輯 收藏
           
          public class ploytest {

          public static void main(String[] args) {
          A a = new A();
          B b = new B();
          a.s = "[AA]";
          b.s = "[BB]";
          a = b;
          System.out.println(a.s);
          System.out.println(b.s);
          System.out.println(a.getS());
          System.out.println(b.getS());
          System.out.println("====================");
          ((A)b).s = "[AA]";
          System.out.println(a.s);
          System.out.println(b.s);
          System.out.println(a.getS());
          System.out.println(b.getS());
          }
          }

          class A {
          String s = "[A]";
          String getS() {
          return s;
          }
          }

          class B extends A{
          String s = "";
          String getS() {
          return s;
          }
          }
          The results:
          [A]
          [BB]
          [BB]
          [BB]
          ====================
          [AA]
          [BB]
          [BB]
          [BB]
          其實結果不重要。一運行就知道。主要是原理。
          將子類對象賦值給父類對象,所得到對象是這樣的一個對象:
          它是一個編譯是為父類對象,但運行卻是一個子類對象,具體特征如下.
          1.被聲明為父類對象
          2.擁有父類屬性
          3.占用子類的內存空間
          4.子類方法覆蓋父類的方法時,此時對象調用的是子類的方法;否則,自動調用繼承父類的方法.
          5.我人認為這個對象既不是父類對象,也不是子類對象.當我們用到它的方法時,
          我便把它看成子類對象;若用到它的屬性時,我把它看成父類對象.
          它是一個占用父類屬性,而使用子類方法的對象.至于到底是什么對象,我認為還是得根據聲明來,它應算是父類對象,但擁有子類方法.
          這就是為什么第一個a.s為[A]的道理了。
          (A)b是向上轉型。(A)b.s相當于把"[AA]"賦值給b的父類對象。所以由上面可以看出。a.s為[AA]而其他的都同上
           
          System.out.println(a.getS()); System.out.println(b.getS()); 再看這條語句: a.s = "[AA]"; //這是給對象a中s賦值,跟上轉型.s一點關系都沒有,不要被弄混,緊記這里面有3個對象,你就會明白的
           
          看了前幾個留言怎么也沒看出來為什么"第一個a.s為[A]的道理". 依我看,這題有三個對象,希望提問者不要弄混. 這三個對象分別是a,b,b的上轉型對象, a = b; //自這條語句以下,a便不是a對象,而是b的上轉型對象 System.out.println(a.s); System.out.println(b.s);
          關鍵還是a = b; 這句話,其相當于a =(A) b; 所以第一句打印的是[A] 而非[AA]
          posted @ 2009-04-24 15:55 旭日 閱讀(559) | 評論 (0)編輯 收藏
          僅列出標題
          共2頁: 上一頁 1 2 
           
          主站蜘蛛池模板: 淮南市| 疏附县| 霍山县| 任丘市| 喀什市| 徐汇区| 大关县| 汪清县| 岑溪市| 荃湾区| 乌拉特后旗| 固镇县| 宿松县| 光山县| 湘阴县| 邵阳市| 文山县| 巧家县| 叙永县| 兖州市| 沈丘县| 平阴县| 奉贤区| 兴城市| 河西区| 延安市| 平远县| 虹口区| 香格里拉县| 保山市| 临海市| 澄江县| 金坛市| 长沙市| 铜川市| 怀宁县| 濮阳市| 蒙自县| 丰原市| 岐山县| 永济市|