MybatisPlus引用BaseMapper中的方法报错: BindingException: Invalid bound statement (not found):

在项目中使用Mybatis的BaseMapper接口方法时遇到问题,最初由于错误地引用了mybatis-plus-extension模块导致报错。经过排查,发现是依赖版本问题,将依赖更改为mybatis-plus-boot-starter后问题得到解决。

项目场景:

尝试使用Mybatis中的BaseMapper中的方法,代码如下:

@Slf4j
@Service
public class PositionService  {

    @Autowired
    PositionMapper positionMapper;

    public Result getPositionList(){

        log.info("getPositionList request running .... 焯!");
        QueryWrapper<Position> queryWrapper = new QueryWrapper<>();
        List<Position> positions = positionMapper.selectList(queryWrapper);
        log.info("getPositionList result : {}", JSONObject.toJSONString(positions));

        return Result.ok(positions);
    }


}
@Mapper
@Repository
public interface PositionMapper  extends  BaseMapper<Position>{

    @Select("select * from position")
    List<Position> getPositionList();

}

问题描述:

新起的一个Module,pom引用的老的module的依赖 没注意看 报了一下午的错 就是找不到原因,心态要炸了。。。。。。最后果然 是因为一个小问题。。。。。


原因分析:

经过多次和其他模块的对比,依赖引用错了。。。。

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.2.0</version>
            <scope>compile</scope>
         </dependency>


解决方案:

把上面那个依赖换成mybatis的依赖:

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

