zoukankan      html  css  js  c++  java
  • BindingException: Invalid bound statement (not found)问题排查:SpringBoot集成Mybatis重点分析

    重构代码,方法抛出异常:BindingException: Invalid bound statement (not found)

    提示信息很明显:mybatis没有提供某方法

    先不解释问题原因和排查过程,因为使用SpringBoot集成Mybatis,主要配置点如下:

    MyBatis 的真正强大在于它的映射器Mapper,它是开发者用于绑定映射语句(sql)的接口,而映射语句常规两种写法:annotation 和 xml 配置;

    如果单纯使用annotation的方式,最主要是关心mapper java文件;

    但是我们推荐sql配置在xml中,强大的逻辑判断、字段映射、sql复用...

    1、mapper xml文件的扫描

    如果使用xml配置sql,需要告诉SpringBoot扫描这些xml,常用以下两种配置方法

    方法一:配置文件指定扫描路径(推荐

    1 mybatis:
    2   mapper-locations: classpath:mapping/*.xml  #注意:一定要对应mapper映射xml文件的所在路径
    3   type-aliases-package: com.winter.model  # 注意:对应实体类的路径

    方法二:配置 SqlSessionFactory

    Mybatis万能的SqlSessionFactory接口(还有一个SqlSession接口,他俩是mybatis的核心),直接在他里面指定xml路径

    @Autowired
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource,
                                                       PageHelper pageHelper) throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        /** 添加mapper 扫描路径 */
        PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "/sql/*.xml";
        sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
        /** 设置datasource */
        sqlSessionFactoryBean.setDataSource(dataSource);
    
        sqlSessionFactoryBean.setPlugins(new Interceptor[] { pageHelper });
        return sqlSessionFactoryBean;
    }

    2、mapper接口的扫描

    mapper接口是真正的java接口,使用动态代理,虽然只是接口定义,却实现了真正的sql执行、响应结果映射封装等,需要告诉SpringBoot扫描这些mapper接口,常用以下两种配置方法

    方法一:接口上添加注解(推荐

    @Mapper
    public interface PermissionMapper {
      ... 略 ...
    }

    方法二:指定扫描包路径

    @MapperScan("com.XXX.XXX.services.mapper")

    总之,SpringBoot中注意xml和mapper接口的扫描配置。

     

    出现:BindingException: Invalid bound statement (not found) 这种异常,问题排查步骤:

    1、先确认如上两个配置是否正常;

    2、检查mapper文件,方法是否存在

    3、检查xml文件,id=方法名 的sql是否存在,该xml对应的mapper接口是否存在

     

    注意:

    如果sql通过annotation注解写在mapper接口上,同时也使用了xml的方式,注意id不能重复,即使参数完全不同,id也必须不同(mybatis的xml里面可没有override的概念)

    相同的id只能存在不同的namespace里面

  • 相关阅读:
    Java面向对象XMind
    使用idea插件JRebel热部署的坑
    Mysql小技巧(多行数据合并+模糊查询
    JRebel安装使用
    Shiro(三) 权限管理 假数据
    Shiro(二)通过shiro实现登录 连接数据库+集成Springboot
    Shiro(一)通过shiro实现登录
    poi实现Excel输出
    日志,注解切入点
    获取用户信息
  • 原文地址:https://www.cnblogs.com/huahua035/p/10345382.html
Copyright © 2011-2022 走看看