2011-12-05 22 views
6

Najpierw problem: używam zapytań zdefiniowanych przez XML, a SQL zawiera nazwę bazy danych jako część nazwy tabeli. Na przykład: SELECT * from mydb.bar. Niestety, bazy danych są tworzone/nazywane w całym miejscu, a część jest bardzo dynamiczna i może się zmieniać w każdej chwili. Więc chciałem wymienić go na własność tak to będzie wyglądać SELECT * FROM ${dbname}.bar a potem określono następującą sekcję mybatis-config.xml:MyBatis - definiowanie globalnego parametru

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

Ale kiedy uruchomić kwerendę ${dbname} ma wartość null. To samo dzieje się, jeśli zdefiniuję tę właściwość w pliku właściwości. Nie chciałbym przekazać tego jako części każdego parametru wywołania, ponieważ jest to prawdziwie globalna właściwość. Czy można to zrobić? A jeśli tak - jak?

Odpowiedz

4

Tak, możesz! To może być dziwna nieudokumentowana funkcja. Podczas budowania obiektu konfiguracyjnego wykonaj coś takiego. (org.apache.ibatis.session.Configuration)

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

Następnie w swojej mapie XML można odwoływać się.

select * from ${global_param} 
+1

Dzięki !. Niestety używam Springa do abstrakcyjnego MyBatis, a wszystkie moje konfiguracje są zdefiniowane w applicationContext.xml. Zastanawiam się jednak, czy te zmienne są narażone i można je ustawić za pomocą konfiguracji XML w pliku applicationContext.xml, zajmie się tym – Bostone

+0

Wygląda na to, że powinno działać. Spojrzałem na kod źródłowy dla SqlSessionFactoryBean, wydaje się, aby ustawić zmienne na właściwości be. Nie pracowałem z integracją sprężynową, ale spróbowałem debugowania metody buildSqlSessionFactory w SqlSessionFactoryBean, aby zobaczyć, gdzie ładuje właściwości. – Andy

+0

Właściwości przekazane do 'SqlSessionFactoryBean.setConfigurationProperties()' zostaną ustawione jako zmienne w konfiguracji MyBatis. Powinieneś być w stanie utworzyć właściwości w Spring xml i używać go podczas konfigurowania komponentu bean. – AngerClown

3

miałem ten sam problem przy użyciu Wiosna + MyBatis i rozwiązać go przez ustawienie „configurationProperties” używając mojego wiosna definicji XML sqlSessionFactory. Poniższy przykład pokazuje, jak ustawić niestandardową właściwość globalną o nazwie "encryptionKey", z wartością, którą można albo zakodować w pliku XML, albo załadować z pliku zewnętrznego za pomocą kontekstu: znacznik placeholder-property (jak poniżej).

<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

używałem konfigurację XML ale nie wiosną i ustawić właściwość wewnątrz obiektu Configuration ale odkrył, że musiały być wykonane przed pliki są ładowane Mapper (patrz here). Porzuciłem podejście obiektowe Konfiguracja i poszedł z tym podejściem, który pracował dla mnie:

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

Potem, jak Andy Pryor pisał, użyj select * from ${dbname} w odwzorowującego XML.

Powiązane problemy