我是看見別人的代碼中使用了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對象,我們就可以直接使用了。
雖然使用原來的工程就不會報錯,但是我們還要動手實踐,理解原理,要知其然,知其所以然,這樣,在遇到問題或改造時就會順利的多。
參考資料: