springboot和mybatis及mybatis-plus整合報錯解決過程

  我是看見別人的代碼中使用了mybatis-plus框架,確實很方便。於是,從零開始搭建一個spirngboot,mybatis-plus框架,期間遇到了幾個問題,使用各種方法解決了,加深了對於mp的認知。

首先使用mp的generator,這其中有兩個比較重要的問題,都涉及其原理

  • mp會要求用戶輸入表名,然後生成相應表的代碼,而不是生成所有數據庫表的代碼,從實現和需求來說,這都是合理的。
  • mp中依賴了前端框架velocity或者freemaker,很多人對此比較陌生,我也是。這些有什用呢?是要生成也頁面代碼嗎?不是的,而是使用其java和xml的語法引擎,完成代碼的xml代碼和java代碼的生成。

  其它是模塊名呀,目錄選擇問題,不懂就選擇默認,或者多試幾次,不是大問題。

重點是使用mp中遇到的問題,提供給大家參考

  • 按照mybatis的使用思路,創建mapper相關的文件,在運行起來的時候報錯,大概是 create UserMapper.class  bean error,意思就是mapper對象沒有創建成功,是什麼錯呢?

  從原理上理解,mybatis會自動將UserMapper.class, UserMapper.xml生成一個對象呀。怎麼去debug?基本只能code review,應爲使用的框架,不是業務,沒有數據。我們看到的只是問題的表面,如何進一步去定位問題?這就要從mybatis的工作原理出發,mybatis會在編譯階段,將兩個文件打包到同一個目錄下,於是去target目錄看文件,發現他們竟然不在一起,就發現是創建目錄的問題,多級目錄不能用com.example.mes,而是逐級創建。

  • 程序運行起來後,報 failed to  create 'sqlSessionFactory' or 'sqlTemplate', 即對象創建失敗

  其實在早期使用spring框架時,我們手動創建SqlSessionFactory對象的,交給spring託管,爲什麼這裏提示沒有創建呢?我百度了一下,發現是pom文件中沒有引入mybatis-spring-boot-starter。爲什麼加上這個就好了呢?我們其實可以打開這個jar包看一下,看到MybatisAutoConfiguration就明白了,是這個類起來作用。這就就是spring和springboot這兩個框架在使用上的一個顯著差別。

  • 程序運行起來,報Invalid bound statement (not found): com.bt.mapper.UserMapper.listPage

說實話,這個問題,我們之前可能都遇到過,一般就是userMapper.xml文件中沒有寫sql語句。但問題是這股方法是BaseMapper的方法,並且是分頁方法,這就使問題比較複雜了。明顯是BaseMapper的方法沒有實現,百度了一圈沒有結果。時間也不多了。解鈴還須繫鈴人,還得自己去想怎麼解決。起初我以爲mp的分頁必須要寫sql,那怎麼辦呢?

  將問題降級,我自己在UserMapper中寫方法,發現正常。於是說明UserMapper文件沒有問題,是BaseMapper問題,但是一時又找不出問題在哪裏,怎麼辦呢?這時就謙虛一點,下載mp官方樣例工程,在本地運行,通過比對發現問題。我發現在mp工程中,listPage是沒有問題的,說明不需要sql語句,那問題在哪裏呢?大概技術pom文件不同吧,複製官方的pom文件,發現即好了。至此問題終於找到了,少了mybatis-plus-boot-starter,如下圖所示:

  說明啥,說明mp本身也是需要Configuration,否則不會加載Mybatis-plus相關的對象。

  總結上面的問題,發現大部分都是pom文件的問題,都是引入相應的組件,但是沒有starter而報錯,這些starter就相當於一個橋樑,架起了springboot和組件的橋樑。那你可能奇怪了,爲什麼引入redis就沒有starter呢?這是因爲springboot有一個spring.factory文件,redis已經被收錄了,程序編譯時發現redis的包就會創建redis-connector對象,我們就可以直接使用了。

  雖然使用原來的工程就不會報錯,但是我們還要動手實踐,理解原理,要知其然,知其所以然,這樣,在遇到問題或改造時就會順利的多。

 

參考資料:

  mybatis-plus官方網站

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