Maven外掛mybatis-generator,如何讓生成的PO類的field上有對應表欄位的註釋

三國夢迴發表於2022-03-12

前言

去年剛入職的時候,我就發現,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多集的新三國後,好像再沒看過這麼長的劇了。

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

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

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

相關文章