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,但原理了解不多,就是用用。

//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官方文档有记录该插件的仓库地址。

//maven.apache.org/scm.html

然后导入idea就不说了吧。

断点调试

插件是实现maven的插件接口的,我们在插件接口这里打个断点就ok了。

甚至,这个办法,我们还可以修改源码,改了后发布到仓库,就可以jar包和源码能对上了,就可以调试我们修改后的代码了。

如何调试mybatis-generator及其插件

绕了一圈,我们终于回归正题了。其实和上面是类似的:找到mybatis-generator的源码(版本要找对),导入idea,打上断点,调试即可。

这个插件比较特别,特别的是,插件本身还支持扩展。

插件自身又是去哪里加载这些扩展类呢,其实也是maven本地仓库。所以,我个人在解决这个问题时,是找到了公司内部这个依赖的源码,导入到idea,打上断点,debug即可。

实践

代码我上传了//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了:

总结

完结撒花,希望对大家有所帮助。代码路径再发一遍:

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

再扯点生活的事儿,最近一周把58集的电视剧《人世间》看了,自从大学看完过90多集的新三国后,好像再没看过这么长的剧了。

看的过程中,很多感悟,哭得不行,最近几年是年纪大了,泪点变低了,可能是因为被社会毒打多年,经历得多了,也更能理解各个生活场景了吧。

总体我觉得是部好剧,诚然会有一些不是特别合理的地方(剧本来源于生活,但毕竟不是生活,一般来说,矛盾点更加集中,现实生活中可能不会那么多事情一下全让大家给遇上),但是瑕不掩瑜吧。

还有一点就是,排除意外的情况下,人生还是大几十年呢,身体是非常重要的,大家保重身体,该躺平还是要躺。