把Mybatis Generator生成的代码加上想要的注释

1 前言

在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件。但是Mybatis Generator默认生成的代码中,注释并不是我们想要的,所以一般在Generator配置文件中,会设置不自动生成注释。带来的问题就是自动生成代码之后,我们还要自己去类文件中把注释加上,如果生成的类较少还好,如果有生成很多类文件,自己加注释是一件繁琐的工作。

通过重写Mybatis Generator的CommentGenerator接口,可以方便地生成自己想要的注释,减少重复工作。

2 使用Java方式执行Mybatis Generator

2.1 IDEA中新建Maven项目

pom.xml中引入jar包

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  5. <modelVersion>4.0.0</modelVersion>

  6. <groupId>org.example</groupId>

  7. <artifactId>MyGenerator</artifactId>

  8. <version>1.0-SNAPSHOT</version>

  9. <properties>

  10. <maven.compiler.source>8</maven.compiler.source>

  11. <maven.compiler.target>8</maven.compiler.target>

  12. </properties>

  13. <dependencies>

  14. <dependency>

  15. <groupId>mysql</groupId>

  16. <artifactId>mysql-connector-java</artifactId>

  17. <version>8.0.16</version>

  18. </dependency>

  19. <dependency>

  20. <groupId>org.mybatis.generator</groupId>

  21. <artifactId>mybatis-generator-core</artifactId>

  22. <version>1.3.7</version>

  23. </dependency>

  24. </dependencies>

  25. </project>

2.2 创建generatorConfig.xml

随便找个目录放,我放在src/main/resources目录下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration PUBLIC
  3. "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
  7. <!-- 生成的 Java 文件的编码 -->
  8. <property name="javaFileEncoding" value="UTF-8"/>
  9. <!-- 格式化 Java 代码 -->
  10. <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
  11. <!-- 格式化 XML 代码 -->
  12. <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
  13. <commentGenerator>
  14. <property name="suppressAllComments" value="false" />
  15. </commentGenerator>
  16. <!-- 配置数据库连接 -->
  17. <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
  18. connectionURL="URL"
  19. userId="user" password="password">
  20. <!-- 设置 useInformationSchema 属性为 true -->
  21. <property name="useInformationSchema" value="true" />
  22. </jdbcConnection>
  23. <!-- 生成实体的位置 -->
  24. <javaModelGenerator targetPackage="com.jd.bulk"
  25. targetProject="src/main/java">
  26. <property name="enableSubPackages" value="true"/>
  27. </javaModelGenerator>
  28. <!-- 生成 Mapper XML 的位置 -->
  29. <sqlMapGenerator targetPackage="com.jd.bulk"
  30. targetProject="src/main/resources">
  31. <property name="enableSubPackages" value="true"/>
  32. </sqlMapGenerator>
  33. <!-- 生成 Mapper 接口的位置 -->
  34. <javaClientGenerator type="XMLMAPPER"
  35. targetPackage="com.jd.bulk"
  36. targetProject="src/main/java">
  37. <property name="enableSubPackages" value="true"/>
  38. </javaClientGenerator>
  39. <!-- 设置数据库的表名和实体类名 -->
  40. <table tableName="worker" domainObjectName="Worker"/>
  41. </context>
  42. </generatorConfiguration>
2.3 创建main方法,运行Generator
  1. public class Generator {

  2. public static void main(String[] args) throws Exception {

  3. List<String> warnings = new ArrayList<>(2);

  4. ConfigurationParser cp = new ConfigurationParser(warnings);

  5. File configFile = new File("src/main/resources/generatorConfig.xml");

  6. Configuration config = cp.parseConfiguration(configFile);

  7. DefaultShellCallback callback = new DefaultShellCallback(true);

  8. MyBatisGenerator = new MyBatisGenerator(config, callback, warnings);

  9. myBatisGenerator.generate(null);

  10. }

  11. }

运行main方法,生成默认注释如下,并不是我们想要的注释,所以一般会配置为注释不生成:

2.4 实现CommentGenerator接口

