Frage

Zuerst das Problem: Ich verwende XML-definierte Abfragen und SQL enthält den Datenbanknamen als Teil eines Tabellennamens.Zum Beispiel: SELECT * from mydb.bar.Leider werden Datenbanken überall erstellt / benannt und der mudb-Teil ist sehr dynamisch und kann sich jederzeit ändern.Also wollte ich es durch eine Eigenschaft ersetzen, damit es wie SELECT * FROM ${dbname}.bar aussieht, und dann habe ich den folgenden Abschnitt in mybatis-config.xml definiert:

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

Aber wenn ich die Abfrage ausführe, wird ${dbname} als null ausgewertet.Gleiches passiert, wenn ich diese Eigenschaft in der Eigenschaftendatei definiere.Ich würde es hassen, dies als Teil der einzelnen Aufrufparameter zu übergeben, da dies wirklich eine globale Eigenschaft ist.Kann das gemacht werden?Und wenn ja - wie?

War es hilfreich?

Lösung

Ja, das kannst du!Dies ist vielleicht eine seltsame undokumentierte Funktion.Gehen Sie beim Erstellen Ihres Konfigurationsobjekts wie folgt vor.(org.apache.ibatis.session.Configuration)

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

Dann können Sie in Ihrer XML-Map referenzieren.

    select * from ${global_param}

Andere Tipps

Ich hatte das gleiche Problem mit Spring + MyBatis und löste es, indem ich 'configurationProperties' mithilfe meiner Spring XML-Definition für sqlSessionFactory festlegte.In meinem folgenden Beispiel wird gezeigt, wie Sie eine benutzerdefinierte globale Eigenschaft mit dem Namen "encryptionKey" mit einem Wert festlegen, den Sie entweder in der XML-Datei fest codieren oder aus einer externen Datei mithilfe des Tags "context-property-placeholder" (wie unten) laden können.

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

Ich habe eine XML-Konfiguration verwendet, aber nicht Spring, und eine Eigenschaft innerhalb des Konfigurationsobjekts festgelegt, aber festgestellt, dass dies vor dem Laden der Mapper-Dateien erfolgen musste (siehe hier ).Ich habe den Konfigurationsobjektansatz aufgegeben und mich für diesen Ansatz entschieden, der für mich funktioniert hat:

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

Verwenden Sie dann, wie Andy Pryor gepostet hat, select * from ${dbname} im XML-Mapper.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top