mybatis-generator代碼生成與手寫代碼分離實踐

使用mybatis-generator自動生成代碼,還是很方便的,但是自動生成的代碼,都是簡單的單表查詢sql,顯然沒辦法滿足所有的業務需求,所以還有很多sql是需要手寫的,那麼這時,手寫代碼是寫到自動生成的xml和接口類裏呢,還是另外創建xml和類呢?

如果直接寫到自動生成的文件裏,那麼當業務需求更新,表結構變更後,需要重新生成xml和接口類時,就麻煩了,經常會有手寫代碼被覆蓋掉。

當然也可以用另一種方式,就是另外創建xml和接口類,把手寫代碼和自動生成代碼分離開,但這樣就不好像寫在一起那樣方便的引自動生成的BaseResultMap和Base_Column_List了(通過命名空間.BaseResultMap來引,應該也是能引到的,我沒這樣實踐過),感覺也不是太方便,那麼有沒有辦法解決呢?

下面介紹下我解決此問題的實踐。首先需要用到我之前一篇博客裏介紹到的mybatis mapper繼承的相關知識(https://blog.csdn.net/ytzzh0726/article/details/84701786),具體做法請參考那篇博客。

實踐創建的demo源碼地址:https://gitee.com/regedit0726/mybatis-generator-demo

這是一個基於spring boot的demo,啓動後直接訪問http://localhost:8080/test就可以看到實踐結果了。

然後把表結構改下,加個int類型的age,在這一列加上數據,然後執行一下單元測試雹下的GeneratorConfig類的方法generate,源碼中的自動生成的mapper,dao接口和model類就更新了,再訪問下上面的接口,返回數據就更新了,添加了age字段的數據。

resources/sql下有demo的建表sql

resources/generatorConfig.xml是自動生成代碼的配置,這個和一般使用的配置沒什麼區別,使用過mybatis-generator的應該比較熟悉了

關鍵代碼:

單元測試雹下的GeneratorConfig類的方法generate

這個方法就是具體的自動代碼生成腳本,裏面寫了詳細的註釋,應該完全能看懂了,最前面就是一般使用的腳本,會先按一般方式生成代碼,然後會利用反射修改生成的接口類,model類和xml文件相關信息,刪除之前生成的文件,重新生成一遍文件,這時生成的接口類和model類,就直接帶了聲明父接口(當然model類聲明父接口並不是必要的,這部分可以根據需要註釋掉相關腳本即可)

幾個注意問題:

1,父接口類,不能注入,確保不要被Spring掃描注入,不然程序運行會報錯(這個在之前mapper繼承的博文裏有說到)

2,報錯org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

這個有兩種可能性,一種是xml文件沒打到包裏,所以找不到sql,還有就是配置mapper掃描路徑,沒有掃到extMapper.xml

3,執行GeneratorConfig類的generate方法後沒有生成類文件,也沒有報錯,這可能的原因是路徑不對,當使用IDEA加載一個多模塊的maven項目,或者是用IDEA直接打開一個目錄,而這個目錄並不是項目的根目錄,項目是以模塊的形式導入的,這時,generatorConfig.xml中的targetProject以及腳本中寫文件的路徑就不對了,這時設置起來就比較麻煩些了,我當時是debug到生成文件的那行代碼,取了目標文件路徑,和實際文件做對比,再試着改設置,才最終使得腳本正確運行的。

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