天天看點

Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案

  生命不息,折騰不止。

   折騰能遇到很多坑,填坑我了解為成長。

   兩個月前自己倒騰了一套用開源架構建構的 JavaWeb 後端解決方案。

   引入到項目組後經過幾番打磨,現在也出落的有模有樣。

   最近将工程中的 Hibernate 換了換 Mybatis 試試,畢竟人都需要新鮮感。

   我 Hibernate 接觸的要比 MyBatis 早,作為最流行的兩 ORM 架構,個人認為其中很多思想都相通。

   但 MyBatis 特有的 ResultMap 構想,能進行更為細緻的 SQL 調整和優化。

   在開發社群、版本更新速度、支援的工具上,Hibernate 比 MyBatis 更勝一籌。

Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案

   由  Controller 層接受前端參數并響應請求,攜帶資料跳轉頁面。

   Controller 層注入 ServiceInter, ServiceImpl 層組織業務資料。

   ServiceImpl 層注入 Mybatis Mapper, Mapper 進行資料的通路。

   和 Hibernate 類似整個 dao 層,都可以由工具生成,工程中使用的是 org.mybatis.generator 插件。

Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案

web.xml

Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案

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 子節點:

Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案
Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案

   添加子節點後,mapper.xml 确實編譯到對應的檔案夾下了,但工程中原 Resources 下的檔案沒有像以前一樣編譯到 classes 下。

   maven build --> resources 節點下繼續新增子 resource 子節點後解決:

Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案
Spring + SpringMVC + Druid + MyBatis 給你一個靈活的後端解決方案

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,如需轉載請自行聯系原作者