重写以下方法,自定义注释

  1. public class MySQLCommentGenerator implements CommentGenerator {
  2. private final Properties properties;
  3. public MySQLCommentGenerator() {
  4. properties = new Properties();
  5. }
  6. @Override
  7. public void addConfigurationProperties(Properties properties) {
  8. // 获取自定义的 properties
  9. this.properties.putAll(properties);
  10. }
  11. /**
  12. * 重写给实体类加的注释
  13. */
  14. @Override
  15. public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
  16. String author = properties.getProperty("author");
  17. String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
  18. SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
  19. // 获取表注释
  20. String remarks = introspectedTable.getRemarks();
  21. topLevelClass.addJavaDocLine("/**");
  22. topLevelClass.addJavaDocLine(" * " + remarks);
  23. topLevelClass.addJavaDocLine(" *");
  24. topLevelClass.addJavaDocLine(" * @author " + author);
  25. topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
  26. topLevelClass.addJavaDocLine(" */");
  27. }
  28. /**
  29. * 重写给实体类字段加的注释
  30. */
  31. @Override
  32. public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
  33. // 获取列注释
  34. String remarks = introspectedColumn.getRemarks();
  35. field.addJavaDocLine("/**");
  36. field.addJavaDocLine(" * " + remarks);
  37. field.addJavaDocLine(" */");
  38. }
  39. /**
  40. * 重写给实体类get方法加的注释
  41. */
  42. @Override
  43. public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
  44. // 获取表注释
  45. String remarks = introspectedColumn.getRemarks();
  46. method.addJavaDocLine("/**");
  47. method.addJavaDocLine(" * " + method.getName());
  48. method.addJavaDocLine(" */");
  49. }
2.5 修改generatorConfig.xml配置

将generatorConfig.xml文件中的commentGenerator做如下修改,type属性选择自己的实现类

  1. <commentGenerator type="com.generator.MySQLCommentGenerator">
  2. <property name="author" value="Your Name"/>
  3. <property name="dateFormat" value="yyyy/MM/dd"/>
  4. </commentGenerator>

运行main方法,生成注释如下:

3 使用Maven方式执行Mybatis Generator

Pom.xml文件中增加以下配置,需要引入generator插件时,依赖实现CommentGenerator接口的jar包,要先把自己的jar包install到本地仓库。

否则会报com.generator.MySQLCommentGenerator找不到,其他配置同上。

  1. <build>
  2. <defaultGoal>compile</defaultGoal>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.mybatis.generator</groupId>
  6. <artifactId>mybatis-generator-maven-plugin</artifactId>
  7. <version>1.4.0</version>
  8. <configuration>
  9. <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
  10. <verbose>true</verbose>
  11. <overwrite>true</overwrite>
  12. </configuration>
  13. <dependencies>
  14. <!-- 其他的数据库,需要修改依赖 -->
  15. <dependency>
  16. <groupId>mysql</groupId>
  17. <artifactId>mysql-connector-java</artifactId>
  18. <version>8.0.16</version>
  19. </dependency>
  20. <!-- 引用实现CommentGenerator接口的jar包 -->
  21. <dependency>
  22. <groupId>org.example</groupId>
  23. <artifactId>MyGenerator</artifactId>
  24. <version>1.0-SNAPSHOT</version>
  25. </dependency>
  26. </dependencies>
  27. </plugin>
  28. </plugins>

4 源码分析

查看执行Mybatis Generator的main方法,主要分为两部分,解析指定的配置文件与调用生成java文件和Mapper文件的方法

4.1 解析指定的xml配置文件

跟踪解析xml文件的方法cp.parseConfiguration(configFile)发现,底层以Document形式读取xml文件,根据标签名解析各标签属性,保存到Configuration实例中。

其中解析commentGenerator标签的方法parseCommentGenerator(context, childNode)中,会获取commentGenerator标签的type属性值,也就是自定义的”com.generator.MySQLCommentGenerator”类,放到Context实例中。

4.2 调用生成java文件和Mapper文件的方法

xml配置文件解析完成,得到Configuration实例,后面生成文件的工作都会从Configuration实例中获取所需数据。生成文件的方法主要步骤为:1.连接数据库,查询表信息与列信息,2.生成文件内容,3.写入生成文件。

其中生成文件内容时,会根据Context的type属性反射创建MySQLCommentGenerator实例,然后调用自定义的生成注释方法。

如:生成实体类文件的注释,调用addModelClassComment方法

生成字段注释,调用addFieldComment方法

