生命不息,折騰不止。
折騰能遇到很多坑,填坑我了解為成長。
兩個月前自己倒騰了一套用開源架構建構的 JavaWeb 後端解決方案。
引入到項目組後經過幾番打磨,現在也出落的有模有樣。
最近将工程中的 Hibernate 換了換 Mybatis 試試,畢竟人都需要新鮮感。
我 Hibernate 接觸的要比 MyBatis 早,作為最流行的兩 ORM 架構,個人認為其中很多思想都相通。
但 MyBatis 特有的 ResultMap 構想,能進行更為細緻的 SQL 調整和優化。
在開發社群、版本更新速度、支援的工具上,Hibernate 比 MyBatis 更勝一籌。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcucjNxMjN1EjNtMjMwUzM5QDNxgjMyEjNxAjMtkjNxIjNz8CXyEjNxAjMvwVO2EjM2MzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
由 Controller 層接受前端參數并響應請求,攜帶資料跳轉頁面。
Controller 層注入 ServiceInter, ServiceImpl 層組織業務資料。
ServiceImpl 層注入 Mybatis Mapper, Mapper 進行資料的通路。
和 Hibernate 類似整個 dao 層,都可以由工具生成,工程中使用的是 org.mybatis.generator 插件。
web.xml
pom.xml
淺坑這裡就不說了,下面梳理比較深的幾個坑。
如果你以前遇到過這些問題,并且有比我還完美的解決方法,請賜教。
a. MapperScannerConfigurer 提前初始化導緻 spring 注入配置檔案失效
因為希望 Spring 能掃描 Mapper 接口類加載 Mapper.xml 并自動生成實作代理類,注入到相應的 ServiceImpl 中。
剛開始配置如上,但是發現 Spring 無法正常加載配置檔案中的資訊。
也就是用 ${jdbc.username} 這樣之類的表達式,無法擷取到 properties 檔案裡的内容。
幾次嘗試未果之後,發現 MapperScannerConigurer 實際是在解析加載 bean 定義階段,這個時候設定 sqlSessionFactory 的話。
會導緻提前初始化一些類,PropertyPlaceholderConfigurer 還沒來得及替換定義中的變量,導緻把表達式當作字元串複制了。
将 sqlSessionFactory 替換為 sqlSessionFactoryBeanName 問題解決,配置如下:
b. dao 層資料表主鍵自動生成
在編寫工程例子運作後,發現提示錯誤 UUID 不為 NUll。
自動生成的 mapper.xml 中,對于主鍵(自增序列/uuid)需要自己配置,這點确實有點 low。
自己配置就自己配置吧,mapper.xml 中 UUID 配置如下:
假設項目推進中,生成資料表配置檔案後需要研發手動在 mapper.xml 的新增方法中添加主鍵生成政策,不僅繁瑣而且出問題的機率極大。
試着摸索有沒有什麼統一配置的地方,發現了一種但還是不夠完美。統一配置在 generatorConfig.xml 生成表的地方:
主鍵生成政策使用 SQL 語句這點,就注定 Mybatis 在資料庫移植方面無法盡善盡美。
c. maven 編譯後未将 xml 檔案編譯到 class檔案夾下
工程中需要輸出到編譯目錄的配置檔案有兩部分,各資料表 mapper.xml 和 架構之間的各種各種的 .xml/.properties。
編譯運作時報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
說是未綁定? 輾轉半天,發現 mapper.xml 沒有被編譯到對應的檔案夾下。
maven build --> resources 節點下新增子 resource 子節點:
添加子節點後,mapper.xml 确實編譯到對應的檔案夾下了,但工程中原 Resources 下的檔案沒有像以前一樣編譯到 classes 下。
maven build --> resources 節點下繼續新增子 resource 子節點後解決:
d. jetty 插件啟動web 項目時,會同時啟動 mybatis 逆向工程插件
當使用 jetty:run 啟動 web 項目後,總會有莫名其妙的問題。
報錯君是這樣的:java.lang.IllegalArgumentException: Result Maps collection already contains value for com.rambo.sdm.dao.inter.UserPOMapper.BaseResultMap
順着啟動日志發現,每次 jetty:run 時,mybatis.generator 插件會先運作,并逆向資料庫工程。
逆向生成就逆向生成吧,按道理需要生成的東西已經存在的話,跳過即可。
generator 插件運作機制還是有點問題的,生成的類它跳過,但配置檔案會将内容追加進去,是以才有了上述那個報錯。
移除 generator 插件 executions --> execution 下 goals 子節點問題得以解決。
需要逆向工程時,手動啟動插件即可。
本文轉自Orson部落格園部落格,原文連結:http://www.cnblogs.com/java-class/p/6229920.html,如需轉載請自行聯系原作者