前言
去年剛入職的時候,我就發現,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的配置檔案,大概長這樣,可以看到,這裡面的
綜上吧,剛到新公司報到,各種工作的事情也還不熟悉,看到這個又是不太懂的執行方式,而且還有一堆公司內部包名的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多集的新三國後,好像再沒看過這麼長的劇了。
看的過程中,很多感悟,哭得不行,最近幾年是年紀大了,淚點變低了,可能是因為被社會毒打多年,經歷得多了,也更能理解各個生活場景了吧。
總體我覺得是部好劇,誠然會有一些不是特別合理的地方(劇本來源於生活,但畢竟不是生活,一般來說,矛盾點更加集中,現實生活中可能不會那麼多事情一下全讓大家給遇上),但是瑕不掩瑜吧。
還有一點就是,排除意外的情況下,人生還是大幾十年呢,身體是非常重要的,大家保重身體,該躺平還是要躺。