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. Я не работал с интеграцией spring, но я бы попробовал отладить метод buildSqlSessionFactory в SqlSessionFactoryBean, чтобы увидеть, где он загружает свойства. - person Andy; 08.12.2011
comment
Свойства, переданные в SqlSessionFactoryBean.setConfigurationProperties(), устанавливаются как переменные в конфигурации MyBatis. Вы должны иметь возможность создать свойства в Spring xml и использовать их при настройке фабричного компонента. - 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 yes можно использовать в перехватчике. Это также может работать с весенним майбтисом - 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, и задал свойство внутри объекта конфигурации, но обнаружил, что это нужно сделать до загрузки файлов сопоставления (см. здесь). Я отказался от подхода объекта конфигурации и выбрал этот подход, который сработал для меня:

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

Затем, как написал Энди Прайор, используйте select * from ${dbname} в преобразователе XML.

person rimsky    schedule 14.09.2016