SpringBoot2整合MyBatis时BookMapper无法注入的问题求助
问题现象
项目启动时报错,提示找不到BookMapper类型的Bean:
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-10-05T18:47:51.471+08:00 ERROR 26348 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :APPLICATION FAILED TO START
Description:
Field bookMapper in com.yzd.boot.service.BookService required a bean of type 'com.yzd.boot.mapper.BookMapper' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)Action:
Consider defining a bean of type 'com.yzd.boot.mapper.BookMapper' in your configuration.
相关代码片段
Mapper接口
@Mapper public interface BookMapper { public Book getBook(Integer bookId); }
BookMapper.xml
<mapper namespace="com.yzd.boot.mapper.BookMapper"> <!-- public Book getBook(Integer bookId);--> <select id="getBook" resultType="com.yzd.boot.bean.Book"> select * from t_book where book_id = #{bookId} </select> </mapper>
Service层
@Service public class BookService { @Autowired private BookMapper bookMapper; public Book getBook(Integer bookId){ Book book = bookMapper.getBook(bookId); return book; } }
Controller层
@Controller public class IndexController { @Autowired private BookService bookService; @ResponseBody @RequestMapping("/acct") public Book getBook(@RequestParam("id") Integer id){ Book book = bookService.getBook(id); return book; } }
application.yaml配置
#Two rules of MyBatis mybatis: config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml
已尝试的无效方案
- 在启动类添加
@MapperScan注解,报错提示需要sqlSessionFactory或sqlSessionTemplate:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookMapper' defined in file [D:\code-storage\idea\java\boot02-web-dev\target\classes\com\yzd\boot\mapper\BookMapper.class]: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:713) ~[spring-beans-6.0.11.jar:6.0.11]
... 39 common frames omitted
- 检查target目录确认Mapper文件存在,问题依旧
- 在Mapper接口添加
@Repository注解,无效
有效解决方案
方案1:确保使用MyBatis SpringBoot Starter依赖
SpringBoot2整合MyBatis必须使用官方starter,而非单独引入MyBatis核心包,starter会自动配置SqlSessionFactory等核心Bean。在pom.xml中添加:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> <!-- 适配SpringBoot2.x的稳定版本 --> </dependency>
方案2:补全数据源配置
SpringBoot无法自动创建SqlSessionFactory的核心原因通常是缺失数据源配置,在application.yaml中添加完整的数据库连接信息:
spring: datasource: url: jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 username: 数据库用户名 password: 数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver
方案3:修正@MapperScan扫描路径
若使用@MapperScan,需确保扫描路径精确覆盖Mapper接口所在包:
@SpringBootApplication @MapperScan("com.yzd.boot.mapper") // 精确指向Mapper接口所在的包 public class Boot02WebDevApplication { public static void main(String[] args) { SpringApplication.run(Boot02WebDevApplication.class, args); } }
方案4:移除冲突的MyBatis自定义配置
若没有特殊自定义需求,可直接删除application.yaml中的config-location配置,避免自定义mybatis-config.xml覆盖SpringBoot的自动配置逻辑。
验证步骤
- 清理target目录,重新编译项目
- 启动项目,确认无Bean找不到的报错
- 调用
/acct?id=1接口,验证查询功能正常
内容的提问来源于stack exchange,提问作者yzd11

