Pergunta

Eu tenho essa configuração em 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>

Como mostrado, ele carregará o DataSource de <environment id="development">

PERGUNTA: É possível no interruptor de tempo de execução usar <environment id="test"> sem modificar o XML? Por exemplo - eu tenho um arquivo de teste onde estou usando SqlSessionFactory e deseja configurá -lo programaticamente para usar o ambiente de teste?

Foi útil?

Solução

O método SQLSessionFactoryBuilder.Build () pode selecionar um ambiente específico no XML.

Por exemplo,

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

Outras dicas

De acordo com este site:http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/source%20packages/org.apache.ibatis.session/sqlSessionFactoryBuilder.java

o build() O método fecha o leitor/inputStream antes de retornar o SQLSessionFactory agora. Portanto, você precisará abrir um novo leitor/fluxo para carregar a segunda sessão. Descobri isso quando separei minhas tabelas de conta/segurança para um banco de dados separado do db de aplicativo principal. Minha primeira saída, continuei recebendo erros quando o feijão estava tentando carregar a fábrica da sessão devido a um erro de fluxo de entrada (fechado).

por exemplo

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

Embora eu os coloque em blocos de captura de tentativa separados para saber qual falha especificamente imediatamente no arquivo de log.

Eu também implemento isso como um singleton para que ele só precise carregar recursos de carga uma vez.

Contexto: Eu executo isso em um contêiner Java EE e uso o Mybatis para consultas diretas e para onde eu usaria consultas nativas, pois é uma estrutura muito mais simples e direta. Eu poderia mudar para usá -lo sobre JPA em todos os lugares, mas isso ainda está em debate.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top