多数原配置

问题描述:使用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)的错误

posted on 2017-04-24 21:07  正道直行  阅读(158)  评论(0)    收藏  举报