2010-04-15 20 views
3

J'ai cette configuration dans ibatis-config.xmliBatis - environnement select en utilisant 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> 

Comme le montre qu'il chargera source de données de <environment id="development">

QUESTION: Est-il possible à l'interrupteur de l'exécution pour utiliser <environment id="test"> sans modifier XML? Par exemple - J'ai un fichier de test où j'utilise SqlSessionFactory et je veux le définir par programme pour utiliser l'environnement de test?

+0

Idéalement, vous devriez utiliser un outil de construction et une structure de projet afin que ce ne soit pas un problème. Je recommande maven, il peut être un peu déroutant et magique au début, mais quand vous aurez dépassé cela, cela permettra d'économiser beaucoup de temps et d'appliquer de bonnes pratiques. – nash

Répondre

7

La méthode SqlSessionFactoryBuilder.build() permet de sélectionner un environnement spécifique en XML.

Par exemple,

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! J'étais sur le point de poster ici votre propre réponse de la liste de diffusion :) – Bostone

2

Selon ce site: http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

La méthode build() ferme le lecteur/inputstream avant de retourner SqlSessionFactory maintenant. Vous devrez donc ouvrir un nouveau lecteur/flux afin de charger la seconde session. J'ai découvert ceci quand j'ai séparé mes tables de compte/sécurité à une base de données séparée du DB principal d'application. Mon premier tour a continué à obtenir des erreurs lorsque le bean essayait de charger la fabrique de session en raison d'une erreur de flux d'entrée (fermé).

par exemple. Bien que je les mette dans des blocs catch catch distincts, de sorte que je sache lequel a échoué spécifiquement dans le fichier journal immédiatement. Je l'implémente également en tant que singleton de sorte qu'il lui suffit de charger les ressources de chargement une fois.

Contexte: Je l'exécute dans un conteneur Java EE et utilise MyBatis pour les requêtes directes et pour l'utilisation des requêtes natives car il s'agit d'un framework beaucoup plus simple et direct. Je pourrais passer à l'utilisation de JPA partout, mais cela reste à débattre.