Pregunta

Primero el problema: estoy usando consultas definidas en XML y SQL contiene el nombre de la base de datos como parte de un nombre de tabla.Por ejemplo: SELECT * from mydb.bar.Desafortunadamente, las bases de datos se crean / nombran en todo el lugar y la parte mudb es realmente dinámica y puede cambiar en cualquier momento.Así que quise reemplazarlo con una propiedad para que se vea como SELECT * FROM ${dbname}.bar y luego definí la siguiente sección en mybatis-config.xml:

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

Pero cuando ejecuto la consulta ${dbname} se evalúa como nulo.Lo mismo sucede si defino esta propiedad en el archivo de propiedades.Odiaría pasar esto como parte de los parámetros de cada llamada, ya que esta es realmente una propiedad global.Se puede hacer esto?Y si es así, ¿cómo?

¿Fue útil?

Solución

¡Sí, puedes!Esta es quizás una característica extraña indocumentada.Al construir su objeto de configuración, haga algo como esto.(org.apache.ibatis.session.Configuration)

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

Luego, en su mapa XML, puede hacer referencia.

    select * from ${global_param}

Otros consejos

Tuve el mismo problema al usar Spring + MyBatis, y lo resolví configurando 'configurationProperties' usando mi definición Spring XML para sqlSessionFactory.Mi ejemplo a continuación muestra cómo establecer una propiedad global personalizada llamada 'encryptionKey', con un valor que puede codificar en el archivo XML o cargar desde un archivo externo usando el contexto: etiqueta de marcador de posición de propiedad (como se muestra a continuación).

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

Estaba usando una configuración XML pero no Spring y establecí una propiedad dentro del objeto Configuración, pero descubrí que tenía que hacerse antes de que se carguen los archivos del asignador (consulte aquí ).Abandoné el enfoque del objeto de configuración y seguí este enfoque, que funcionó para mí:

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

Luego, como publicó Andy Pryor, use select * from ${dbname} en el mapeador XML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top