mybatis-spring集成:配置多数据库源中遇到的问题--MapperScannerConfigurer配置

时间:2021-08-11 16:18:52

mybatis配置多数据源本身很简单,和基本配置差别不大 

但是如果要配置自动扫描mapper文件,可能会遇到一点儿问题

只有一个数据源时,只需要指定包就可以了,比如

<!-- 扫描映射器,自动创建 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="...*" /></bean>

而有多个数据源时,还需要指定使用哪一个sqlSession,在mybatis-spring的中文文档中,提到用sqlSessionFactory或sqlSessionTemplate属性来配置数据源,文档:

注意,没有必要去指定SqlSessionFactory或SqlSessionTemplate,因为MapperScannerConfigurer将会创建MapperFactoryBean,之后自动装配。但是,如果你使用了一个以上的DataSource(因此,也是多个的SqlSessionFactory),那么自动装配可能会失效。这种情况下,你可以使用sqlSessionFactory或sqlSessionTemplate属性来设置正确的工厂/模板。


配置为:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="..." />
<property name="sqlSessionFactory" ref="fsasSqlSessionFactory"></property>
</bean>

当这样配置时,如果数据源DataSource的属性中使用了properties属性,那么就会报异常:

<!-- 配置dbcp连接池,注意要加入它的第三包jar包 -->
<bean id="fsasDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${fsas.url}" />
<property name="username" value="${fsas.username}" />
<property name="password" value="${fsas.password}" />
</bean>


异常信息:

2011-11-19 20:37:57 WARN [com.mchange.v2.c3p0.DriverManagerDataSource:107] - Could not load driverClass ${jdbc.driverClass}
java.lang.ClassNotFoundException: ${jdbc.driverClass}



查看官方英文文档发现,有专门提醒:
NOTE sqlSessionFactoryBean and sqlSessionTemplateBean properties were the only option available up to MyBatis-Spring 1.0.2 but given that the MapperScannerConfigurer runs earlier in the startup process thatPropertyPlaceholderConfigurer there were frequent errors. For that purpose that properties have been deprecated and the new properties sqlSessionFactoryBeanName and sqlSessionTemplateBeanName are recommended.
大概意思是:MapperScannerConfigurer初始化的时候,PropertyPlaceholderConfigurer还没有将properties的参数值替换,所有导致直接将参数名,如“${jdbc.driverClassName}”设置到dataSource的字段属性中。
同时,官方已经弃用了采用sqlSessionFactoryBean 和 SesionTemplateBean的方式进行配置,而推荐使用sqlSessionFactoryBeanName 和  sqlSessionTemplateBeanName

所以正确的配置应该为:
<!-- 扫描映射器,自动创建 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="..." />
<property name="sqlSessionTemplateBeanName" value="fsasSqlSession" />
</bean>