一.问题
使用IDEA在springboot项目的dao层用到 Mapper注解和Param注解, 报红.
按照这两个注解所属的包写出import语句,
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
ibatis报红。说明mybatis依赖出问题
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
这个依赖在我写dao层之前已经不报红了:此前用maven配置的aliyun镜像自动下载失败(报红),于是我找到官方仓库https://mvnrepository.com,手动下载并执行mvn install命令添加依赖到本地仓库
但是此时才发现
这里的版本1.3.0 竟然不支持导包 org.apache.ibatis
二. 解决了导包问题的同时, 又给项目带来新问题(看正解请跳过这里,直接看第三节)
没有改版本1.3.0, 而是添加新的依赖mybatis 3.4.6
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!--mybatis 3.4.6 使Mapper和Param生效-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mybatis-spring 2.0.0 使MapperScan生效-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.0</version>
</dependency>
这样虽然解决了导包问题, 但是启动项目竟然报错 , 不能找到dao接口 (明明加了@Mapper注解):
A component required a bean of type ‘XXX’ that could not be found
为了解决这个报错, 我在启动类分别尝试加了 @MapperScan注解 和 @ComponentScan注解, 又带来新问题:
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required
三.正解
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
将版本 1.3.0 改为 1.3.2 可以导包 org.apache.ibatis 并且不会带来新的问题
四.分析
1.第二节的失败原因分析
我的项目下载的 mybatis-spring-boot-starter 1.3.0 不包含(或关联)其他的包,据此推测我单独引入的mybatis 和 mybatis-spring, 与 mybatis-spring-boot-starter 1.3.0并不兼容,导致了解决旧问题又出现新问题
2.第三节分析
mybatis-spring-boot-starter 1.3.2 包含(或者叫关联)了 mybatis 和 mybatis-spring 等
3.不同的mybatis-spring-boot-starter 1.3.0
这个项目源于 尚硅谷周阳老师的SpringCloud(H版&Alibaba)课程,
周老师课程项目源码地址 https://github.com/zzyybs/atguigu_spirngcloud2020
周老师的项目使用了mybatis-spring-boot-starter 1.3.0版本, 居然像我下载的1.3.2一样,包含了多个同样的包(只是其中部分包的版本有一点区别)
为什么我自己构建的项目下载mybatis-spring-boot-starter 1.3.0之后不包含任何包呢?
可能是因为我是手动从国外仓库https://mvnrepository.com下载的,
而打开周老师的项目时,这个依赖是自动下载的,但是我查看 https://maven.aliyun.com/mvn/search,还是没找到 mybatis-spring-boot-starter 1.3.0
4.总结
当一个依赖被成功添加,却在项目中不起作用时,
如果轻易添加新的依赖虽能解决当下问题,但难以保证两个依赖之间的兼容性和互补程度,可能会遇到接二连三的问题。
此时应优先考虑:查看Dependency Analyzer分析依赖关联的包, 尝试更换这个依赖的版本。