MyBatis - определение глобального параметра - PullRequest
8 голосов
/ 06 декабря 2011

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

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

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

Ответы [ 3 ]

6 голосов
/ 08 декабря 2011

Да, вы можете! Возможно, это какая-то странная недокументированная функция. При создании объекта конфигурации сделайте что-то подобное. (Org.apache.ibatis.session.Configuration)

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

Тогда в вашей карте XML вы можете ссылаться.

    select * from ${global_param}
4 голосов
/ 03 июня 2013

У меня была та же проблема с использованием 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>
0 голосов
/ 15 сентября 2016

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

  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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...