springboot集成mybatis的几点问题
Posted 流云一号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot集成mybatis的几点问题相关的知识,希望对你有一定的参考价值。
最近,在springboot集成mybatis的过程中,遇到了几个问题,现总结一下。
问题1:找不到bean。
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.read.mybatis.dao.OrderDao',报错截图如下:
问题原因:需要的bean没有生成并注入。
解决方式:
1、对应的mapper类上加@mapper注解。
2、SpringBoot的启动类上标注@MapperScanner,指定需要扫描的mapper类。
试了一下两种方案,均能解决问题。
总结:
@Mapper:在dao接口类中,添加此注解;麻烦的在于,每个dao接口类都必须添加此注解;
@MapperScan:可以指定要扫描的dao接口类的路径,可以在启动类中添加此注解,可替代@Mapper注解(此模块内dao接口类不用都添加@Mapper注解)
问题2:找不到mapper.xml文件里对应的方法。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.read.mybatis.dao.OrderDao.getOrders,报错截图如下:
问题原因:
检查了mapper的namespace配置的也没有问题,仔细检查了相应代码也没有发现问题。最后发现mapper.xml文件并未被编译进去,如图:
解决方式:
1、由于mapper.xml文件在src/main/java下面,maven打包的时候会默认为里面只有Java文件,而不会打包xml文件,需要配置pom.xml文件,在<build>标签里面添加如下内容:
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
修改后,测试,问题解决。另外,也可以把mapper.xml文件放到resources目录下,然后在配置文件里通过mybatis.mapper-locations指定位置,如图:
同样,经过测试也可以解决问题。
总结:启动类上配置了@MapperScan(扫面mapper类的路径)和pom.xml中放行了mapper.xml后,如果mapper类和mapper.xml在同一个路径下时,配置mapper-locations没有意义;
如果mapper类和mapper.xml不在同一个路径下时,mapper-locations就有用了(前提也得有pom.xml中放行了mapper.xml),在application.properties中配置
mybatis.mapper-locations,用mapper-locations指定mapper.xml的路径,OK。
以上是关于springboot集成mybatis的几点问题的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot + Mybatis系列Mapper接口注册的几种方式
Springboot集成Mybatis ID生成策略注解 @GeneratedValue