【bug日记】已解决:Invalid bound statement (not found): 找不到对应的Mapper映射类

简介: 【bug日记】已解决:Invalid bound statement (not found): 找不到对应的Mapper映射类

本来是想用Springboot3整合MyBatisPlus 做一波数据处理层的简化 也就是不用再写sql语句 直接使用IService封装好的方法 做简单的curd


本来用的好好的  在一次业务迭代中 需要对复杂嵌套的json对象进行curd  


灵机一动 反手写个类型处理器吧 JSONTypeHandler  然后再把类型处理器在Data的实体类当中映射出来


然后就有了

public class JSONTypeHandler extends BaseTypeHandler<JSONObject> {
 
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toString());
    }
 
    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JSONUtil.parseObj(rs.getString(columnName));
    }
 
    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return JSONUtil.parseObj(rs.getString(columnIndex));
    }
 
    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return JSONUtil.parseObj(cs.getString(columnIndex));
    }
}

好了 为了让MyBatisPlus识别到 我写的类型处理器  要加上对应配置文件

<configuration>
    <!-- 其他配置项 -->
 
    <typeHandlers>
        <!-- 注册自定义的类型处理器 -->
        <typeHandler handler="TopOne.utils.Handler.JSONTypeHandler"/>
    </typeHandlers>
</configuration>


问题就出现了 除了这个 映射了json类型的查询可以curd以外  其他所有原生态的封装好的方法全部都不能用了!!!


可能你还不明白具体是什么概念


我们看到 这个Mapper 明明是继承BaseMapper对吧?  

我们再来看看BaseMapper里面有啥!进去看!

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);
 
    int deleteById(Serializable id);
 
    int deleteById(T entity);
 
    int deleteByMap(@Param("cm") Map<String, Object> columnMap);
 
    int delete(@Param("ew") Wrapper<T> queryWrapper);
 
    int deleteBatchIds(@Param("coll") Collection<?> idList);
 
    int updateById(@Param("et") T entity);
 
    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
 
    T selectById(Serializable id);
 
    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
 
    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
 
    default T selectOne(@Param("ew") Wrapper<T> queryWrapper) {
        List<T> list = this.selectList(queryWrapper);
        if (list.size() == 1) {
            return list.get(0);
        } else if (list.size() > 1) {
            throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
        } else {
            return null;
        }
    }
 
    default boolean exists(Wrapper<T> queryWrapper) {
        Long count = this.selectCount(queryWrapper);
        return null != count && count > 0L;
    }
 
    Long selectCount(@Param("ew") Wrapper<T> queryWrapper);
 
    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
 
    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
 
    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
 
    <P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);
 
    <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param("ew") Wrapper<T> queryWrapper);
}


这是完整的BaseMapper  看清楚那个报错说的什么Invalid bound statement (not found): TopOne.ListenerSystem.mapper.ListenerMapper.selectList  找不到selectList 方法!!!


学过Java都知道 一个子类继承他的父类 使用他父类的方法不是理所当然的吗?


这个BaseMapper的selectList 方法就好端端摆在那里   他就是用不了!说找不到! 你想一下气不气人?  不止是selectList 方法  而是那里面所有封装好的方法  就摆在那 他就是用不了!


试错


尝试过确认的东西:


1.ScannerMapper 扫描到了对应的Mapper

2.配置文件 路径正确

3.xml文件路径正确并无语法错误

4.别名扫描包确认路径无误

5.使用最新的MyBatisPlus版本

6.能用的法子都用了...


最终解决方案!已经完美解决:


在你确认了我上面的所有待确认点无误后


可以尝试  在MybatisConfig中


注意看这个地方

@Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("mybatis-config.xml"));
        return sessionFactory.getObject();
    }


只需要在你配置数据源的地方:

       SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

更改为:

       MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();

已确认 所有失效的方法全部恢复!

相关文章
|
6月前
|
小程序
小程序踩坑:Setting data field "xxxx" to undefined is invalid.
小程序踩坑:Setting data field "xxxx" to undefined is invalid.
98 0
|
前端开发
前端报错 error: unknown option `-v' 解决方法
前端报错 error: unknown option `-v' 解决方法
1523 0
|
3天前
|
Java 数据库连接 mybatis
项目移植到原先mybasis项目里出现BindingException: Invalid bound statement (not found): **selectPage
项目移植到原先mybasis项目里出现BindingException: Invalid bound statement (not found): **selectPage
|
5月前
|
小程序 前端开发 PHP
laravel8(一)Target class [XXXXXController] does not exist.错误的解决办法
Laravel 8配置好路由后,访问提示: arduino 复制代码 Target class [XXXXXController] does not exist. 错误。 出现这个错误的原因是Laravel8对路由命名空间做出了更新(详见:路由命名空间更新),而我们仍然在使用Laravel6或者7版本的方式写路由。 Laravel 8路由配置方式: php 复制代码 use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']); Laravel 6/7路由配置方
66 1
解决办法:找不到g_type_check_instance_cast
解决办法:找不到g_type_check_instance_cast
104 0
|
Java Maven
invalid bound statement (not found) - 接手一个老项目时报的几个错误处理方案
invalid bound statement (not found) - 接手一个老项目时报的几个错误处理方案
161 0
invalid bound statement (not found) - 接手一个老项目时报的几个错误处理方案
|
XML SQL Java
如何去寻找解决bug?(以Mapped Statements collection does not contain value for xxx的异常为例)
如何去寻找解决bug?(以Mapped Statements collection does not contain value for xxx的异常为例)
如何去寻找解决bug?(以Mapped Statements collection does not contain value for xxx的异常为例)
使用SpringBoot报错:Inferred type ‘S‘ for type parameter ‘S‘ is not within its bound。【解决办法】
使用SpringBoot报错:Inferred type ‘S‘ for type parameter ‘S‘ is not within its bound。【解决办法】
使用SpringBoot报错:Inferred type ‘S‘ for type parameter ‘S‘ is not within its bound。【解决办法】
|
Java 数据库连接 数据库
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
278 0
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch