3

我有这个配置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>

如图所示,它将从<environment id="development">

问题:是否可以在运行时切换使用<environment id="test">而不修改 XML?例如 - 我有一个正在使用的测试文件,SqlSessionFactory并想以编程方式设置它以使用测试环境?

4

2 回答 2

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
于 2010-04-28T01:02:41.947 回答
2

根据这个网站: http ://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

build()方法现在在返回 SqlSessionFactory 之前关闭阅读器/输入流。因此,您需要打开一个新的阅读器/流才能加载第二个会话。当我将我的帐户/安全表与主应用程序数据库分开到一个单独的数据库时,我发现了这一点。由于输入流错误(关闭),当 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 使用它,但这仍有待商榷。

于 2014-12-03T23:49:49.590 回答