2011-12-05 7 views
6

Prima il problema: sto utilizzando query definite da XML e SQL contiene il nome del database come parte di un nome di tabella. Ad esempio: SELECT * from mydb.bar. Sfortunatamente, i database vengono creati/nominati dappertutto e la parte mudb è davvero dinamica e può cambiare in qualsiasi momento. Così ho voluto sostituirlo con una proprietà in modo che sarebbe simile SELECT * FROM ${dbname}.bar e poi ho definito la seguente sezione nel mybatis-config.xml:MyBatis - definizione di un parametro globale

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

Ma quando si esegue la query ${dbname} restituisce null. Lo stesso succede se definisco questa proprietà nel file delle proprietà. Oserei passare questo come parte dei parametri di ogni chiamata poiché questa è veramente una proprietà globale. Può essere fatto? E se sì - come?

risposta

4

Sì, è possibile! Forse è una specie di strana caratteristica non documentata. Quando costruisci il tuo oggetto Configuration, fai qualcosa di simile. (Org.apache.ibatis.session.Configuration)

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

Poi nella mappa XML, è possibile fare riferimento.

select * from ${global_param} 
+1

Grazie !. Sfortunatamente sto usando Spring per astrarre MyBatis e tutte le mie configurazioni sono definite in applicationContext.xml. Mi chiedo però se queste variabili sono esposte e possono essere impostate tramite la configurazione XML in applicationContext.xml, andando a guardare in questo – Bostone

+0

Sembra che dovrebbe funzionare. Ho guardato il codice sorgente per SqlSessionFactoryBean, sembra impostare le variabili sulle proprietà be. Non ho lavorato con l'integrazione di primavera, ma proverei a eseguire il debug del metodo buildSqlSessionFactory in SqlSessionFactoryBean per vedere dove sta caricando le proprietà. – Andy

+0

Le proprietà passate a "SqlSessionFactoryBean.setConfigurationProperties()" vengono impostate come variabili nella configurazione MyBatis. Dovresti essere in grado di creare una proprietà in Spring xml e usarla quando si configura il bean factory. – AngerClown

3

Ho avuto lo stesso problema con Primavera + MyBatis, e risolto impostando 'configurationProperties' usando la mia definizione XML Primavera sqlSessionFactory. Il mio esempio qui sotto mostra come impostare una proprietà globale personalizzata denominata 'encryptionKey', con un valore che può essere hard-code nel file XML, o caricare da un file esterno usando il contesto: tag segnaposto-proprietà (come sotto).

<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> 
0

stavo usando una configurazione XML, ma non molla e impostare una proprietà all'interno dell'oggetto di configurazione, ma ha scoperto che doveva essere fatto prima che i file vengono caricati mapper (vedi here). Ho abbandonato l'approccio oggetto Configuration e sono andato con questo approccio, che ha lavorato per me:

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

Poi, come ha postato Andy Pryor, utilizzare select * from ${dbname} nel mapper XML.