重構代碼,方法拋出異常: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里面