spring整合MyBatis使用到了mybatis-spring,在配置mybatis映射文件的时候,一般会使用MapperScannerConfigurer,MapperScannerConfigurer会自动扫描basePackage指定的包,找到映射接口类和映射XML文件,并进行注入。配置如下:
1 <!-- 数据源 --> 2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 3 <property name="driverClass" value="${${database.type}.jdbc.driverClassName}"/> 4 <property name="jdbcUrl" value="${${database.type}.jdbc.url}"/> 5 <property name="properties" ref="dataSourceProperties"/> 6 <property name="autoCommitOnClose" value="true"/> 7 <property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/> 8 <property name="initialPoolSize" value="${cpool.minPoolSize}"/> 9 <property name="minPoolSize" value="${cpool.minPoolSize}"/> 10 <property name="maxPoolSize" value="${cpool.maxPoolSize}"/> 11 <property name="maxIdleTime" value="${cpool.maxIdleTime}"/> 12 <property name="acquireIncrement" value="${cpool.acquireIncrement}"/> 13 <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/> 14 </bean> 15 16 <!--基于注解的事务管理--> 17 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 18 <property name="dataSource" ref="dataSource"/> 19 </bean> 20 21 <tx:annotation-driven transaction-manager="transactionManager"/> 22 23 24 <bean id="lazySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 25 <property name="dataSource" ref="dataSource"/> 26 <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> <!-- 采用configLocation方式 Mybatis配置文件保留 --> 27 </bean> 28 29 <!-- 扫描mybatis映射接口类 --> 30 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 31 <property name="basePackage" value="com.test.dsm"/> 32 <property name="sqlSessionFactoryBeanName" value="lazySqlSessionFactory"/> 33 </bean>
这个配置的前提条件是:映射接口类文件(.java)和映射XML文件(.xml)需要放在相同的包下(com.test.dsm)
如果myBatis映射XML文件和映射接口文件不放在同一个包下怎么办呢?(当然放在一个包里肯定可以)
如果在不同的包下,那就需要手动配置XML文件的路径了,只需要修改SqlSessionFactoryBean配置即可:
<bean id="lazySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 当mybatis的xml文件和mapper接口不在相同包下时,需要用mapperLocations属性指定xml文件的路径。 *是个通配符,代表所有的文件,**代表所有目录下 --> <property name="mapperLocations" value="classpath:com/test/mapper/mysql/**/*.xml" /> <!-- 采用mapperLocation mybatis配置文件可以删除--> </bean>
添加一个mapperLocations属性,指定加载xml文件的路径。
classpath:表示在classes目录中查找,classpath就是指WEB-INF/classes/
这个目录的路径。需要声明的一点是,使用classpath:
这种前缀,就只能代表一个文件。;
*:通配符表示所有文件,则可以代表多个匹配的文件,不仅包含class路径,还包括jar文件中(class路径)进行查找
--注意: 用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*。
**:表示所有目录下,双星号**
表示在任意目录下,也就是说在WEB-INF/classes/
下任意层的目录,只要符合后面的文件路径,都会被作为资源文件找到;
MyBatis官网说明如下:http://mybatis.github.io/spring/factorybean.html