当 MyBatis 的 Mapper 接口的包和 XML 映射配置文件的包不一致时,你仍然可以使用 `MapperScannerConfigurer` 来分别指定接口的包和 XML 映射文件的包。从 MyBatis 3 开始,XML 映射文件不再是必须与对应的 Mapper 接口在同一个包中。
以下是如何配置这种情况的步骤:
1. **指定 Mapper 接口的包**:
使用 `basePackage` 属性指定包含 Mapper 接口的包路径。
2. **指定 XML 映射文件的包**:
使用 `sqlSessionFactory` 的 `mapperLocations` 属性指定 XML 映射文件的位置。如果你使用 Spring 配置文件来配置 MyBatis,可以这样做:
```xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 指定 XML 映射文件的位置 -->
<property name="mapperLocations" value="classpath*:com/zhang/mapper/*.xml" />
</bean>
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定 Mapper 接口的包 -->
<property name="basePackage" value="com.zhang.dao" />
<!-- 指定 sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
```
在这个例子中,`sqlSessionFactory` 负责查找和加载 `com.zhang.mapper` 包下的 XML 映射文件,而 `mapperScannerConfigurer` 则扫描 `com.zhang.dao` 包下的 Mapper 接口。
3. **使用注解**:
如果你更倾向于使用注解而不是 XML 配置,可以在 Spring Boot 应用中使用 `@MapperScan` 注解来指定 Mapper 接口的包路径,并在 `SqlSessionFactory` 配置中指定 XML 映射文件的位置:
```java
@Configuration
@MapperScan("com.zhang.dao") // 指定 Mapper 接口的包
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
// 指定 XML 映射文件的位置
factory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:com/zhang/mapper/*.xml"));
return factory.getObject();
}
// 其他配置...
}
```
使用这种方法,即使 Mapper 接口和 XML 映射文件不在同一个包中,MyBatis 也能够正确地将它们关联起来。
确保在 `MapperScannerConfigurer` 中没有指定 `mapperLocations`,因为这是在 `SqlSessionFactoryBean` 中配置的。`MapperScannerConfigurer` 的任务是发现和注册 Mapper 接口,而 `SqlSessionFactoryBean` 的任务是创建 `SqlSessionFactory` 实例并加载 XML 映射文件。