多数原配置
问题描述:使用sqlSessionFactory配置多数据源的时候,可能出现 Invalid bound statement (not found)的问题,具体代码如下
1 <!--数据源 1--> 2 <bean id="payment_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 3 <property name="dataSource" ref="payment_dataSource" /> 4 <property name="configLocation" value="classpath:spring/mybatis-config.xml"/> 5 <!-- 通配符指定Mapper.xml --> 6 <property name="mapperLocations" value="classpath:mapper/payment/*.xml" /> 7 <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> 8 <property name="typeAliasesPackage" value="com.hello.hi.datasync.business.entity" /> 9 </bean> 10 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" > 11 <property name="basePackage" value="com.hello.hi.datasync.business.mapper" /> 12 <property name="sqlSessionFactoryBeanName" value="payment_sqlSessionFactory" /> 13 </bean> 14 <!-- 数据源2 --> 15 <bean id="dataline_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 16 <property name="dataSource" ref="dataline_dataSource" /> 17 <property name="configLocation" value="classpath:spring/mybatis-config.xml"/> 18 <!-- 通配符指定Mapper.xml --> 19 <property name="mapperLocations" value="classpath:mapper/dataline/*.xml" /> 20 <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> 21 <property name="typeAliasesPackage" value="com.hello.hi.datasync.business.entity" /> 22 </bean> 23 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" > 24 <property name="basePackage" value="com.hello.hi.datasync.business.mapper" /> 25 <property name="sqlSessionFactoryBeanName" value="dataline_sqlSessionFactory" /> 26 </bean>
问题解决:只需将basePackage的路径更具体化即可
即
<!--数据源 1--> 2 <bean id="payment_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 3 <property name="dataSource" ref="payment_dataSource" /> 4 <property name="configLocation" value="classpath:spring/mybatis-config.xml"/> 5 <!-- 通配符指定Mapper.xml --> 6 <property name="mapperLocations" value="classpath:mapper/mapper2/*.xml" /> 7 <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> 8 <property name="typeAliasesPackage" value="com.hello.hi.datasync.business.entity" /> 9 </bean> 10 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" > 11 <property name="basePackage" value="com.hello.hi.datasync.business.mapper.mapper2" /> 12 <property name="sqlSessionFactoryBeanName" value="payment_sqlSessionFactory" /> 13 </bean> 14 <!-- 数据源2 --> 15 <bean id="dataline_sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 16 <property name="dataSource" ref="dataline_dataSource" /> 17 <property name="configLocation" value="classpath:spring/mybatis-config.xml"/> 18 <!-- 通配符指定Mapper.xml --> 19 <property name="mapperLocations" value="classpath:mapper/mapper1/*.xml" /> 20 <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> 21 <property name="typeAliasesPackage" value="com.hello.hi.datasync.business.entity" /> 22 </bean> 23 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" > 24 <property name="basePackage" value="com.hello.hi.datasync.business.mapper.mapper1" /> 25 <property name="sqlSessionFactoryBeanName" value="dataline_sqlSessionFactory" /> 26 </bean>
原理描述:我们之所以可以配置多个数据源,是因为sqlSesionFactory支持多数据源配置,
但是他在加载Mapper.java的时候是直接加载一个包下面的所有Mapper.java文件,所以如果
我们将两个数据源的Mapper放在一个包下,只会加载一次,所以另外一个数据源就没有Mapper
了,自然就报Invalid bound statement (not found)的错误
浙公网安备 33010602011771号