前言
最近使用springboot+mybatis创建了一个项目试着玩一玩,结果就出现了玄学问题。我觉得有必要记录下来。第一个就是 @MapperScan()注解失效 ,第二个就是在service里注入mapper居然报红。第三个就是配置实体类的包IDEA居然不识别,具体情况下面再说。
过程
项目的创建没有什么问题,如今springboot都已经出到2.2.5版本了,我就稍稍往前,用一用2.1.7版本。首先,去掉tomcat,加上undertow,然后直接启动,发现失败了,一看报错,这意思似乎是没有连接数据库,我记得搁以前,好像不用数据库连接就能启动,也不知道是不是我记错了。
配置好数据库,启动,没毛病,完美运行。然后就是使用mybatis来试一试,也没什么好配置的,就是一个实体类包名,mapper.xml文件位置,这都没啥。接下来就是写mapper接口,写service。然后我也是看别人的,这叫优雅的整合mybatis,使用@MappperScan注解,告诉springboot有关mapper的接口都在这里面。
可是,万万没想到,我一启动,它告诉我,在这个包里没有扫描到mapper。这不是搞笑呢,怎么会找不到呢。后来,我灵机一动,不用@MapperScan注解,在mapper接口上写@mapper注解,这样就能正常启动了。
但是吧我不知道怎么就发现了,service里注入的mapper报红,虽然它不影响运行,但是我看着就是很不舒服,于是,我就找各种解决办法,发现还是网友神通广大,确实有解决办法,比如我搜的前几条都是选择将IDEA的提示error级别降低,变成warning级别,我总感觉这种不好,就继续找解决办法,没想到还真有看起来更靠谱的解决办法。
有这么几种解决办法:
- 使@Autowired注解允许null,即 @Autowired(required = false).
- 使用构造器的方式注入。
- 使用 @Resource
当然,还有的大神说安装mybatis plugins就行,一装就好,但是我找不到这个插件,只找到了Free mybatis plugins,而且这个似乎不行。我倒是比较相中这个第三种,简单,好使。
玄学出现了
在我搜索上述问题的时候,神奇的事情发生了,@MapperScan这个注解又好使了。这是个极其神奇的事情。我记得,我刚开始是@MapperScan(“com.xxx”)这样写,不好使,我又这样写@MapperScan(basePackages = “com.xxx”),它就行了,好使了。然后我又把basePackages去掉,居然还能用,没有什么区别,这就很疑惑了,我来来回回换了几遍,都没有问题。这真是让我摸不着头脑。也不知道下次会出现什么玄学。
还有就是理论上当我在application.yml文件中
mybatis:
type-aliases-package: com.xiumu.model.entity
一旦配置完这个,那么我在mapper.xml文件中parameterType属性只需要写实体类名就可以。但是吧,IDEA表示拒绝,写实体类名就是要标红。插入,查询确实没有什么问题。但是吧,看着这个标红实在是不得劲。开发时间比较紧,我就先不管它了。