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

mybatis,generator,生成,代码,加上,想要,注释 · 浏览次数 : 479

小编点评

**Mybatis Generator代码注释说明** **1.配置注释** * 在generatorConfig.xml中设置commentGenerator属性,选择自定义实现类。 * 在自定义实现类中设置属性,如author、dateFormat等。 **2.解析xml配置文件** * 在parseCommentGenerator方法中获取commentGenerator标签的type属性值,也就是自定义的“com.generator.MySQLCommentGenerator”类。 * 将自定义的实现类实例化并设置到Context中。 **3.生成java文件和Mapper文件** * 在xml配置文件解析完成,得到Configuration实例。 * 生成文件内容,包括实体类、字段、Get方法等。 * 使用生成文件的路径和类型,调用 appropriate的方法生成文件。 **4.自定义注释方法** * 使用反射机制,根据标签名获取属性值,并生成相应的注释方法。 * 例如,生成实体类文件的注释,调用addModelClassComment方法生成字段注释,调用addFieldComment方法生成Get方法注释。 **5.注释示例** ```java //配置注释 commentGenerator type="com.generator.MySQLCommentGenerator" //自定义实现类 class MySQLCommentGenerator implements CommentGenerator { private Properties properties; public MySQLCommentGenerator() {properties = new Properties();} @Override public void addConfigurationProperties(Properties properties) { //获取自定义属性 author = properties.getProperty("author"); dateFormat = properties.getProperty("dateFormat"); } @Override public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { //获取字段注释 String remarks = introspectedTable.getRemarks(); field.addJavaDocLine(" * @author \"" + author + "\""); method.addJavaDocLine(" * @date \"" + dateFormat + "\""); } @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { //获取 Get方法注释 String remarks = introspectedTable.getRemarks(); field.addJavaDocLine(" * @get \"" + field.getName() + "\""); } } ``` **6.运行Mybatis Generator** * 在pom.xml中引入插件,依赖自己jar包。 * 使用maven运行,带参数生成代码。

正文

作者:王建乐

1 前言

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

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

2 使用Java方式执行Mybatis Generator

2.1 IDEA中新建Maven项目

pom.xml中引入jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MyGenerator</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
</project>

 

2.2 创建generatorConfig.xml

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
<!-- 生成的 Java 文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化 Java 代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化 XML 代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<commentGenerator>
<property name="suppressAllComments" value="false" />
</commentGenerator>
<!-- 配置数据库连接 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="URL"
userId="user" password="password">
<!-- 设置 useInformationSchema 属性为 true -->
<property name="useInformationSchema" value="true" />
</jdbcConnection>
<!-- 生成实体的位置 -->
<javaModelGenerator targetPackage="com.jd.bulk"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaModelGenerator>
<!-- 生成 Mapper XML 的位置 -->
<sqlMapGenerator targetPackage="com.jd.bulk"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成 Mapper 接口的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.jd.bulk"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 设置数据库的表名和实体类名 -->
<table tableName="worker" domainObjectName="Worker"/>
</context>
</generatorConfiguration>

 

2.3 创建main方法,运行Generator

public class Generator {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>(2);
ConfigurationParser cp = new ConfigurationParser(warnings);
File configFile = new File("src/main/resources/generatorConfig.xml");
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}

 

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

2.4 实现CommentGenerator接口

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

public class MySQLCommentGenerator implements CommentGenerator {
private final Properties properties;
public MySQLCommentGenerator() {
properties = new Properties();
}
@Override
public void addConfigurationProperties(Properties properties) {
// 获取自定义的 properties
this.properties.putAll(properties);
}
/**
* 重写给实体类加的注释
*/
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
String author = properties.getProperty("author");
String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
// 获取表注释
String remarks = introspectedTable.getRemarks();
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * " + remarks);
topLevelClass.addJavaDocLine(" *");
topLevelClass.addJavaDocLine(" * @author " + author);
topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
topLevelClass.addJavaDocLine(" */");
}
/**
* 重写给实体类字段加的注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
// 获取列注释
String remarks = introspectedColumn.getRemarks();
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + remarks);
field.addJavaDocLine(" */");
}
/**
* 重写给实体类get方法加的注释
*/
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
// 获取表注释
String remarks = introspectedColumn.getRemarks();
method.addJavaDocLine("/**");
method.addJavaDocLine(" * " + method.getName());
method.addJavaDocLine(" */");
}

 

2.5 修改generatorConfig.xml配置

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

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

 

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

3 使用Maven方式执行Mybatis Generator

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

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

<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<!-- 其他的数据库,需要修改依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 引用实现CommentGenerator接口的jar包 -->
<dependency>
<groupId>org.example</groupId>
<artifactId>MyGenerator</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</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包。

与把Mybatis Generator生成的代码加上想要的注释相似的内容:

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

作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件。但是Mybatis Generator默认生成的代码中,注释并不是我们想要的,所以一般在Generator配置文件中,会设置不自动生成注释。带来的问题就是自动生成代码之

『手写Mybatis』实现映射器的注册和使用

前言 如何面对复杂系统的设计? 我们可以把 Spring、MyBatis、Dubbo 这样的大型框架或者一些公司内部的较核心的项目,都可以称为复杂的系统。 这样的工程也不在是初学编程手里的玩具项目,没有所谓的 CRUD,更多时候要面对的都是对系统分层的结构设计和聚合逻辑功能的实现,再通过层层转换进行

MyBatis实现MySQL表字段及结构的自动增删

前言 在开发过程中,总会涉及到数据库表结构字段的增加或者删除,或者是索引的增加和减少,这个时候能把修改表结构字段这些工作都交给程序来进行,那能大大方便开发。正好有一个现成的工具可以在springboot里面实现这个流程。 介绍 mybatis-enhance-actable 上述是gitee链接。这

SpringBoot2.7升级到3.0的实践分享

背景 最近把项目中的技术框架做一次升级,最重要的就是SpringBoot从2.7.x升级到3.0.x,当然还会有一些周边的框架也会连带着升级,比如Mybatis Plus,SpringCloud等,话不多说直接看看有哪些事情要做。 具体事项 主要分两类,第一类是单纯的提升版本,主要如下: 1.jdk

Sealos 5.0 正式发布,云本应该是操作系统

把所有资源抽象成一个整体,一切皆应用,这才是云应该有的样子。 2018 年 8 月 15 日 Sealos 提交了第一行代码。 随后开源社区以每年翻倍的速度高速增长。 2022 年我们正式创业,经历一年的研发,在 2023 年 6 月正式上线 Sealos 公有云版本。 到目前为止,我们已经上线近一

把langchain跑起来的3个方法

使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来的方法,如有错误欢迎纠正。

Java 把多个音频拼接成一个

本文简要介绍了Java 把多个音频拼接成一个音频的方法,给出了一个基于JLayer(用于MP3)和TarsosDSP(一个音频处理库)的简化示例,并给出了详细的代码示例。

可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件,纯血国产)

支持Qos0、定时、过期、顺序、广播、事务、二进制等消息特性。有确认、重试、延时等机制。可嵌入、单机、集群等部署。

我把 CPU 三级缓存的秘密,藏在这 8 张图里

本文已收录到 GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好,我是小彭。 在上一篇文章里,我们聊到了计算机存储器系统的金字塔结构,其中在 CPU 和内存之间有一层

[转帖]20191022-从Jenkins NativeOOM到Java8内存

我把老掉牙的Jenkins升级了,它跑了几天好好的;后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了;当我开两个脚本时,40.5小时就挂了。(可以通过搜索Jenkins日志/var/log/jenkins/* 中字符Jen