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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章