mybatis-plus执行自定义sql报 Invalid bound statement错误怎么办

        Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再重写这些简单的sql语句。

        Mybatis-plus自带的条件构造器虽然很强大,在项目实战的时候,各种复杂的应用场景,你肯定避免不了要写稍微复杂一点的sql语句,又或者一些朋友习惯通过写sql来操作数据,于是我们就需要在使用mybatis-plus的基础上自定义sql语句。

        今天在使用自定义sql语句的时候,报了一个错误:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ztt.mapper.UserMapper.selectByPrimaryKey
    at com.baomidou.mybatisplus.core.override.PageMapperMethod$SqlCommand.(PageMapperMethod.java:261) ~[mybatis-plus-core-3.0.6.jar:3.0.6]

        遇到错误,解决错误,于是按照传统的步骤开始排查:

        【1】检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;

        【2】检查xml的namespace是否和xml文件的package名称一一对应;

        【3】检查方法名称是否对应;

        检查完之后,并没有出现上面的问题,那么猜测报无效绑定异常可能与mybatis-plus的配置有关。

        于是debug一下查看相关源码。

        在启动项目debug,创建SqlSessionFactory Bean的过程中,看到了下面这一块代码:

mybatis-plus执行自定义sql报 Invalid bound statement错误怎么办_第1张图片

        看到mapperLocations这个属性的时候,凭着六级英语的水平,条件反射的想到这应该就是处理mapper映射文件位置的。在debug的过程中,可以清楚的看到mapperLocations的属性为null。这我就纳闷了,yml文件里配置的好好的路径,如下,为什么这里还为null呢?那只能说明创建SqlSessionFactory的时候,没有读到或者没有用这里的配置,具体为啥,我也不知道。

mybatis-plus:
  typeAliasesPackage: com.ztt.entity
  mapperLocations: classpath:mapper/*.xml

       那么,该如何解决呢?

       那就在创建SqlSessionFactory Bean的时候,去指定mapper文件的位置不就了。下面是我配置SqlSessionFactory的代码,注意标红位置。

@Configuration
public class MybatisPlusConfig {

    @Bean(name = "globalConfig")
    @Primary
    public GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        return globalConfig;
    }

    @Bean("sqlSessionFactory")
    @Primary
    public SqlSessionFactory dbSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource, GlobalConfig globalConfig) throws Exception {
        // MybatisSqlSessionFactoryBean
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setGlobalConfig(globalConfig());

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        // 需要在这里指定xml文件的位置,不然自定义的sql会报Invalid bound statement异常
        factoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/*Mapper.xml"));

        // 导入mybatis配置
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        // 配置打印sql语句
        mybatisConfiguration.setLogImpl(StdOutImpl.class);
        factoryBean.setConfiguration(mybatisConfiguration);

        return factoryBean.getObject();
    }
}

        修改完代码之后,再启动debug一下,可以看到mapperLocations以经有了值,具体属性的含义也很见名知意,这里就不多说了。

mybatis-plus执行自定义sql报 Invalid bound statement错误怎么办_第2张图片

        启动项目之后,再执行一下自定义sql,发现,错误以及解决了。 

 

        注:这个异常其实很难排查的,大部分时间都耗在了配置文件排错上面。除了以上原因之外,还有很多其它原因会导致这个异常,比方说实体属性和表字段不一样时没有做映射,也会报这个错。

你可能感兴趣的:(开发足迹,mybatis,mysql,mybatis)