maven插件mybatis-generator,如何让生成的PO类的field上有对应表字段的注释
前言
去年刚入职的时候,我就发现,po类(和数据库表对应的类)上,一片都是光秃秃的,什么注释都没有,类上没注释,field上也没注释。
在以前的项目中,其实我们都是有生成注释的,比如,对于下面这个表:
代码语言:javascript复制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长这样,字段上有注释:
代码语言:javascript复制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,一个公司内部的依赖:
运行的话,是这个项目下面有个脚本,脚本最终执行:
代码语言:javascript复制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下执行:
代码语言:javascript复制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多集的新三国后,好像再没看过这么长的剧了。
看的过程中,很多感悟,哭得不行,最近几年是年纪大了,泪点变低了,可能是因为被社会毒打多年,经历得多了,也更能理解各个生活场景了吧。
总体我觉得是部好剧,诚然会有一些不是特别合理的地方(剧本来源于生活,但毕竟不是生活,一般来说,矛盾点更加集中,现实生活中可能不会那么多事情一下全让大家给遇上),但是瑕不掩瑜吧。
还有一点就是,排除意外的情况下,人生还是大几十年呢,身体是非常重要的,大家保重身体,该躺平还是要躺。