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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top