概述
我们在使用Mybatis代码生成器生成mapper、po以及xml文件的时候,mapper中的方法和po的字段上一般会自动生成一些“无用”的注释,使得代码看起来很乱。为了解决这个问题,一般有三种方式:第一种就是通过配置generatorConfig.xml文件来精简注释,第二种就是通过实现CommentGenerator中的方法,让代码生成器生成我们自己想要的注释效果,第三种既可以做到自定义注释,还能省去get、set方法。
修改generatorConfig.xml中的配置
context
<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">
</context>
- id:可以随便填,保证多个context标签的id不重复就可以;
- defaultModelType:可以不填,默认值为conditional,flat表示一张表对应一个po;
- targetRuntime:可以不填,默认值MyBatis3,常用的还有MyBatis3Simple,这个配置会影响生成的mapper和mapper.xml文件中方法的数量。设置为MyBatis3Simple,自动生成的接口会比较少,只包含最最常用的方法。
context子标签
commentGenerator
commentGenerator子标签是用来配置生成的注释的。默认是会生成注释的,并且会生成时间戳。
如果你不想保留时间戳,可以在commentGenerator标签中进行如下配置
<commentGenerator>
<!-- 不希望生成的注释中包含时间戳 -->
<property name="suppressDate" value="true"/>
</commentGenerator>
如果你想知道每个字段在数据库中的含义(前提是你已经在数据库对应表的字段中加了注释),也可以在commentGenerator标签中进行如下配置
<commentGenerator>
<!-- 添加 db 表中字段的注释 -->
<property name="addRemarkComments" value="true"/>
</commentGenerator>
同样,我们也可以通过配置commentGenerator标签不生成任何注释
<commentGenerator>
<!-- 是否不生成注释 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
对于其他子标签,大家可以参考参考文章中的第一篇。
自定义commentGenerator
为了更好的生成我们所期望的注释,我们还可以通过实现CommentGenerator类来编写我们自定义的commentGenerator。
首先,我们需要在pom.xml文件中添加依赖
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
之后,实现CommentGenerator类
package com.enn.carbon.inclusion.dal;
import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.internal.util.StringUtility;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Set;
/**
* MyCommentGenerator
*
* @author shenrongtao
* @date 2022/4/20
*/
public class MyCommentGenerator implements CommentGenerator {
private final Properties properties;
public MyCommentGenerator() {
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", "Your name");
String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);
// 获取表注释
if (StringUtility.stringHasValue(introspectedTable.getRemarks())) {
topLevelClass.addImportedType("lombok.Data");
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
topLevelClass.addJavaDocLine(" *");
topLevelClass.addJavaDocLine(" * @author " + author);
topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
topLevelClass.addJavaDocLine(" */");
topLevelClass.addAnnotation("@Data");
} else {
topLevelClass.addImportedType("lombok.Data");
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * @author " + author);
topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
topLevelClass.addJavaDocLine(" */");
topLevelClass.addAnnotation("@Data");
}
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
field.addJavaDocLine(" */");
}
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
}
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {
}
@Override
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
}
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
}
@Override
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
}
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
}
@Override
public void addComment(XmlElement xmlElement) {
}
@Override
public void addRootComment(XmlElement xmlElement) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {
}
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
}
}
最后,修改generatorConfig.xml文件中commentGenerator标签的type属性以及property
<commentGenerator type="com.enn.carbon.inclusion.dal.util.MybatisCommentGenerator">
<property name="author" value="shenrongtao"/>
<property name="dateFormat" value="yyyy/MM/dd"/>
</commentGenerator>
自定义Plugin
上面方法在自动生成的po类中仍然会生成很多get、set方法。因此,为了不生成get、set方法,我们可以通过继承PluginAdapter自定义一个Plugin
package com.enn.carbon.inclusion.dal;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.internal.util.StringUtility;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* GeneratorPlugin
*
* @author shenrongtao
* @date 2022/4/20
*/
public class GeneratorPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> list) {
return true;
}
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 添加import
topLevelClass.addImportedType("lombok.Data");
// 添加注解
topLevelClass.addAnnotation("@Data");
if (StringUtility.stringHasValue(introspectedTable.getRemarks())) {
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
topLevelClass.addJavaDocLine(" *");
topLevelClass.addJavaDocLine(" * @author " + "Your name");
topLevelClass.addJavaDocLine(" * @date " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
topLevelClass.addJavaDocLine(" */");
} else {
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * @author " + "Your name");
topLevelClass.addJavaDocLine(" * @date " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
topLevelClass.addJavaDocLine(" */");
}
return true;
}
@Override
public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
field.addJavaDocLine(" */");
}
return true;
}
@Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
// 不生成get方法
return false;
}
@Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
// 不生成set方法
return false;
}
}
在generatorConfig.xml中增加plugin标签
<plugin type="com.enn.carbon.inclusion.dal.GeneratorPlugin">
</plugin>
问题解决
一切配置好之后,当我们使用maven插件进行代码自动生成的时候,会出现如下问题
Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate (default-cli) on project carbon-inclusion-dal: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate failed: Cannot instantiate object of type com.enn.carbon.inclusion.dal.util.MybatisCommentGenerator
通过参考参考文章中的第四篇,出现这个问题的原因是mybatis-generator的plugin有自己的classpath,我们在项目中直接继承的类和plugin不属于同一个classpath,所以使用maven会报错,所以我们只能通过代码进行生成
package com.enn.carbon.inclusion.dal;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Generator {
public static void main(String[] args) throws Exception {
//MBG 执行过程中的警告信息
List<String> warnings = new ArrayList<>();
//当生成的代码重复时,覆盖原代码
boolean overwrite = true;
//读取我们的 MBG 配置文件
InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//创建 MBG
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//执行生成代码
myBatisGenerator.generate(null);
//输出警告信息
for (String warning : warnings) {
System.out.println(warning);
}
}
}
参考文章
MyBatis Generator 超详细配置:MyBatis Generator 超详细配置 - 掘金
MyBatis Generator 自动生成注释:MyBatis Generator 自定义生成注释 - SegmentFault 思否
MyBatis Generator 自定义 CommentGenerator 实现中文注释:MyBatis Generator 自定义CommentGenerator实现中文注释_西南马的博客-CSDN博客_commentgenerator
解决自定义CommentGenerator无法初始化的问题:generate failed: Cannot instantiate object of type com.wolffy.jwcz.plugin.MyCommentGenerator_代码编程_积微成著
自动生成domain,再也没有一堆Getter/Setter方法了:MybatisGenerator + Lombok 自动生成的domain再也没有一堆Getter/Setter方法了 - 简书
最后
以上就是隐形芹菜为你收集整理的Mybatis代码生成器如何自定义注释的全部内容,希望文章能够帮你解决Mybatis代码生成器如何自定义注释所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复