Question

J'ai cette configuration dans ibatis-config.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, il se charge de la source de données <environment id="development">

QUESTION : Est-il possible à l'interrupteur de l'exécution pour l'utilisation <environment id="test"> sans modifier XML? Par exemple - j'ai un fichier de test où j'utilise SqlSessionFactory et que vous voulez le mettre à l'environnement de programmation test d'usage

?
Était-ce utile?

La solution

méthode SqlSessionFactoryBuilder.build () peut sélectionner un environnement spécifique au format 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

Autres conseils

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 aurez donc besoin d'ouvrir un nouveau lecteur / flux afin de charger la deuxième session. J'ai découvert quand je sépare mes tables compte / sécurité à une base de données séparée de l'application principale DB. Mon premier rendez-vous autour je continuais à obtenir des erreurs lorsque le haricot a été la tentative de chargement de l'usine de session en raison d'une erreur de flux d'entrée (fermée).

par exemple.

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);
}

Bien que je les ai mis dans des blocs catch try séparés pour que je sache que l'on n'a pas spécifiquement tout de suite dans le fichier journal.

Je également mettre en œuvre cela comme un singleton afin qu'il ne dispose que des ressources de charge de charge une fois.

Contexte: Je lance ce dans un conteneur Java EE et utiliser mybatis pour les requêtes droites avant et où je voudrais utiliser les requêtes natives car il est un cadre beaucoup plus simple et simple. Je pourrais passe à l'utiliser sur JPA partout, mais qui est encore en débat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top