Получить имя схемы из файла свойств - PullRequest
0 голосов
/ 23 марта 2012

В данный момент у меня проблема с поиском, но я все еще не нашел ответа.

Причины проблемы: У нас несколько схем БДпо одному URL-адресу, включая тестовые копии схем (например, schema1, schema2, schema1_test, schema2_test находятся по одному и тому же URL).Я пытаюсь сделать, какая версия каждой схемы используется настраиваемой через файл свойств.

Мы используем Spring и mybatis, и, к сожалению, я новичок в обоих (поэтому, пожалуйста, извините за мое невежество или любые ошибки, которые ясделайте описание проблемы!)


Итак, в моем весеннем конфигурационном файле, который хранится в / src / main / resources, у меня есть следующие фрагменты: (я только добавил свойство «configLocation» и позже добавилСвойство "sqlSessionFactoryBeanName")

<!-- define the SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="typeAliasesPackage" value="com.example.domain" />
    <property name="configLocation" value="classpath:mybatisConfig.xml" />
</bean>

<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.something.persistence" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>


My mybatisConfig.xml (хранится в / src / main / resources, который должен находиться в пути к классам)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="sqlmapconfig.properties" />
</configuration>


sqlmapconfig.properties (в той же папке)

schema1=schema1_test


И я пытаюсь ссылаться на свойство в одном из файлов сопоставления в com.example.something.persistence:

 <select id="test" resultType="result" parameterType="long">
    select ${schema1}.table.col  
    from ${schema1}.table 
 </select>

Когда я пытаюсь собрать с Maven, он не проходит тест:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'schema1' in 'class java.lang.Long'

Любые предложения будут с благодарностью!

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Я перестал пытаться читать свойства напрямую и пошел дальше, передавая его из Java-маршрута

Так что мне пришлось изменить «parameterType», чтобы он был картой в файле картографирования

<select id="test" resultType="result" parameterType="map">
    select ${schema1}.table.col  
    from ${schema1}.table where number=#{number}
</select>

И отредактировал код java mapper следующим образом

import org.apache.ibatis.annotations.Param;

...

public List<result> test(@Param("number") long number, @Param("schema1") String schema1);

Надеюсь, это кому-нибудь поможет.

Примечания и ссылки:

Осторожнее при использовании $ {} против # {}, объяснения различий здесь

Как использовать несколько параметров, взятых из здесь

0 голосов
/ 08 июня 2017

У меня была похожая проблема, и мне удалось это сделать, создав пользовательский LanguageDriver.Языковые драйверы в mybatis имеют несколько методов подключения.Интересным является createSqlSource, который вызывается при загрузке каждого определенного оператора SQL.Это позволяет вам изменить оператор в этой точке.Лучший способ сделать это - расширить XMLLanguageDriver, который является драйвером по умолчанию, который интерпретирует запросы, определенные в XML-файлах и в аннотациях.

Первое, что нужно сделать, это изменить ваши запросы, добавив маркер, который будет заменен схемой (SCHEMA_MARKER импортируется из пользовательского класса драйвера языка, который представлен ниже):

public interface MyMabatisMapper {
  @Select("select * from " + SCHEMA_MARKER + ".myTable ")
  List<MyObjects> getObjects();
}

Теперь мы создаем пользовательский языковой драйвер, который заменит маркер на заданную схему.

Пример:

public class QueriesModifyingDriver extends XMLLanguageDriver {

  public static final String SCHEMA_MARKER = "###MY_SCHEMA###";
  public static final String SCHEMA_MARKER_PATTERN = SCHEMA.replaceAll("#", "\\#");

  private final String schemaName;

  // NOTE: Name of the schema passed in constructor !!!
  public QueriesModifyingDriver(String schemaName) {
    this.schemaName = schemaName;
  }

  @Override
  public SqlSource createSqlSource(org.apache.ibatis.session.Configuration configuration, String script, Class<?> parameterType) { 
    String modifiedScript = script.replaceAll(SCHEMA_MARKER_PATTERN, schemaName);

    return super.createSqlSource(configuration, modifiedScript, parameterType);
  }
};

Выше мы передали имя нашей схемы через конструктор нашему языковому драйверу.Теперь все, что нам нужно сделать, это установить этот языковой драйвер на mybatis.В приведенном ниже примере предполагается, что Spring используется с использованием конфигурации аннотаций.Имя схемы читается из свойства my.schema.name, но оно может быть получено из любого источника, конечно:

  @Bean
  public SqlSessionFactory mybatisSqlSessionFactory(DataSource dataSource, @Value("${my.schema.name}") String schemaName) throws Exception {

    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);

    org.apache.ibatis.session.Configuration mybatisConfiguration = sqlSessionFactoryBean.getObject().getConfiguration();

    QueriesModifyingDriver queriesModifyingDriver = new QueriesModifyingDriver(schemaName);
    mybatisConfiguration.getLanguageRegistry().register(queriesModifyingDriver);

    mybatisConfiguration.setDefaultScriptingLanguage(QueriesModifyingDriver.class);

    return sqlSessionFactoryBean.getObject();
  }

Обратите внимание, что это довольно эффективный способ, поскольку драйвер языка обрабатывает каждый запрос только один раз (при запуске) и эти измененные запросы позже повторно используются mybatis.

...