一、錯誤信息頭:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
二、框架:spring+springmvc+mybatis
三、報錯時間點:啟動spring容器時、執(zhí)行指定方法時。
四、先說下spring集成mybatis的個人理解,如下:
1)假定你配置好了數(shù)據源
2)下一步是設置SqlSessionFactory的時候,這個時候需要將可掃描的mapper相關文件放入config最后放入factory來管理。在構造這個掃描路徑的時候,你可以選擇幾種方法,也是根據自己的項目而定,筆者所知道的,mybatis.xml配置、java代碼編寫和springboot默認方式mapperScan來掃描。
3)mapper.xml和mapper.java接口類存在的形式分為三種
1: mapperScan掃描 配對兒的mapper.java和mapper.xml 在同一路徑下,類似springboot默認的掃描方式。
2:不同路徑下,可以采用在自定義datasource后的 自定義SqlSessionFactory時,構造PathMatchingResourcePatternResolver 將xml文件配置進去,例子如下:
@MapperScan(basePackages = PrimaryDataSourceConfig.INTERFACEPACKAGE, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig{
? ? @Bean(name = "primarySqlSessionFactory")
? ? @Primary
? ? public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DruidDataSource ? primaryDataSource) throws Exception {
? ? ? ? final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
? ? ? ? PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
? ? ? ? sessionFactory.setMapperLocations(resolver.getResources("classpath:/"+XMLPACKAGE));
? ? ? ? sessionFactory.setDataSource(primaryDataSource);
? ? ? ? logger.info("PrimaryDataSourceConfig.primarySqlSessionFactory.init()");
? ? ? ? return sessionFactory.getObject();
? ? }
? ? ? 3:還有一種是mybatis.xml文件的形式,網上很多,筆者就不重復寫了,不過用的類和邏輯和上述兩種方式雷同。
(注:還有一種方式,是用mapperProvider的形式來配置,上網查詢關鍵字“mybatis Provider”即可)
4)這一步,說一下Spring是怎么集成mybatis的,怎么將mapper.java和xml轉化成我們在service里注入的那些bean。
::(這里以mapper.java+mapper.xml來舉例)啟動spring容器,掃描指定包下的所有mapper文件 (接口還是xml 根據自己用的類來區(qū)分),掃描到之后,他會根據你的xml文件里,標簽中namespace屬性來找到待生成子類所需要實現(xiàn)的接口類(一個mapper.xml可以存在多個標簽,一個標簽只能有一個namespace屬性,namespace的值就是mapper接口類的全類名),mapper接口類中的每個方法簽名要和xml中的標簽id及其他屬性保持一致,大小寫敏感。這里如果xml中存在而接口中不存在,就會報出我們標題中的錯誤。如果沒有錯誤,將會通過xml中的sql標簽等生成接口中每一個方法的方法體, 也就是生成 一個mapper.java的子類 ,然后DI進你的ioc容器中 ,這樣 你在service里? 才可以@Autowired 或者@Resource 取到這個bean。如果在調用方法時,xml中設置的標簽屬性和返回值不對應 也將報錯標題中的錯誤。
(5)這里也多說一點關于resultMap和resultType:
resultMap:在xml文件中,resultMap標簽的聲明,是將實體類中的屬性字段對應上數(shù)據庫表的字段名,需要指定實體類的全限定名,但不需要指定表。然后在sql標簽中用到的時候直接使用resultMap屬性。
resultType:? mybatis默認給我們實現(xiàn)了常用的集合類型,如list? map等都是小寫的。自己也可以自擬(需讀友自己科普了)。
總結:標題中的錯誤,就是mapper.java與mapper.xml映射或mapper.xml文件內部,不對或不對應而產生的錯誤。大部分屬于低級錯誤,也是我們很難發(fā)現(xiàn)的錯誤。
祝:身體健康~