ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot整合mybatis报错文档记录

2021-10-13 16:00:33  阅读:219  来源: 互联网

标签:ParentRunner java SpringBoot springframework test 报错 mybatis org junit


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配置问题

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

标签:ParentRunner,java,SpringBoot,springframework,test,报错,mybatis,org,junit
来源: https://blog.csdn.net/server643/article/details/120745706

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有