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

SpringBoot + Mybatis系列Mapper接口注册的几种方式

Springboot集成Mybatis ID生成策略注解 @GeneratedValue

SpringBoot + PageHelper, MyBatis分页不生效解决方案

MyBatisPlus 分页插件和数据库行锁的几点思考

spring boot+mybatis+mysql