【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();

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

相关文章
|
5月前
|
小程序
小程序踩坑:Setting data field "xxxx" to undefined is invalid.
小程序踩坑:Setting data field "xxxx" to undefined is invalid.
87 0
|
19天前
|
SQL Java 数据库连接
Mybatis查询 出现Unknow colum 'xxxx' in field list 解决办法
Mybatis查询 出现Unknow colum 'xxxx' in field list 解决办法
|
4月前
|
SQL IDE Java
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
MyBatis【问题 01】mapper传入array\collection\list类型的参数时报BindingException:Parameter ‘xx‘ not found问题复现及解决
55 0
|
4月前
|
小程序 前端开发 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路由配置方
54 1
|
5月前
|
JSON 小程序 API
小程序踩坑-Setting data field "list" to undefined is invalid.
小程序踩坑-Setting data field "list" to undefined is invalid.
129 0
|
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的异常为例)
|
Java Maven
invalid bound statement (not found) - 接手一个老项目时报的几个错误处理方案
invalid bound statement (not found) - 接手一个老项目时报的几个错误处理方案
159 0
invalid bound statement (not found) - 接手一个老项目时报的几个错误处理方案
|
Java 数据库连接 数据库
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
271 0
jdbc利用java反射实现结果集得到处理:bug:argument type mismatch
SpringBoot项目出现: Invalid bound statement (not found)可能原因
SpringBoot项目出现: Invalid bound statement (not found)可能原因
199 0
SpringBoot项目出现: Invalid bound statement (not found)可能原因