生成Get方法注释,调用addGetterComment方法

在调用addModelClassComment,addFieldComment,addGetterComment等生成注释的方法时,执行的都是MySQLCommentGenerator类的方法,这样就实现了生成自定义注释的功能。

5 总结

通过使用自定义实现CommentGenerator接口,让自动生成的代码加上我们想要的注释,可以省去自己加注释的麻烦。

与一般使用Mybatis Generator生成代码的方式一样,多实现个接口即可。
使用Maven方式运行时,需要在pom.xml引入插件时,依赖自己jar包。

作者:京东物流 王建乐

来源:京东云开发者社区 自猿其说 Tech 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】在链队列中你可能忽视的二三事

链队列及其基本操作的C语言实现 导言一、链队列二、链队列的基本操作的实现2.1 链队列的数据类型2.2 链队列的初始化2.2.1 带头结点的链队列的初始化2.2.3 不带头结点的链队列的初始化 2.3 链队列的判空2.3.1 带头结点的链队列的判空2.3.2 不带头结点的链队列的判空 2.4 链队列…

IS-IS:01 ISIS基本配置

这是实验拓扑&#xff0c;下面是基本配置&#xff1a; R1: sys sysname R1 user-interface console 0 idle-timeout 0 0 int loop 0 ip add 1.1.1.1 24 int g0/0/0 ip add 192.168.12.1 24 qR2: sys sysname R2 user-interface console 0 idle-timeout 0 0 int loop 0 ip add …

samba服务搭建,并将共享目录映射到windows

系统版本&#xff1a;centos7 1、centos 安装samba yum -y install samba 2、查看安装信息 rpm -qa |grep samba 3、设置开机自启动 systemctl enable smb.service systemctl enable nmb.service 4、设置samba服务器配置文件 sudo vi /etc/samba/smb.conf 注意&#…

CentOS 系统创建网卡bond0

很多时候在机房运维的过程中&#xff0c;我们会遇到客户要求的建立网卡光口的bond0设置&#xff0c;通俗点说就是将两个光口合并为一个口进行链接设置。创建这个设置是有两种设置&#xff0c;一是在安装系统的过程中对bond0进行创建设置&#xff0c;另一种就是通过系统里面对网…

Mac使用adb调试安卓手机

0x00 背景 最近windows电脑休息&#xff0c;用mac办公比较多&#xff0c;手机用时间长了&#xff0c;不太灵光&#xff0c;准备修理一番。于是要用mac调试下android手机。配置略显麻烦&#xff0c;网上的步骤多参差不齐。估计是入门步骤&#xff0c;大佬们也懒得写的太细。于是…

【趣味题-07】20240121他的第一周工资(精准推测工资)

背景需求 设计过程&#xff1a; AI写了很多的答案&#xff0c;但是都不正确 于是我去查看了网上的正确答案——47.41美元 此外&#xff0c;题目的0.99涉及了浮点数&#xff0c;非整数&#xff0c;无法range遍历 最后终于有一个答案正确的代码 通过反复测试&#xff0c;终于写出…

详细版Git的下载安装与配置(Windows)

一、git的下载 Git是一个非常好用的版本控制工具。下载地址如下&#xff1a;Git - Downloads。建议使用国内浏览器下载&#xff0c;因为不用翻墙&#xff0c;速度快。 当你用浏览器去访问上面的地址后&#xff0c;下载页面会自动识别你的电脑系统&#xff0c;如下 点击&#…

NVMe TCG安全数据存储简介

NVMe&#xff08;非易失性内存主机控制器接口规范&#xff09;与TCG&#xff08;可信计算组&#xff09;的集成主要体现在数据安全、固件验证和硬件信任根等方面&#xff0c;以确保存储设备的数据保护能力和安全性。 TCG Opal定义了一套针对自加密硬盘&#xff08;SED, Self-En…

找不到msvcr100dll或msvcr100dll丢失怎么办,5种靠谱的解决方法分享

MSVCR100.dll文件的丢失可能会引发一系列系统运行和应用程序功能上的问题。作为Microsoft Visual C运行库中的一个关键动态链接库文件&#xff0c;它的缺失会导致依赖于此文件的软件无法正常启动或执行预期功能。具体表现可能包括但不限于&#xff1a;应用程序崩溃、闪退&#…

