前言

去年刚入职的时候,我就发现,po类(和数据库表对应的类)上,一片都是光秃秃的,什么注释都没有,类上没注释,field上也没注释。

在以前的项目中,其实我们都是有生成注释的,比如,对于下面这个表:

  1. CREATE TABLE `t_user_info` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `name` varchar(100) DEFAULT NULL COMMENT '名字',
  4. `email` varchar(128) DEFAULT NULL COMMENT '邮箱',
  5. `create_time` datetime NOT NULL COMMENT '创建时间',
  6. `modify_time` datetime NOT NULL COMMENT '修改时间',
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

我们希望看到的po长这样,字段上有注释:

  1. public class UserInfo {
  2. /**
  3. * 主键
  4. */
  5. private Integer id;
  6. /**
  7. * 名字
  8. */
  9. private String name;
  10. ...
  11. }

我在前东家的时候,是有一个单独的mybatis-generator的工程,也是当年在网上瞎找着的,直接运行main类即可,就可以生成待注释的po,但原理了解不多,就是用用。

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

来了现在公司,发现使用方式有点不一样。

它是直接在业务工程的pom里,加了这个mybatis-generator插件的配置,而且,这个mybatis-generator插件还有个dependencies,里面配置了两个依赖项:一个mysql,一个公司内部的依赖:

运行的话,是这个项目下面有个脚本,脚本最终执行:

  1. mvn -Dmybatis.generator.overwrite=true
  2. -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下执行:

  1. 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多集的新三国后,好像再没看过这么长的剧了。

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

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

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

Maven插件mybatis-generator,如何让生成的PO类的field上有对应表字段的注释的更多相关文章

  1. 使用eclipse插件mybatis generator来自动生成实体类及映射文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

  2. Mybatis Generator代码自动生成(实体类、dao层、映射文件)

    写了一段时间增删改查有点厌烦,自己找了下网上的例子鼓捣了下自动生成. 首先得有一个配置文件: generatorConfig.xml <?xml version="1.0" ...

  3. Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)

    自己手动实现的前提,对maven项目有基本的了解,在本地成功搭建了maven环境,可以参考我之前的文章:maven环境搭建 项目里新建表时model,mapper以及mapper.xml基本都是用My ...

  4. mybatis generator 使用教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis gene ...

  5. 如果使用mybatis的逆向工程生成的po类及mapper,如果我们想要进行的对数据库的操作在mapper中没有对应的接口函数:比如生成的mapper接口中没有按照姓名及性别混合条件查询。我们的解决办法是:使用逆向工程生成的对应表的Example文件。

    1.使用mybatis逆向工程生成的po类中包含UserExample文件(我的数据库表名为User). 2. 创建UserExample对象,然后对加入条件.对应的测试代码为: /* * 通过姓名和 ...

  6. Mybatis generator 数据库反向生成插件的使用

    直接上干货: 可生成数据库表对应的po  mpper接口文件 mapper.xml文件.文件中自动配置了部分常用的dao层方法.用于快速快发. 1.pom中引入插件: <plugin> & ...

  7. maven(18)-mybatis generator插件

     generator的作用 使用mybatis框架,在初始项目或修改数据库时,相应的要在JAVA项目中去写一些数据模型文件,DAO,映射XML等配置,而这个插件的作用就是自动生成这些文件,以节省大 ...

  8. 利用maven的MyBatis Generator 插件自动创建代码

    1.首先创建Maven工程 2.修改pom.xml文件代码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  9. JAVA入门[7]-Mybatis generator(MBG)自动生成mybatis代码

    一.新建测试项目 新建Maven项目MybatisDemo2,修改pom.xml引入依赖.dependencies在上节基础上新增 <dependency> <groupId> ...

随机推荐

  1. java下载网络大文件之内存不够的解决办法(包含分片上传分片下载)

    一.背景 2020年11月份的时候,我做过一个项目,涉及到网络文件,比如第三方接口提供一个文件的下载地址,使用java去下载,当时我全部加在到JVM内存里面,话说,单单是80M的下载单线程没问题,但是 ...

  2. Nginx实现跨域配置详解

    主要给大家介绍了关于Nginx跨域使用字体文件的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 问题描述 今天在使用子域名访问根域名的CSS时,发现字体无法显示,在确保CSS和Font字 ...

  3. 软件版本GA、Beta、RC含义

    Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用.Beta:也是测试版,这个阶段的版本会一直加入新的功能.在Alpha版之后推出.RC:(Release Candida ...

  4. HttpClient的NoHttpResponse问题

       调用第三方接口时会报NoHttpResponse异常,原因是上次的连接已经断掉了,但是客户端并未知道,复用上次连接就报错了,所以要解决这个问题,就是要校验上次链接是否断掉了  1. httpCl ...

  5. IDEA中Git的一般使用场景

    感谢大佬:https://www.cnblogs.com/javabg/p/8567790.html 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小 ...

  6. 问题描述:Navicat连不上MySQL数据库

    发现Navicat连不上MySQL后我首先觉得是MySQL的服务没有打开, 然后再cmd里面 启动MySQL服务 输入: net start mysql 发现没有此服务,然我网上找了一下 先初始化My ...

  7. 【CF1194F】Crossword Expert(数学 期望)

    题目链接 大意 给你\(N\)个事件,解决每个事件所需的时间有\(1/2\)的概率为\(t[i]\),\(1/2\)的概率为\((t[i]+1)\),给你总时间\(T\),在\(T\)时间内按顺序解决 ...

  8. API 接口的安全设计验证:ticket,签名,时间戳

    一.背景 1.与前端对接的API接口,如果被第三方抓包并进行恶意篡改参数,可能会导致数据泄露,甚至会被篡改数据 2.与第三方公司的接口对接,第三方如果得到你的接口文档,但是接口确没安全校验,是十分不安 ...

  9. ABCD四个顺序执行方法,拓展性延申

    今天在群里,有人问 有几个void返回值的方法,但是我想让这几个方法有执行顺序,要怎么处理,ABCD 四个方法,依次执行,但是这几个方法都是无返回值的 这个问题其实很简单,如果方法是同步方法,直接四个 ...

  10. python篇第5天【变量】

    第4天加班 多个变量赋值 Python允许你同时为多个变量赋值.例如: a = b = c = 1 以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上. 您也可以为多个对象指定多个变 ...