使用Mybatis-plus抛异常,解决Invalid bound statement (not found)

文章讲述了在SpringBoot集成MyBatisPlus时遇到的两种情况及解决方案。情况1是未配置mybatis-puls的mapper扫描路径,解决方法是在配置文件中添加相应路径。情况2是自定义了Config配置类中的SqlSessionFactoryBean,解决方案是将其替换为MybatisSqlSessionFactoryBean以正确初始化。

情况1:没有重新创建SqlSessionFactory的Bean

解决:在配置文件中增加mybatis-puls的mapper扫描路径即可

# MyBatis Plus 的配置项
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
  mapper-locations: classpath*:mapper/**/*Mapper.xml

情况2: 如果自己在Config配置类(例如MybatisConfig.java)中重新创建了Bean(SqlSessionFactory)

解决: 将SqlSessionFactoryBean替换为:MybatisSqlSessionFactoryBean

 

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
    String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
    String mapperLocations = env.getProperty("mybatis.mapperLocations");
    String configLocation = env.getProperty("mybatis.configLocation");
    typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
    VFS.addImplClass(SpringBootVFS.class);

    final MybatisSqlSessionFactoryBean sessionFactory2 = new MybatisSqlSessionFactoryBean();
    sessionFactory2.setDataSource(dataSource);
    sessionFactory2.setTypeAliasesPackage(typeAliasesPackage);
    sessionFactory2.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
    sessionFactory2.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
    return sessionFactory2.getObject();

    /*final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
    sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
    sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
    return sessionFactory.getObject();*/
}
<think> 首先,用户的问题是:"我想查找MyBatis-Plus批量插入时出现'Invalid bound statement (not found)'错误的解决方案"。这是在寻求解决MyBatis-Plus批量插入时遇到的特定错误。 用户提供了多个引用,我需要参考这些引用来提供解决方案。系统指令指定要使用中文回答,并生成相关问题,同时遵守LaTeX格式要求。 关键引用: - 引用[1]:提到批量插入报错"Invalid bound statement (not found): insertBatchSomeColumn",建议解决方法。 - 引用[2]:MyBatisMyBatis-Plus同时使用报错。 - 引用[3]:版本匹配问题,建议检查MyBatis-Plus和Spring Boot版本兼容性。 - 引用[4]:自定义sqlSessionFactory或sql注入器失效问题。 - 引用[5]:打包配置,确保XML文件被正确包含。 用户的核心问题是批量插入时的"Invalid bound statement (not found)"错误。常见原因包括: 1. **Mapper接口方法未定义或不匹配**:MyBatis-Plus的批量插入方法如`insertBatchSomeColumn`可能需要正确配置。 2. **XML映射文件问题**:XML文件未正确加载或路径错误。 3. **版本兼容性**:MyBatis-Plus与Spring Boot版本不匹配。 4. **配置问题**:如自定义SqlInjector未生效或SQL注入器失效。 5. **资源打包**:项目中XML文件未被正确包含在打包中。 解决方案步骤: 1. **检查Mapper接口**:确保定义了正确的批量插入方法。例如,MyBatis-Plus的`BaseMapper`提供了`insertBatchSomeColumn`方法。引用[1]提到这个具体方法。 2. **XML映射文件**:确认XML文件存在且路径正确。引用[5]建议添加打包配置,确保XML文件被包含。 ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> ``` 3. **版本兼容性**:检查MyBatis-Plus和Spring Boot版本是否兼容。引用[3]指出使用`mybatis-plus-spring-boot3-starter`特定版本,如`3.5.10.1`。 4. **自定义SqlInjector**:如果使用了自定义SQL注入器,如引用[4]所述,确保正确配置。例如,添加自定义方法如`insertList`。 5. **同时使用MyBatisMyBatis-Plus**:引用[2]提到冲突问题。可能需要排除冲突依赖或统一配置。 结构化回答: - 由于系统指令指定回答结构清晰,我应逐步解释。 - 第一步:确认错误原因。 - 第二步:提供解决方案列表。 - 第三步:总结。 - 最后,生成相关问题。 确保使用中文。 LaTeX格式:行内数学用$...$,独立公式用$$...$$,但这个问题可能不需要大量数学,所以可能很少使用。 添加引用标识:例如[^1]。 完整回答结构: 1. 引言:简述问题。 2. 解决方案步骤。 3. 总结。 4. 生成相关问题。 生成相关问题:基于主题,如优化、性能等。 最终回答: - 参考引用:引用[1]到[5]。 - 解决方案:综合引用内容。 </think> ### MyBatis-Plus批量插入报错"Invalid bound statement (not found)"的解决方案 该错误通常表示MyBatis-Plus无法找到XML映射文件中定义的SQL语句,导致批量插入方法(如`insertBatchSomeColumn`)调用失败。主要原因包括Mapper接口与XML映射文件不匹配、版本兼容性问题、资源打包配置错误或自定义SQL注入器失效。以下是基于引用资料的逐步解决方案: #### 1. **检查XML映射文件配置** - **问题**:XML文件未正确加载或路径错误,导致MyBatis找不到绑定的SQL语句[^1][^5]。 - **解决方法**: - 确保Mapper接口(如`UserMapper.java`)与XML文件(如`UserMapper.xml`)同名且在同一目录下。 - 在`pom.xml`中添加资源打包配置,确保编译时包含XML文件: ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> ``` 这会强制Maven打包时包含`src/main/java`目录下的所有XML文件[^5]。 #### 2. **验证版本兼容性** - **问题**:MyBatis-Plus与Spring Boot版本不兼容(尤其在Spring Boot 3中),引发绑定异常[^3]。 - **解决方法**: - 检查并更新依赖。例如,对于Spring Boot 3,使用兼容的Starter包: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.10.1</version> <!-- 确保版本匹配 --> </dependency> ``` - 参考官方文档确认版本矩阵,避免使用网上的非官方解决方案[^3]。 #### 3. **排查自定义SQL注入器问题** - **问题**:自定义`SqlInjector`未生效,导致批量插入方法(如`insertBatchSomeColumn`)未被注入[^4]。 - **解决方法**: - 确保自定义注入器类(如`CustomerSqlInjector`)被Spring管理,使用`@Component`或`@Bean`注解: ```java @Component public class CustomerSqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) { List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo); methodList.add(new BatchInsertByList("insertBatchSomeColumn")); // 方法名需与Mapper接口一致 return methodList; } } ``` - 检查方法名是否与Mapper接口定义匹配(如`insertBatchSomeColumn`)[^4]。 #### 4. **避免MyBatisMyBatis-Plus冲突** - **问题**:同时使用MyBatis原生和MyBatis-Plus依赖时,Mapper绑定冲突[^2]。 - **解决方法**: - 统一使用MyBatis-Plus的`BaseMapper`,避免混用原生MyBatis的Mapper接口。 - 在`application.properties`中配置MyBatis-Plus为主Mapper扫描器: ```properties mybatis-plus.mapper-locations=classpath*:mapper/**/*.xml ``` #### 5. **确认批量插入方法调用** - **问题**:调用了未定义的方法(如`insertBatchSomeColumn`未在XML中声明)[^1]。 - **解决方法**: - 在Mapper接口中明确定义方法: ```java public interface UserMapper extends BaseMapper<User> { int insertBatchSomeColumn(List<User> list); // 方法名需与XML中的id一致 } ``` - 在XML文件中添加对应的SQL语句: ```xml <insert id="insertBatchSomeColumn"> INSERT INTO user (name, age) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.age}) </foreach> </insert> ``` #### 总结 此错误多由配置疏忽引起,优先级建议:先检查XML打包配置[^5],再验证版本兼容性[^3],最后排查自定义注入器[^4]。若上述步骤无效,检查项目依赖冲突(如MyBatisMyBatis-Plus共存)[^2]。实践中,确保Mapper接口、XML文件和方法名严格一致是关键[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lin_XXiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值