SpringBoot整合mybatis报错文档记录

  • Post author:
  • Post category:其他




SpringBoot整合mybatis报错文档记录

以下是自己耽搁了好些时辰整理的报错信息,望大家参考借鉴即可,本文主要以笔记的形式给自己作为参考。



1、项目的整理结构

在这里插入图片描述

在pojo设置User类,创建Dao层接口@Autowired注入创建实例并在UserDaoTest类上进行测试。



1.1 添加依赖pom文件

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

这里我的将springboot包用的是2.0.0版本,mybatis-spring-boot-starter使用的是1.3.2版本。



1.2

application.properties

下的文档

# mybatis 别名扫描
mybatis.type-aliases-package=com.xaf.pojo
# mapper.xml文件位置,如果没有映射文件,请注释掉
mybatis.mapper-locations=classpath:mappers/*.xml

因为是整合mybatis且创建maven项目。这里的资源放在rsources下的mappers包。

这里要切记路径与项目的实际路径保持一致



1.3 进入Application启动类下

@SpringBootApplication
@MapperScan("com.xaf.dao")
public class Application{
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
  1. Application启动类的位置应该是放在dao层或者service层的父包。因为Application启动只能扫描到该包及其子包中的类,否则整个启动都会有问题。
  2. 切记开启MapperScan扫描,这个注解是为了扫描到mapper.java文件或者是添加了@mapper注解的java类。

比如这里:

@Mapper
public interface UserDao {
    public List<User> findAll();
}



1.4 mapper映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xaf.dao.UserDao">
    <select id="findAll" resultType="User">
        select * from tb_user
    </select>
</mapper>



1.5 Test测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserDaoTest {

    @Autowired()
    private UserDao userDao;

    @Test
    public void testFindAll(){
        List<User> list = userDao.findAll();
    }
}

配置好启动类,创建好接口后便进行测试实例。调用UserDao接口中的testFindAll方法。

我自己看起来没觉得有什么错误,接下来就是分析报错。



2、报错信息

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xaf.dao.UserDao.findAll

	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227)
	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49)
	at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
	at com.sun.proxy.$Proxy78.findAll(Unknown Source)
	at com.xaf.dao.UserDaoTest.testFindAll(UserDaoTest.java:21)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
	at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

整体报错的反馈就是:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xaf.dao.UserDao.findAll

如果上面都没有问题但是仍然报错,报错的信息是IDEA无法找到mapper的映射文件所导致的。这里可以查看target包下验证猜想:

在这里插入图片描述

果然,我原本放在resources下的mappers下的UserDao.xml在编译的时候没有被打包到classes文件里面。

经过我个人的修改后,我这里可以查看一下项目结构:

在这里插入图片描述

大概是这样的,如果有小伙伴出现把xml放置在src\main\java,可以设置如下:

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/ *.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

当然如果还有别的文件也可以增加

<include></include>

标签即可。

这样子编译后是这样子的:

在这里插入图片描述

项目运行成功!



3、总结

整合mybatis报错:

  1. 添加相关的依赖包
  2. 在启动类下设置

    @MapperScan(""...")

    或者在扫描类下添加

    @Mapper
  3. 启动类的路径
  4. mapper映射文件的namespace设置地址
  5. maven配置问题

以上总结的问题在此跟大家分享,感谢大家的阅读。



版权声明:本文为server643原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。