MyBatis - definizione di un parametro globale
-
28-10-2019 - |
Domanda
Innanzitutto il problema: sto utilizzando query definite in XML e SQL contiene il nome del database come parte del nome di una tabella.Ad esempio: SELECT * from mydb.bar
.Sfortunatamente, i database vengono creati / denominati ovunque e la parte mudb
è davvero dinamica e può cambiare in qualsiasi momento.Quindi ho voluto sostituirlo con una proprietà in modo che sembrasse SELECT * FROM ${dbname}.bar
e quindi ho definito la seguente sezione in mybatis-config.xml:
<properties>
<property name="dbname" value="mydb"/>
</properties>
Ma quando eseguo la query ${dbname}
restituisce null.Lo stesso accade se definisco questa proprietà nel file delle proprietà.Non vorrei passarlo come parte dei parametri di ogni chiamata poiché questa è veramente una proprietà globale.Può essere fatto?E se sì, come?
Soluzione
Sì, puoi!Questa è forse una strana caratteristica non documentata.Quando costruisci il tuo oggetto Configurazione, fai qualcosa di simile.(org.apache.ibatis.session.Configuration)
configuration.getVariables().put("global_param", "123");
Quindi nella mappa XML puoi fare riferimento.
select * from ${global_param}
Altri suggerimenti
Ho riscontrato lo stesso problema utilizzando Spring + MyBatis e l'ho risolto impostando "configurationProperties" utilizzando la mia definizione XML Spring per sqlSessionFactory.Il mio esempio di seguito mostra come impostare una proprietà globale personalizzata denominata "encryptionKey", con un valore che è possibile codificare nel file XML o caricare da un file esterno utilizzando il tag context: property-placeholder (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>
Stavo utilizzando una configurazione XML ma non Spring e ho impostato una proprietà all'interno dell'oggetto Configuration, ma ho scoperto che era necessario farlo prima che i file mapper venissero caricati (vedere qui ).Ho abbandonato l'approccio all'oggetto Configurazione e ho seguito questo approccio, che ha funzionato 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);
Quindi, come ha scritto Andy Pryor, utilizza select * from ${dbname}
nel mapping XML.