Maven插件mybatis-generator,如何讓生成的PO類的field上有對應表字段的註釋

前言

去年剛入職的時候,我就發現,po類(和數據庫表對應的類)上,一片都是光禿禿的,什麼註釋都沒有,類上沒註釋,field上也沒註釋。

在以前的項目中,其實我們都是有生成註釋的,比如,對於下面這個表:

CREATE TABLE `t_user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(100) DEFAULT NULL COMMENT '名字',
  `email` varchar(128) DEFAULT NULL COMMENT '郵箱',
  `create_time` datetime NOT NULL COMMENT '創建時間',
  `modify_time` datetime NOT NULL COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我們希望看到的po長這樣,字段上有註釋:

public class UserInfo {
    /**
     * 主鍵
     */
    private Integer id;

    /**
     * 名字
     */
    private String name;
    
    ...
}    

我在前東家的時候,是有一個單獨的mybatis-generator的工程,也是當年在網上瞎找着的,直接運行main類即可,就可以生成待註釋的po,但原理了解不多,就是用用。

https://github.com/cctvckl/customed-mybatis-generator

來了現在公司,發現使用方式有點不一樣。

它是直接在業務工程的pom裏,加了這個mybatis-generator插件的配置,而且,這個mybatis-generator插件還有個dependencies,裏面配置了兩個依賴項:一個mysql,一個公司內部的依賴:

運行的話,是這個項目下面有個腳本,腳本最終執行:

mvn -Dmybatis.generator.overwrite=true 
-Dmybatis.generator.configurationFile=./src/main/resources/mybatis/genCommonDb.xml    mybatis-generator:generate -X

而mvn命令裏的mybatis-generator的配置文件,大概長這樣,可以看到,這裏面的元素,配置的都是公司內部包名的class:

綜上吧,剛到新公司報到,各種工作的事情也還不熟悉,看到這個又是不太懂的運行方式,而且還有一堆公司內部包名的plugin,這玩意也看不太懂,當時也就放下了。如今,過了一年多了,又要開始一個新項目,目前完成了表設計,建了一堆表,正是要用mybatis-generator來生成po等class的時候,這次就決定研究下這塊。

maven的簡要類加載機制

說說Maven框架和插件的契約,之前這篇公衆號文章簡單介紹了,剛看了下,文末留了個課後題,好像還是沒寫透。本篇也沒打算寫這塊。

不過可以大概說下。

我們下載下來一個maven工具,其代碼分佈在兩處,boot目錄和lib目錄

這兩個是maven的核心代碼,boot下的jar,由系統類加載器進行加載(AppClassloader),而去哪裏加載maven核心代碼呢,其實是有個配置文件。

maven就是根據這個配置文件,才知道自己的核心類在lib下的*.jar中,這麼做,應該是爲了保持擴展性和靈活性吧。

上面還寫了main類是org.apache.maven.cli.MavenCli,這就是定義一個入口。於是,接下來轉到org.apache.maven.cli.MavenCli開始執行。

org.apache.maven.cli.MavenCli執行過程,會按照pom.xml文件,開始整個生命週期,這個生命週期中的每個階段的具體動作,都是由插件來實現的。

插件的jar包在哪裏找呢?其實就是去本地maven倉庫找。

大家看下面這個圖,是在調試maven的source插件時候,查看插件的類加載器的截圖:

可以看得到的是,這個類加載器,是專門去加載maven插件的依賴jar的,是去哪裏找這個插件的依賴jar呢,從上圖看到,是去本地的maven倉庫找的。

如何調試maven插件的代碼

我們現在知道了,maven找插件的jar的時候,是去本地倉庫找。jar包裏只有class,idea裏如果沒有對應的源碼,就只有反編譯後的代碼,debug起來,可能不是很方便。

如果希望debug快樂一點,就要去找到對應的插件的源碼工程,導入到idea裏。

這裏,以官方插件maven-source舉例,這個插件是生成一個源碼包,我們看看如何調試,瞭解一下這個插件是如何實現的。

如果我們想調試:某個project下的pom.xml,在這個pom.xml上執行mvn source:jar。

新建debug configuration

回頭運行這個,就可以觸發類似下面的一個命令:

這個命令最終也就是執行mvn source:jar,我們預期是,在執行這個的時候,會停在 source插件的代碼裏。

網上下載插件源碼並導入idea

有人可能說,我不知道插件的座標,如版本等,別急,下面就是,可以看到,是3.0.1版本。

這個插件由於是官方maven插件,所以在maven官方文檔有記錄該插件的倉庫地址。

https://maven.apache.org/scm.html

然後導入idea就不說了吧。

斷點調試

插件是實現maven的插件接口的,我們在插件接口這裏打個斷點就ok了。

甚至,這個辦法,我們還可以修改源碼,改了後發佈到倉庫,就可以jar包和源碼能對上了,就可以調試我們修改後的代碼了。

如何調試mybatis-generator及其插件

繞了一圈,我們終於迴歸正題了。其實和上面是類似的:找到mybatis-generator的源碼(版本要找對),導入idea,打上斷點,調試即可。

這個插件比較特別,特別的是,插件本身還支持擴展。

插件自身又是去哪裏加載這些擴展類呢,其實也是maven本地倉庫。所以,我個人在解決這個問題時,是找到了公司內部這個依賴的源碼,導入到idea,打上斷點,debug即可。

實踐

代碼我上傳了https://gitee.com/ckl111/all-simple-demo-in-blog.git,其中兩個module,一個是mybatis-generator-plugin,這個裏面就只有一個類,用於生成註釋的。另一個就是個測試工程。

mybatis-generator-plugin

然後把這個mybatis-generator依賴的jar,install到本地倉庫。

測試工程

然後在配置文件中,引用我們的註釋生成器:

接下來,在這個module下執行:

mvn -Dmybatis.generator.overwrite=true -Dmybatis.generator.configurationFile=./src/main/resources/generatorConfig.xml mybatis-generator:generate -X -f pom.xml

就會看到生成的class了:

總結

完結撒花,希望對大家有所幫助。代碼路徑再發一遍:

https://gitee.com/ckl111/all-simple-demo-in-blog.git

再扯點生活的事兒,最近一週把58集的電視劇《人世間》看了,自從大學看完過90多集的新三國後,好像再沒看過這麼長的劇了。

看的過程中,很多感悟,哭得不行,最近幾年是年紀大了,淚點變低了,可能是因爲被社會毒打多年,經歷得多了,也更能理解各個生活場景了吧。

總體我覺得是部好劇,誠然會有一些不是特別合理的地方(劇本來源於生活,但畢竟不是生活,一般來說,矛盾點更加集中,現實生活中可能不會那麼多事情一下全讓大家給遇上),但是瑕不掩瑜吧。

還有一點就是,排除意外的情況下,人生還是大幾十年呢,身體是非常重要的,大家保重身體,該躺平還是要躺。

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