但是如果要配置自动扫描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>