Mybatis 如何扫描多个包下的mapper,

在毕业设计中遇到Mapper未被扫描的问题,错误源于Mapper接口未配置到IOC容器。解决办法是在Mybatis的basePackage中用逗号或分号指定多个包路径,实现递归扫描。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天做毕业设计的时候,添加了一个mapper到项目中,然后发现报了一个错误:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'defaultParamController': Injection of autowired dependencies failed;
 nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: 
 com.zyj.web.service.defaultParam.controller.DefaultParamController.defaultParamService; nested exception is 
Error creating bean with name 'defaultParamServiceImpl':
 Injection of autowired dependencies failed; nested exception is 
public com.zyj.web.service.defaultParam.mapper.DefaultParamExtendsMapper 
com.zyj.web.service.defaultParam.service.impl.DefaultParamServiceImpl.defaultParamExtendsMapper;
 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 expected at least 1 bean which qualifies as autowire candidate for this dependency.
  Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

追根究底就是mapper没有被扫描到,而原先我以为的是@autowired注解的bean没有配置进IOC容器中,结果居然是mapper没有被扫描到,接下来解决这个问题的方法就是:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        <property name="basePackage" 
        value="com.zyj.authorization.mapper,com.zyj.web.service.defaultParam.mapper"></property>
    </bean>

在basePackage中使用逗号或者分号作为分隔符去给映射器接口文件设置多个包的路径,让其能够被递归扫描到。

### MyBatis 中配置多扫描的方法 在 Spring Boot 和 MyBatis 的集成开发中,`@MapperScan` 注解用于指定 Mapper 接口所在的路径。如果项目中有多个 Mapper 接口分布在不同的中,则可以通过 `@MapperScan` 提供多种方式来支持多扫描。 #### 使用逗号分隔多个路径 最简单的方式是在 `@MapperScan` 注解中通过逗号分隔多个路径。例如: ```java @MapperScan(basePackages = {"com.example.mapper1", "com.example.mapper2"}) public class MyBatisConfig { } ``` 这种方式适用于数量较少的情况[^4]。 #### 使用数组形式定义多个路径 另一种方法是使用数组的形式显式声明多个路径。这种方法更加直观且易于维护: ```java @MapperScan(basePackages = { "com.example.mapper1", "com.example.mapper2" }) public class MyBatisConfig { } ``` 此方法同样可以满足多扫描的需求,并且代码可读性更高。 #### 动态加载路径 对于更复杂的场景,比如需要动态决定哪些扫描,可以在运行时计算这些路径并通过自定义 Bean 来完成配置。例如: ```java @Configuration public class DynamicMapperScannerConfigurer extends MapperScannerConfigurer { @Override public void setBasePackage(String basePackage) { String[] packagesToScan = new String[]{ "com.example.mapper1", "com.example.mapper2" }; super.setBasePackage(StringUtils.arrayToCommaDelimitedString(packagesToScan)); } } ``` 这种方案适合于那些无法提前固定结构的应用程序。 #### 结合 XML 配置 除了基于注解的配置外,还可以通过 MyBatis 的 XML 文件手动设置 `<package>` 节点来实现多扫描功能。例如: ```xml <mappers> <package name="com.example.mapper1"/> <package name="com.example.mapper2"/> </mappers> ``` 上述 XML 片段会告诉 MyBatis扫描指定的两个中的所有 Mapper 接口[^1]。 --- ### 总结 以上介绍了四种常见的 MyBatis扫描配置方法: 1. **直接用逗号分隔字符串**; 2. **采用数组形式逐一列举名**; 3. **借助扩展类动态调整列表**; 4. **利用 XML 显式声明需扫描范围**。 每种方法各有优劣,开发者应根据实际需求灵活选用合适的策略。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值