2010-04-15 61 views
3

選擇環境我有ibatis-config.xmliBatis的 - 使用XML

<configuration> 
    <properties resource="collector.properties"/> 
    <environments default="development"> 
     <environment id="development"> 
      <transactionManager type="JDBC" /> 
      <dataSource type="POOLED"> 
       <property name="driver" value="${dev.jdbc.driver}" /> 
       <property name="url" value="${dev.jdbc.url}" /> 
      </dataSource> 
     </environment> 
     <environment id="test"> 
      <transactionManager type="JDBC" /> 
      <dataSource type="POOLED"> 
       <property name="driver" value="${test.jdbc.driver}" /> 
       <property name="url" value="${test.jdbc.url}" /> 
      </dataSource> 
     </environment> 
    </environments> 
    <mappers> 
    </mappers> 
</configuration> 

這種配置如圖它將從<environment id="development">

問題加載數據源:在運行時開關是否有可能使用<environment id="test">無需修改XML?例如 - 我有一個測試文件,我正在使用SqlSessionFactory,並且想以編程方式將其設置爲使用測試環境?

+0

理想情況下,您應該使用構建工具和項目結構,以便這不是問題。我推薦maven,一開始可能會有點混亂和不可思議,但是當你過去時,它會節省大量時間並實施一些好的做法。 – nash 2011-12-08 22:18:13

回答

7

SqlSessionFactoryBuilder.build()方法可以選擇XML中的特定環境。

例如,

private Reader reader; 
private SqlSessionFactory sqlSessionFactorys; 
private SqlSession session; 

reader = Resources.getResourceAsReader("ibatis-config.xml"); 

sqlSessionFactorys = new SqlSessionFactoryBuilder().build(reader, "test"); 
testSession = sqlSessionFactorys.openSession(); // test env 

sqlSessionFactorys = new SqlSessionFactoryBuilder().build(reader, "development"); 
devSession = sqlSessionFactorys.openSession(); // dev env 
+0

Alex - muchas gracias!我剛剛在這裏張貼你自己的回覆郵件列表:) – Bostone 2010-04-28 01:44:12

2

根據該站點: http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

build()方法關閉現在返回SqlSessionFactory中之前讀取器/的InputStream。所以你需要打開一個新的閱讀器/流來加載第二個會話。當我將我的帳戶/安全表分隔到主應用程序數據庫的單獨數據庫時,我發現了這一點。我的第一個問題是,當bean試圖加載會話工廠時,由於輸入流錯誤(關閉),我不斷收到錯誤。

例如

try { 
    inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH); 
    prodDbSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, prodDbEnvironment); 
    inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH); 
    securityDbSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, securityDbEnvironment); 
} catch (IOException ex) { 
    String msg = "Unable to get SqlSessionFactory"; 
    CustomizedLogger.LOG(Level.SEVERE, this.getClass().getCanonicalName(), "methodName", msg, ex); 
} 

雖然我把它們放在不同的try catch塊,讓我知道哪一個失敗特別是在日誌文件的時候了。

我也將它作爲一個單例實現,所以它只需要加載一次資源。

上下文:我在Java EE容器中運行此操作,並將MyBatis用於直接查詢以及我將使用本機查詢的位置,因爲它是一個非常簡單且直接的框架。我可能會轉而使用它遍佈JPA,但這仍然有待討論。