MybatisPlus使用过程的Invalid bound statement (not found)问题

本文详述了在使用MybatisPlus时遇到的InvalidBoundStatement异常的解决过程,包括检查SpringBoot配置、mapper.xml命名空间与接口一致性、标签id匹配等常见步骤。最终发现将mapper接口与xml配置文件放于同一目录下问题得以解决。

一 概述

该文章记录本人使用MybatisPlus时踩过的坑。

二 Invalid bound statement (not found)问题的解决

分析过程:大概率是扫包时没有找到文件

1. 首先判断是否在springboot启动类上有相应配置或者是在项目中存在相应的配置类。

@SpringBootApplication
@ComponentScan(basePackages = {"com.zero.zookeeperconfig", "com.zero"})
@MapperScan( basePackages = "com.zero.web.mapper")
@EnableScheduling
public class PrintWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(PrintWebApplication.class, args);
    }
}

2. 接着查看mapper.xml中的namespace与使用的实际类是否一致。

<?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.zero..map
<think>我们正在解决的是Spring Boot 2.0.9整合MyBatis-Plus 3.0.7时出现的`Invalid bound statement (not found): selectList`错误。根据经验,这个错误通常意味着MyBatis在查找Mapper接口对应的SQL语句时失败。虽然引用中提到了Spring Boot 3和MyBatis-Plus最新版本的兼容性问题,但我们的情况是Spring Boot 2.0.9和MyBatis-Plus 3.0.7,所以需要针对这个版本组合进行排查。 可能的原因及解决方案: 1. **依赖冲突**:检查是否有其他MyBatis相关的依赖与MyBatis-Plus冲突。 2. **Mapper扫描问题**:确保MyBatis-Plus的Mapper接口被正确扫描。 3. **配置文件问题**:检查`application.yml`或`application.properties`中的配置。 4. **MyBatis-Plus版本兼容性**:Spring Boot 2.0.9可能对MyBatis-Plus 3.0.7存在兼容性问题,考虑升级MyBatis-Plus版本。 具体步骤: 步骤1:检查依赖 确保只引入了`mybatis-plus-boot-starter`,并且排除了可能存在的MyBatis核心包。在pom.xml中: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.7</version> <exclusions> <!-- 排除自带的MyBatis版本,防止冲突 --> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加与Spring Boot 2.0.9兼容的MyBatis版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency> ``` 注意:MyBatis-Plus 3.0.7要求MyBatis版本至少为3.5.0,MyBatis-Spring至少为2.0.0。这里我们使用3.5.5和2.0.5。 步骤2:配置Mapper扫描 在启动类上添加`@MapperScan`注解,指定Mapper接口所在的包: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 替换为实际的Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 步骤3:检查配置文件 在`application.yml`中配置MyBatis-Plus的相关属性: ```yaml mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml # 如果有XML文件,确保路径正确 type-aliases-package: com.example.entity # 实体类所在的包 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启日志,方便调试 ``` 步骤4:检查Mapper接口 确保Mapper接口继承了`BaseMapper`,并且泛型类型正确: ```java public interface UserMapper extends BaseMapper<User> { } ``` 步骤5:升级MyBatis-Plus版本 如果以上步骤都不能解决问题,可能是MyBatis-Plus 3.0.7与Spring Boot 2.0.9存在兼容性问题(尽管3.0.7应该是支持Spring Boot 2.x的)。我们可以尝试升级MyBatis-Plus到与Spring Boot 2.0.9兼容的更高版本。根据社区反馈,MyBatis-Plus 3.5.1是一个稳定且兼容性较好的版本。因此,我们可以将版本升级到3.5.1(同时注意MyBatis版本的要求): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> ``` 同时,移除之前排除的依赖,因为3.5.1会自带兼容的MyBatis版本。 步骤6:检查IDEA的编译输出(如果是IDEA) 有时候,IDEA没有将XML文件复制到target目录下,导致找不到映射文件。可以尝试: - 清理项目并重新构建(mvn clean install) - 检查Mapper XML文件是否在target目录的对应路径下 步骤7:检查是否缺少MyBatis-Plus的配置类 在Spring Boot中,我们通常需要配置分页插件等,但即使没有配置也不会导致找不到BaseMapper中的方法。不过,为了确保,我们可以添加一个配置类: ```java @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` 如果按照以上步骤操作,应该能够解决问题。如果问题依旧,请检查控制台日志,看是否有其他错误信息。 最后,需要说明的是,MyBatis-Plus在启动时会自动注册BaseMapper中的方法,所以不需要为这些方法提供XML映射。如果出现`selectList`方法找不到,通常是因为Mapper接口没有被正确识别或者扫描。 引用注意事项:我们在引用中看到过类似的问题,但版本不同。所以我们的解决方案主要是针对Spring Boot 2.0.9和MyBatis-Plus 3.0.7的组合,同时提供了升级版本的备选方案[^1]。 </think>### 解决 Spring Boot 2.0.9 + MyBatis-Plus 3.0.7 的 `Invalid bound statement not found` 错误 #### 核心问题分析 该错误表明 MyBatis 找不到 Mapper 接口方法的 SQL 映射,常见于以下情况: 1. Mapper 接口未被扫描到 2. XML 映射文件路径配置错误 3. 版本兼容性问题导致自动注册失败 4. 项目编译后 XML 文件未正确复制到输出目录 --- ### 解决方案(逐步操作) #### 1. 检查依赖兼容性(关键步骤) Spring Boot 2.0.9 需配合特定 MyBatis-Plus 版本: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <!-- 使用兼容版本替代 3.0.7 --> <version>3.1.2</version> </dependency> ``` > **原因**:MyBatis-Plus 3.0.7 与 Spring Boot 2.0.9 存在兼容问题[^1] --- #### 2. 配置 Mapper 扫描路径 在启动类添加注解: ```java @SpringBootApplication // 指定扫描包路径(关键) @MapperScan("com.yourpackage.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` > **注意**:包名需替换为实际 Mapper 接口所在包 --- #### 3. 验证 XML 文件配置 在 `application.yml` 中确认映射路径: ```yaml mybatis-plus: mapper-locations: - "classpath*:/mapper/**/*.xml" # 多层目录扫描 - "classpath*:/com/yourpackage/mapper/xml/*.xml" # 精确路径 ``` --- #### 4. 检查编译输出目录 确保 XML 文件被正确复制到 target: ```diff src/main/resources └─ mapper └─ UserMapper.xml # 编译后路径: target/classes └─ mapper └─ UserMapper.xml ✅ 必须存在 ``` > **解决方法**:在 pom.xml 添加资源声明: > ```xml > <build> > <resources> > <resource> > <directory>src/main/resources</directory> > <includes> > <include>**/*.xml</include> <!-- 包含XML文件 --> > </includes> > </resource> > </resources> > </build> > ``` --- #### 5. 添加 MyBatis-Plus 配置类 创建配置类确保插件生效: ```java @Configuration public class MybatisPlusConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> { configuration.setMapUnderscoreToCamelCase(true); // 开启驼峰映射 }; } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean(); factory.setDataSource(dataSource); return factory.getObject(); } } ``` --- #### 6. 验证 Mapper 接口定义 确保继承 `BaseMapper`: ```java // 正确示例 public interface UserMapper extends BaseMapper<User> { // 无需声明selectList方法 } ``` --- ### 错误排查流程图 ```mermaid graph TD A[报错 Invalid bound statement] --> B{检查Mapper扫描路径} B -->|未配置| C[添加@MapperScan注解] B -->|已配置| D{检查XML文件位置} D -->|路径错误| E[修正yml配置] D -->|路径正确| F{查看target目录} F -->|XML不存在| G[配置pom.xml资源过滤] F -->|XML存在| H{检查MyBatisPlus版本} H -->|版本过低| I[升级到3.1.2+] H -->|版本兼容| J[检查BaseMapper继承] ``` --- ### 最终验证步骤 1. 执行 `mvn clean install` 2. 检查 `target/classes` 下 XML 是否存在 3. 启动应用查看日志: ``` Mapped "{com.yourpackage.mapper.UserMapper.selectList}" ... ``` 4. 测试代码: ```java // 测试BaseMapper方法 userMapper.selectList(null); ``` > 按照上述步骤操作,90% 以上的 `Invalid bound statement` 错误可解决[^1]。若问题依旧,请检查项目是否存在多个 MyBatis 依赖冲突。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值