MyBatis - дефиниране на глобален параметър

Първо проблемът: използвам XML-дефинирани заявки и SQL съдържа името на базата данни като част от името на таблица. Например: SELECT * from mydb.bar. За съжаление базите данни се създават/именуват навсякъде и mudb част е наистина динамична и може да се промени във всеки един момент. Така че исках да го заменя със свойство, така че да изглежда като SELECT * FROM ${dbname}.bar и след това дефинирах следния раздел в mybatis-config.xml:

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

Но когато стартирам заявката ${dbname} се оценява на нула. Същото се случва, ако дефинирам това свойство във файла със свойства. Не бих искал да предам това като част от параметрите на всяко повикване, тъй като това наистина е глобално свойство. Може ли това да стане? И ако да - как?


person Bostone    schedule 05.12.2011    source източник


Отговори (3)


Да, можеш! Това може би е странна недокументирана функция. Когато изграждате своя конфигурационен обект, направете нещо подобно. (org.apache.ibatis.session.Configuration)

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

След това във вашата XML карта можете да направите справка.

    select * from ${global_param}
person Andy    schedule 07.12.2011
comment
Благодаря!. За съжаление използвам Spring, за да абстрахирам MyBatis и всичките ми конфигурации са дефинирани в applicationContext.xml. Чудя се обаче дали тези променливи са изложени и могат да бъдат зададени чрез XML конфигурация в applicationContext.xml, ще разгледам това - person Bostone; 08.12.2011
comment
Изглежда, че трябва да работи. Разгледах изходния код за SqlSessionFactoryBean, изглежда, че задава променливите на свойствата be. Не съм работил с пролетната интеграция, но бих опитал да отстраня грешки в метода buildSqlSessionFactory в SqlSessionFactoryBean, за да видя къде зарежда свойствата. - person Andy; 08.12.2011
comment
Свойствата, предадени на 'SqlSessionFactoryBean.setConfigurationProperties()' се задават като променливи в конфигурацията на MyBatis. Трябва да можете да създадете Properties в Spring xml и да го използвате, когато конфигурирате фабричния bean. - person AngerClown; 21.12.2011
comment
Знае ли някой дали има някакъв начин за добавяне на променливи за среда и използването му в картографите? - person vzamanillo; 18.05.2015
comment
Можем ли да използваме в прихващач? - person egemen; 27.07.2018
comment
За всеки, който използва mybatis-plus, можете да опитате mybatis-plus.configuration.variables. - person user1686407; 25.03.2019
comment
@egemen да, може да се използва в прихващач. Това може да работи и с spring maybtis - person vsingh; 03.12.2020

Имах същия проблем, използвайки Spring+MyBatis, и го реших, като зададох „configurationProperties“, използвайки моята Spring XML дефиниция за sqlSessionFactory. Моят пример по-долу показва как да зададете персонализирано глобално свойство, наречено „encryptionKey“, със стойност, която можете или да кодирате твърдо в XML файла, или да заредите от външен файл с помощта на етикета context:property-placeholder (както по-долу).

<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>
person Raff    schedule 03.06.2013

Използвах XML конфигурация, но не и Spring, и зададох свойство вътре в обекта Configuration, но открих, че трябва да се направи, преди да се заредят файловете за картографиране (вижте тук). Изоставих подхода на конфигурационния обект и използвах този подход, който работи за мен:

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

След това, както Andy Pryor публикува, използвайте select * from ${dbname} в XML картографа.

person rimsky    schedule 14.09.2016