2011-12-05 14 views
6

Primero, el problema: estoy usando consultas XML-defined y el SQL contiene el nombre de la base de datos como parte de un nombre de tabla. Por ejemplo: SELECT * from mydb.bar. Lamentablemente, las bases de datos se crean/nombran por todas partes y la parte mudb es realmente dinámica y puede cambiar en cualquier momento. Así que quería sustituirla por una propiedad por lo que se vería como SELECT * FROM ${dbname}.bar y luego he definido la siguiente sección en SqlMapConfig.xml:MyBatis - definición de un parámetro global

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

Pero cuando corro la consulta ${dbname} evalúa como null. Lo mismo sucede si defino esta propiedad en el archivo de propiedades. No me gustarí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?

Respuesta

4

Sí, puedes! Esta es una especie de característica indocumentada extraña tal vez. Cuando construyas tu objeto de Configuración, haz 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} 
+1

¡Gracias !. Desafortunadamente estoy usando Spring para resumir MyBatis y todas mis configuraciones están definidas en applicationContext.xml. Sin embargo, me pregunto si estas variables están expuestas y se pueden establecer a través de la configuración XML en applicationContext.xml, yendo a buscar en este – Bostone

+0

Parece que debería funcionar. Miré el código fuente de SqlSessionFactoryBean, parece configurar las variables a las propiedades be. No he trabajado con la integración de Spring, pero trataría de depurar el método buildSqlSessionFactory en SqlSessionFactoryBean para ver dónde está cargando las propiedades. – Andy

+0

Las propiedades pasadas a 'SqlSessionFactoryBean.setConfigurationProperties()' se establecen como variables en la configuración de MyBatis. Debería poder crear un Propiedades en Spring xml y usarlo al configurar el bean de fábrica. – AngerClown

3

que tenían el mismo problema utilizando Spring + MyBatis, y lo resolvió mediante el establecimiento de 'configurationProperties' usando mi definición XML de Spring 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 propiedad-marcador de posición (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> 
0

que estaba usando una configuración de XML, pero no la primavera y establecer una propiedad dentro del objeto de configuración, pero descubrió que había que hacer antes de cargar los archivos Mapper (ver here). Abandoné el enfoque de objetos de configuración y fui con este enfoque, que trabajó 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); 

Entonces, tal como fue anunciado Andy Pryor, utilice select * from ${dbname} en el asignador XML.

Cuestiones relacionadas