2012-07-05 38 views
1
  1. 我在Oracle11 DataBase的表格中有兩列(KEY(varchar2),PROPERTY(varchar2))。
  2. 通過使用Spring框架我想從表中將所有內容(所有行)加載到Spring Bean,這樣我就可以使用Bean,而不是從DataBase中獲取值。
  3. 我使用Bean類「org.apache.commons.configuration.DatabaseConfiguration」。它工作正常,但這個bean類沒有提供將整個表格內容加載到其中的規定。

PFB,我的春節-config.xml中:在服務器運行中從Oracle DB加載到Spring Bean的表格內容

<bean name="propertyPlaceholderConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="properties" ref="commonsConfigurationFactoryBean"/> 
     </bean> 

<bean name="commonsConfigurationFactoryBean" 
    class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean"> 
<constructor-arg ref="databaseConfiguration"/> 
</bean> 

<bean name="databaseConfiguration" 
      class="org.apache.commons.configuration.DatabaseConfiguration"> 
     <constructor-arg type="javax.sql.DataSource" ref="dataSource"/> 
     <constructor-arg type="java.lang.String" index="1" value="schema.Table_Name1"/> 
     <constructor-arg type="java.lang.String" index="2" value="KEY"/> 
     <constructor-arg type="java.lang.String" index="3" value="PROPERTY"/> 
</bean> 

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="url" value="jdbc:oracle:thin:SYSTEM_NS:PORT:sid"/> 
     <property name="username" value="xxxx"/> 
     <property name="password" value="xxxx"/> 
    </bean> 

Java代碼:

ApplicationContext classpathCtx = new ClassPathXmlApplicationContext("Spring-config.xml"); 
DatabaseConfiguration dBConfig = (DatabaseConfiguration)classpathCtx.getBean("databaseConfiguration"); 

// To display the value in the property column by sending the value of column KEY 
System.out.println(dBConfig.getProperty("Value in the KEY column")); 

上面的代碼工作正常。但每次我將密鑰發送到DatabaseConfiguration時,它都會在內部調用數據庫以獲取我不想發生的屬性。

整個上述概念都是關於試圖將.properties中存在的所有數據存儲到數據庫並將其從數據庫中提取到我的Java代碼。

回答

1

您可以通過讀取databaseConfiguration中的所有鍵並將其複製到創建的屬性對象來創建一個FactoryBean,該FactoryBean創建一個屬性對象。

這個屬性對象然後是一個單例,並且可以在你的spring配置中使用。

<bean name="properties" class="...ConfigurationPropertiesFactoryBean"> 
    <property name="configuration" ref="databaseConfiguration"/> 
</bean> 

public class ConfigurationPropertiesFactoryBean implements FactoryBean<Properties> 
{ 
    private Properties props = new Properties(); 
    public void setConfiguration(Configuration configuration) 
    { 
    props.put ... 
    } 
    public Properties getObject() 
    { 
     return props; 
    } 
} 

或者代替DatabaseConfiguration的,你可以使用的JdbcTemplate:

<bean name="properties" class="...DataSourcePropertiesFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

public class DataSourcePropertiesFactoryBean implements FactoryBean<Properties> 
{ 
    private Properties props = new Properties(); 
    public void setDataSource(DataSource dataSource) 
    { 
    props = new JdbcTemplate(dataSource).query("SELECT KEY, PROPERTY FROM ...", 
     new ResultSetExtractor(){ 
     public void Properties extractData(ResultSet rs) 
     { 
      props.put(...); 
     } 
    }); 
    } 
    public Properties getObject() 
    { 
     return props; 
    } 
} 
+0

是的,我確實接受了創造你引導的方式單obj的,但你所賜給的「代碼的「,我們指的是databaseConfigurationBean,它沒有提供加載所有行,即所有的鍵值對的dB ...讓我們說我們有100個鍵 - 值中的dB值。然後加載所有的行必須進行100分貝的通話。我的觀點是要用Spring來調用一個單獨的dB調用中的所有行。 – user1096098 2012-07-06 21:26:18

+0

添加了第二種替代方法,使用JdbcTemplate爲單個SQL查詢一次獲取所有鍵值對。 – greyfairer 2012-07-08 14:12:32

相關問題