如何设置Spring Boot MyBatis项目Mapper包多路径扫描?
- 内容介绍
- 文章标签
- 相关推荐
本文共计853个文字,预计阅读时间需要4分钟。
在配置MapperScan时,遇到mapper文件分别位于不同包中,如下:
- `com.xiaodou.aaa.mapper`- `cn.dapang.bbb.mapper`
应确保MapperScan注解正确指向包含所有mapper接口的父包。以下是配置示例:
java@SpringBootApplication@MapperScan(com.xiaodou.aaa.mapper, cn.dapang.bbb.mapper)public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
这样配置后,Spring Boot会自动扫描指定包及其子包下的所有接口,并将其识别为Mapper接口。
问题背景
最近在做一个springboot项目,里面使用了Spring Boot 和 mybatis,在配置 MapperScan 时遇到了问题,mapper文件分别在com.xiaodou.aaa.mapper和cn.dapang.bbb.mapper包中,我应该怎么配置才能保证两者都能扫描到呢?
解决方法
一、配置类配置
第一种方法是在 Mybatis 的配置类使用MapperScannerConfigurer来配置不同包下的Mapper接口扫描路径。示例代码如下所示:
@Configuration
public class MyBatisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
// 设置mapper文件的扫描路径
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:com/xiaodou/aaa/mapper/*.xml"));
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:cn/dapang/bbb/mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
// 配置MapperScan,指定不同包下的Mapper接口
@Bean
public MapperScannerConfigurer mapperScannerConfigurerDawang() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("com.xiaodou.aaa.mapper");
configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return configurer;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurerHuaguoshan() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("cn.dapang.bbb.mapper");
configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return configurer;
}
}
注解方法
1、书写多个配置类,每个配置类都加上注解
@Configuration
@MapperScan("com.xiaodou.aaa.mapper") // 指定第一个包的路径
public class DawangMyBatisConfig {
// 其他配置...
}
@Configuration
@MapperScan("cn.dapang.bbb.mapper") // 指定第二个包的路径
public class HuaguoshanMyBatisConfig {
// 其他配置...
}
2、可以使用一个配置类,并在该配置类上使用多个@MapperScan注解来扫描多个包。
@Configuration
@MapperScan("com.xiaodou.aaa.mapper")
@MapperScan("cn.dapang.bbb.mapper")
public class MyBatisConfig {
// 其他配置...
}
3、在使用@MapperScan注解时,也可以指定多个包路径,因为@MapperScan注解本身并不支持多个basePackages属性。所以这里我们使用数组的方式将多个包路径传递给basePackages属性。
@Configuration
@ComponentScan(basePackages = {"com.xiaodou.aaa.mapper", "cn.dapang.bbb.mapper"})
public class MyBatisConfig {
// 其他配置...
}
本文共计853个文字,预计阅读时间需要4分钟。
在配置MapperScan时,遇到mapper文件分别位于不同包中,如下:
- `com.xiaodou.aaa.mapper`- `cn.dapang.bbb.mapper`
应确保MapperScan注解正确指向包含所有mapper接口的父包。以下是配置示例:
java@SpringBootApplication@MapperScan(com.xiaodou.aaa.mapper, cn.dapang.bbb.mapper)public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
这样配置后,Spring Boot会自动扫描指定包及其子包下的所有接口,并将其识别为Mapper接口。
问题背景
最近在做一个springboot项目,里面使用了Spring Boot 和 mybatis,在配置 MapperScan 时遇到了问题,mapper文件分别在com.xiaodou.aaa.mapper和cn.dapang.bbb.mapper包中,我应该怎么配置才能保证两者都能扫描到呢?
解决方法
一、配置类配置
第一种方法是在 Mybatis 的配置类使用MapperScannerConfigurer来配置不同包下的Mapper接口扫描路径。示例代码如下所示:
@Configuration
public class MyBatisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
// 设置mapper文件的扫描路径
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:com/xiaodou/aaa/mapper/*.xml"));
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:cn/dapang/bbb/mapper/*.xml"));
return sqlSessionFactoryBean.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
// 配置MapperScan,指定不同包下的Mapper接口
@Bean
public MapperScannerConfigurer mapperScannerConfigurerDawang() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("com.xiaodou.aaa.mapper");
configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return configurer;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurerHuaguoshan() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("cn.dapang.bbb.mapper");
configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return configurer;
}
}
注解方法
1、书写多个配置类,每个配置类都加上注解
@Configuration
@MapperScan("com.xiaodou.aaa.mapper") // 指定第一个包的路径
public class DawangMyBatisConfig {
// 其他配置...
}
@Configuration
@MapperScan("cn.dapang.bbb.mapper") // 指定第二个包的路径
public class HuaguoshanMyBatisConfig {
// 其他配置...
}
2、可以使用一个配置类,并在该配置类上使用多个@MapperScan注解来扫描多个包。
@Configuration
@MapperScan("com.xiaodou.aaa.mapper")
@MapperScan("cn.dapang.bbb.mapper")
public class MyBatisConfig {
// 其他配置...
}
3、在使用@MapperScan注解时,也可以指定多个包路径,因为@MapperScan注解本身并不支持多个basePackages属性。所以这里我们使用数组的方式将多个包路径传递给basePackages属性。
@Configuration
@ComponentScan(basePackages = {"com.xiaodou.aaa.mapper", "cn.dapang.bbb.mapper"})
public class MyBatisConfig {
// 其他配置...
}