<think> 首先,用户的问题是关于在使用MyBatis-Plus时,调用service.list方法报错:"Invalid bound statement (not found): selectList"。我需要基于给定的引用提供解决方案。 回顾引用: - 引用[1]:提到了绑定的语句无效错误,具体到selectList方法。 - 引用[2]:讨论了解决类似错误,如selectPage和selectList的报错。 - 引用[3]:解释了错误是因为mapper接口没有被正确扫描和注册。 - 引用[4]:类似错误,涉及selectByNames方法。 - 引用[5]:在若依框架中,MyBatis-Plus的baseMapper方法报错,原因是框架使用原生MyBatis的SqlSessionFactoryBean,而不是MyBatis-Plus的MybatisSqlSessionFactoryBean,导致无法识别MyBatis-Plus功能。 用户的问题特定于调用service.list方法报错selectList。list方法MyBatis-Plus的IService接口中定义,它内部调用baseMapper.selectList方法。 关键点: - 错误 "Invalid bound statement (not found): selectList" 表明MyBatis找不到对应的SQL映射。 - 常见原因包括mapper接口没有被扫描、配置错误、或框架冲突(如引用[5]所示)。 从引用中提取解决方案: - 引用[3]:检查mapper接口是否正确扫描。 - 引用[5]:确保使用MybatisPlus的SqlSessionFactoryBean,而不是原生MyBatis的。 具体步骤: 1. **检查Mapper扫描配置**:确保在Spring Boot的启动类或配置类中,有@MapperScan注解指定mapper包的路径。例如:@MapperScan("com.example.mapper")。 2. **检查SqlSessionFactory配置**:根据引用[5],如果在框架中使用原生的MyBatis SqlSessionFactoryBean,需要替换为MybatisPlusMybatisSqlSessionFactoryBean。在配置类中,应该有类似: ```java @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 其他配置 return sessionFactory.getObject(); } ``` 3. **检查依赖**:确保pom.xml或build.gradle中包含MyBatis-Plus的starter依赖,例如: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` 4. **检查Mapper接口和方法**:确保mapper接口继承了BaseMapper<T>,并且方法名正确。例如: ```java public interface BsmMapper extends BaseMapper<Bsm> {} ``` 5. **检查XML文件(如果有)**:虽然MyBatis-Plus支持自动生成SQL,但如果自定义了SQL,需要确保XML文件在正确位置,并包含selectList的映射。 6. **清理和重建项目**:有时IDE缓存可能导致问题,尝试清理并重新构建项目。 7. **日志级别**:启用DEBUG日志查看详细错误信息。 回答结构: - 清晰、步骤化。 - 使用中文。 - 添加引用标识。 - 生成相关问题。 最终回答: - 解释错误原因。 - 列举解决方案步骤。 - 引用相关引用。 生成相关问题: - 例如:如何配置MyBatis-Plus的Mapper扫描?MyBatis-Plus依赖冲突如何处理? </think> ### MyBatis-Plus调用service.list方法报错 "Invalid bound statement (not found): selectList" 的解决方案 该错误通常表示MyBatis-Plus无法找到对应的SQL映射语句(即`selectList`方法未被正确绑定到mapper接口)。常见原因包括:mapper接口未被扫描、SQLSessionFactory配置错误、依赖冲突或框架集成问题。以下是基于引用和最佳实践的逐步解决方案: #### 1. **检查Mapper接口是否被正确扫描** - MyBatis-Plus需要显式扫描mapper接口包。确保在Spring Boot启动类或配置类中添加`@MapperScan`注解: ```java @SpringBootApplication @MapperScan("com.hikvision.basicframe.mapper") // 替换为您的mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - **注意事项**: - 包路径必须与mapper接口(如`bsmMapper`)的包名完全匹配。 - 如果使用XML映射文件,确保`application.properties`中配置了`mybatis-plus.mapper-locations=classpath*:mapper/**/*.xml`。 - 引用[3]指出,此错误常因mapper未被扫描导致[^3]。 #### 2. **验证SqlSessionFactory配置(关键步骤)** - MyBatis-Plus必须使用`MybatisSqlSessionFactoryBean`而非原生MyBatis的`SqlSessionFactoryBean`,否则无法识别`selectList`等增强方法: ```java @Configuration public class MybatisPlusConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml")); return sessionFactory.getObject(); } } ``` - **注意事项**: - 如果项目原本使用原生MyBatis(如引用[5]中的若依框架),务必替换原有的`SqlSessionFactoryBean`为`MybatisSqlSessionFactoryBean`。 - 引用[5]强调,原生配置无法支持MyBatis-Plus的CRUD方法[^5]。 #### 3. **检查依赖和版本兼容性** - 确保`pom.xml`中包含MyBatis-Plus启动器依赖,避免版本冲突: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.6</version> <!-- 使用最新稳定版本 --> </dependency> ``` - **注意事项**: - 移除可能冲突的依赖(如原生MyBatis的`mybatis-spring-boot-starter`)。 - 运行`mvn dependency:tree`检查依赖树是否有冲突。 #### 4. **确认Mapper接口继承关系** - service.list方法内部调用`baseMapper.selectList()`,因此mapper接口必须继承`BaseMapper<T>`: ```java public interface bsmMapper extends BaseMapper<Bsm> { // 无需定义selectList,BaseMapper已提供 } ``` - **注意事项**: - 实体类`Bsm`需添加`@TableName`注解指定表名。 - 引用[4]表明,方法名错误或未继承会导致绑定失败[^4]。 #### 5. **其他排查步骤** - **清理构建缓存**:执行`mvn clean install`或清理IDE缓存(如IntelliJ的`File > Invalidate Caches`)。 - **启用DEBUG日志**:在`application.properties`添加: ``` logging.level.com.baomidou.mybatisplus=DEBUG logging.level.org.apache.ibatis=DEBUG ``` 查看日志确认mapper加载详情。 - **检查XML文件(如自定义SQL)**:确保XML中的`<select id="selectList">`与接口匹配,且路径正确。 #### 总结 此错误主要源自配置问题(扫描缺失或工厂类错误),遵循以上步骤通常可解决。引用[2]和[3]均证实这些措施的有效性[^2][^3]。如果问题依旧,请提供更多上下文(如完整配置日志)。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值