Python基础之异常处理

程序在运行过程中&#xff0c;难免会遇到错误&#xff0c;有的是编写人员疏忽造成的语法错误&#xff0c;有的是程序内部隐含逻辑问题造成的数据错误&#xff0c;还有的是程序运行时与系统的规则冲突造成的系统错误&#xff0c;等等。如果出错就不会执行出错语句后面的代码&…

Ubutu下的Shell操作

前言 在学习Ubuntu系统时&#xff0c;Shell操作是必不可少的知识。本篇文章是记录我学习Linux系统时&#xff0c;Ubutu下的Shell操作&#xff0c;希望我的分享对大家有所帮助&#xff01; 目录 前言 一、什么时是Shell 二、Shell的基本操作 三、常用的Shell命令 1、目录信…

GIS项目实战06:超详细Node.js安装及系统环境配置

简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&#xff0c;V8 引擎执行 Javascript 的速度非常快&#xff0c;性能…

一区优化直接写:KOA-CNN-BiLSTM-Attention开普勒优化卷积、长短期记忆网络融合注意力机制的多变量回归预测程序!

适用平台&#xff1a;Matlab 2023版及以上 KOA开普勒优化算法&#xff0c;于2023年5月发表在SCI、中科院1区Top顶级期刊《Knowledge-Based Systems》上。 该算法提出时间很短&#xff0c;目前还没有套用这个算法的文献。 同样的&#xff0c;我们利用该新鲜出炉的算法对我们的…

【好用的AI工具Kimi Chat】帮助提高面试效率

一、背景 年前裁员潮&#xff0c;不少人离职找工作&#xff0c;以及年后金三银四&#xff0c;也是求职高峰期。如何更高效的复习技术知识&#xff0c;以及特别是横纵向比对有总结性的问题。本文以面试【测试开发】的岗位为例&#xff0c;对面试题进行拓展&#xff0c;让AI帮助…

从 Vscode 中远程连接 WSL 服务器:可以本地操作虚拟机

从 Vscode 中远程连接 WSL 服务器&#xff1a;可以本地操作虚拟机 1.下载 Vscode Visual Studio Code - Code Editing. Redefined 2.搜索框中输入>wsl&#xff0c;点击 WSL&#xff1a;Connect to WSL using Distro... 3.点击下载好的Ubuntu&#xff0c;当左下角出现图片同…

U-Boot 中使用 nfs 命令加载文件报错指南

目录 问题一问题描述错误原因解决方案 问题二问题描述解决方案 更多内容 在嵌入式 Linux 开发中&#xff0c;我们经常使用 nfs 命令加载服务端的共享文件或者挂载文件系统。关于服务端 NFS 服务的搭建可以参考基于 NFS 的文件共享实现。 U-Boot 也支持了 nfs 命令&#xff0c;…

RabbitMQ数据隔离

1、新建用户 2、登录用户&#xff0c;设置虚拟主机 登录用户只能操作自己的虚拟主机&#xff0c;交换机等&#xff0c;不能操作其他人的&#xff01;&#xff01;&#xff01;

二维码地址门牌管理系统:登记管理新时代

文章目录 前言一、轻松登记&#xff0c;一扫即通二、智能化登记&#xff0c;优势明显三、政府支持与推广四、智能化管理未来展望 前言 二维码门牌管理系统的上线&#xff0c;为市民带来了便捷。系统不仅提升了登记效率&#xff0c;更保障了个人信息安全&#xff0c;成为城市管…

旅游项目day14

其他模块数据初始化 搜索实现 请求一样&#xff0c;但是参数不一样&#xff0c;根据type划分。 后台需要提供一个搜索接口。 请求分发器&#xff1a; 全部搜索 目的地搜索 精确搜索、无高亮展示 攻略搜索 全文搜索、高亮显示、分页 游记搜搜 用户搜索 丝袜哥

【GitHub项目推荐--Spring 教程】【转载】

该项目是一系列小型且直击要害的教程&#xff1a;每个教程都涵盖了 Java 生态系统中一个单一且定义明确的开发领域。 其中一个重点是 Spring Framework - Spring、Spring Boot 和 Spring Security。除了 Spring 之外&#xff0c;这里的模块还涵盖了 Java 的许多方面。 开源地址…