在 Spring Boot 项目中,如果遇到 Invalid bound statement (not found)
错误,通常是 MyBatis 无法找到指定的 Mapper 文件或其对应的 SQL 映射语句。这类问题一般与 MyBatis 的配置或包扫描有关。下面是一些常见的原因和解决方案。
1. 确保 Mapper 接口与 Mapper XML 配置正确
MyBatis 会根据 Mapper 接口和对应的 XML 文件来查找 SQL 映射语句。如果 MyBatis 找不到相应的 XML 文件或接口,便会抛出 Invalid bound statement (not found)
错误。
解决方法:
- 确认 Mapper 接口与 XML 文件的匹配:
- 确保每个 Mapper 接口都有一个对应的 XML 文件,且文件名与接口的全路径类名相同(即路径一致,类名一致)。
- 例如:
UserMapper.java
对应UserMapper.xml
。
- 检查 Mapper XML 文件的路径:
- 确保
Mapper
XML 文件存放在正确的目录下,并且在application.properties
或application.yml
中配置了正确的路径。
- 确保
mybatis:
mapper-locations: classpath:/mappers/*.xml
或者在 application.properties
中:
mybatis.mapper-locations=classpath:/mappers/*.xml
2. 检查 MyBatis 扫描 Mapper 包的配置
Spring Boot 默认会扫描 @Mapper
注解的接口文件,或者在 @MapperScan
中指定的包路径。如果 MyBatis 无法扫描到对应的 Mapper 接口,会导致映射文件无法找到,从而抛出该异常。
解决方法:
- 检查
@MapperScan
注解:- 确保你在启动类或者配置类上添加了
@MapperScan
注解,并指定了 Mapper 接口的包路径。Spring Boot 会自动扫描这个路径下的接口,并生成相应的代理类。
- 确保你在启动类或者配置类上添加了
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 检查
@Mapper
注解:- 确保每个 Mapper 接口上都添加了
@Mapper
注解,或者在配置类中使用@MapperScan
扫描该包。
- 确保每个 Mapper 接口上都添加了
@Mapper
public interface UserMapper {
User findUserById(Long id);
}
3. 确保 MyBatis 启动配置正确
Spring Boot 的自动配置已经集成了 MyBatis,但有时你可能需要手动配置某些参数,特别是当你使用的是 jar 包时,MyBatis 可能无法找到 Mapper
文件。
解决方法:
- 配置 MyBatis 的 SQL Session Factory:
在application.properties
或application.yml
中配置mybatis.mapper-locations
和mybatis.type-aliases-package
,确保 MyBatis 正确加载了 SQL 映射文件和类型别名。
mybatis.mapper-locations=classpath:/mappers/**/*.xml
mybatis.type-aliases-package=com.example.model
- 检查 Spring Boot 启动类:
确保你没有禁用 MyBatis 自动配置。如果你手动配置了@MapperScan
,你不需要额外的配置。
4. 确保 Mapper XML 文件中的命名空间正确
MyBatis 的 XML 文件中,每个 <mapper>
标签都有一个 namespace
属性,指向对应的 Mapper 接口的完全限定名。这个 namespace
必须与 Mapper 接口的包名和类名完全一致。
解决方法:
- 检查 XML 文件中的
namespace
是否与接口类一致:
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
- 检查 XML 文件是否被正确加载:
确保你的 XML 文件没有放错位置。可以通过在application.properties
或application.yml
中配置mapper-locations
属性来确保正确加载。
5. 检查 MyBatis 版本与兼容性
有时问题可能出在 MyBatis 或 Spring Boot 的版本不兼容上,尤其是当你使用的版本不支持某些特性或配置方式时。
解决方法:
- 升级 MyBatis 和 Spring Boot 的版本:
尝试更新到较新的 MyBatis 和 Spring Boot 版本。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
- 查看 MyBatis 和 Spring Boot 的兼容性文档:
确保你使用的版本兼容。通常,更新到支持的版本会解决一些兼容性问题。
6. 确保没有其他错误导致无法加载 Mapper
如果以上方法都没有解决问题,可能是因为存在其他配置或代码错误导致无法加载 Mapper 文件。请通过日志或调试,查看具体的错误原因,确保在日志中没有其他与 Mapper 相关的异常或错误。
总结
当 Invalid bound statement (not found)
错误发生时,通常是因为 MyBatis 无法找到或加载相应的 Mapper 文件。你可以通过以下几个步骤来排查和解决问题:
- 检查 Mapper 接口与 XML 文件是否匹配。
- 配置正确的
@MapperScan
和mapper-locations
属性,确保扫描到正确的包路径。 - 确保 MyBatis 配置文件和 SQL Session Factory 配置正确。
- 检查 XML 文件中的
namespace
是否与接口匹配。 - 如果使用了
@Mapper
注解,确保每个 Mapper 接口都添加了该注解。
通过逐步排查这些问题,应该能够解决 Invalid bound statement (not found)
错误。
发表回复