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里面

 

posted @ 2019-02-01 13:54  花花牛  阅读(21500)  评论(1编辑  收藏  举报