org.apache.ibatis.binding.BindingException Invalid bound statement (not found)

一、錯誤信息頭: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)的錯誤。

祝:身體健康~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容