2017-02-15 40 views
2

你能幫我弄清楚MyBatis中的DB_VENDOR有什麼問題嗎?我使用的是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>