2017-02-15 28 views
2

Не могли бы вы помочь мне выяснить, что не так с DB_VENDOR в MyBatis? Я использую mybatis 3.4.2, mybatis-spring 1.3.1, spring 4.3.6.RELEASE.MyBatis DB_VENDOR не работает

Все, кроме запросов, зависящих от поставщика, отлично работает. Пример запроса не зависит от поставщика, это только ради этого примера. Если я удалю из него атрибут databaseId и удалю дублированный, этот запрос будет работать.

Мне нужно поддерживать Oracle и PostgreSQL и уже проверили метаданные getDatabaseProductName() непосредственно в пределах моей тестовой области, получив «Oracle» и «PostgreSQL». Поэтому, если я правильно понял документацию, он должен работать, не так ли?

Все я с DatabaseID в месте:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): mappers.ConfigurationMapper.containsKey 

тест-mybatis-config.xml:

<?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> 
    <databaseIdProvider type="DB_VENDOR"> 
     <property name="PostgreSQL" value="postgres"/> 
     <property name="Oracle" value="oracle"/> 
    </databaseIdProvider> 

    <mappers> 
     <mapper resource="mybatis/ConfigurationMapper.xml"/> 
    </mappers> 
</configuration> 

тест-context.xml (с другой с PostgreSQL источником данных)

<mybatis:scan base-package="mappers" annotation="org.apache.ibatis.annotations.Mapper" factory-ref="sqlSessionFactory"/> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> 
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/> 
    <property name="username" value="test"/> 
    <property name="password" value="test"/> 
</bean> 

<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="configLocation" value="classpath:test-mybatis-config.xml"/> 
</bean> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

ConfigurationMapper.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="mappers.ConfigurationMapper"> 

    <select id="containsKey" resultType="string" parameterType="string" databaseId="oracle"> 
     SELECT '1' AS test FROM config_keys WHERE key = #{configKey} 
    </select> 

    <select id="containsKey" resultType="string" parameterType="string" databaseId="postgres"> 
     SELECT '1' AS test FROM config_keys WHERE key = #{configKey} 
    </select> 
</mapper> 

интерфейс картографа:

@Mapper 
public interface ConfigurationMapper { 

    String containsKey(@Param("configKey") String configKey); 
} 

ответ

2

Нашел. Ответ в XMLConfigBuilder:

Environment environment = configuration.getEnvironment(); 
    if (environment != null && databaseIdProvider != null) { 
     String databaseId = databaseIdProvider.getDatabaseId(environment.getDataSource()); 
     configuration.setDatabaseId(databaseId); 
    } 

среда должна быть настроена для того, чтобы сделать DatabaseID работу.

Вот как использовать мульти-дб поддержку весной окружающей среды: http://www.mybatis.org/spring/factorybean.html

<bean id="vendorProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="properties"> 
     <props> 
      <prop key="SQL Server">sqlserver</prop> 
      <prop key="DB2">db2</prop> 
      <prop key="Oracle">oracle</prop> 
      <prop key="MySQL">mysql</prop> 
     </props> 
    </property> 
</bean> 

<bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider"> 
    <property name="properties" ref="vendorProperties"/> 
</bean> 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" /> 
    <property name="databaseIdProvider" ref="databaseIdProvider"/> 
</bean>