Pergunta

Primeiro o problema: estou usando consultas definidas por XML e o SQL contém o nome do banco de dados como parte do nome de uma tabela.Por exemplo: SELECT * from mydb.bar.Infelizmente, bancos de dados são criados / nomeados em todos os lugares e a parte mudb é realmente dinâmica e pode mudar a qualquer momento.Então, eu queria substituí-lo por uma propriedade para que se parecesse com SELECT * FROM ${dbname}.bar e, em seguida, defini a seguinte seção em mybatis-config.xml:

<properties>
    <property name="dbname" value="mydb"/>
</properties>

Mas quando eu executo a consulta, ${dbname} é avaliado como nulo.O mesmo acontece se eu definir essa propriedade no arquivo de propriedades.Eu odiaria passar isso como parte dos parâmetros de cada chamada, pois essa é realmente uma propriedade global.Isso pode ser feito?E se sim - como?

Foi útil?

Solução

Sim, você pode!Este é um tipo estranho de recurso não documentado, talvez.Ao construir seu objeto de configuração, faça algo assim.(org.apache.ibatis.session.Configuration)

configuration.getVariables().put("global_param", "123");

Então, em seu mapa XML, você pode fazer referência.

    select * from ${global_param}

Outras dicas

Tive o mesmo problema ao usar Spring + MyBatis e resolvi definindo 'configurationProperties' usando minha definição Spring XML para sqlSessionFactory.Meu exemplo abaixo mostra como definir uma propriedade global personalizada chamada 'encryptionKey', com um valor que você pode codificar no arquivo XML ou carregar de um arquivo externo usando a tag context: property-placeholder (como abaixo).

<context:property-placeholder location="/WEB-INF/spring/config-datasource.properties" />

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="typeAliasesPackage" value="com.example.model" />
    <beans:property name="configurationProperties">
        <beans:props>
            <beans:prop key="encryptionKey">${jdbc.encryptionKey}</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

Eu estava usando uma configuração XML, mas não Spring, e defini uma propriedade dentro do objeto Configuration, mas descobri que isso precisava ser feito antes que os arquivos do mapeador fossem carregados (consulte aqui ).Abandonei a abordagem do objeto de configuração e fui com esta abordagem, que funcionou para mim:

  Reader reader = Resources.getResourceAsReader("..../mybatis-config.xml");
  Properties properties = new Properties();
  properties.setProperty("dbname", "mydb");
  SqlSessionFactory.factory = new SqlSessionFactoryBuilder().build(reader, "development", properties);

Então, como postou Andy Pryor, use select * from ${dbname} no mapeador XML.

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