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);
}
}
- Application启动类的位置应该是放在dao层或者service层的父包。因为Application启动只能扫描到该包及其子包中的类,否则整个启动都会有问题。
- 切记开启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报错:
- 添加相关的依赖包
- 在启动类下设置
@MapperScan(""...")
或者在扫描类下添加
@Mapper
- 启动类的路径
- mapper映射文件的namespace设置地址
- maven配置问题
以上总结的问题在此跟大家分享,感谢大家的阅读。