参考链接
mybatis-generator自定义注释生成
MyBatis GeneratorXML Configuration File Reference
自定义Mybatis Generator注释步骤
1、配置自己的mybatisGenerator.xml
,位置存放在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>
<!-- 路径必须为绝对路径 -->
<classPathEntry location="{yourPathPrefix}/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar" />
<!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 注释配置 -->
<commentGenerator type="com.shuhaith.test.MybatisCommentGenerator">
<property name="author" value="shuhaith"/>
<property name="copyRightName" value="shuhaith.com"/>
</commentGenerator>
<context id="Mysql" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&useSSL=true"
userId="shuhaith"
password="root">
<!-- 设置 useInformationSchema 属性为 true,生成注释时读取数据库中表的comment -->
<property name="useInformationSchema" value="true"/>
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject路径必须为绝对路径 -->
<javaModelGenerator targetPackage="com.shuhaith.test.model" targetProject="{yourProjectPath}/src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject路径必须为绝对路径 -->
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.shuhaith.test.dao" targetProject="{yourProjectPath}/src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- %为通配符,所有表都会生成,你也可以选择自定义的正则式 -->
<table tableName="%" >
<!-- 自动递增ID会在插入数据后随模型类的ID属性返回 -->
<generatedKey column="ID" sqlStatement="Mysql" identity="true" />
</table>
</context>
</generatorConfiguration>
2、实现org.mybatis.generator.api.CommentGenerator
接口,参考org.mybatis.generator.internal.DefaultCommentGenerator
写自定义的MyCommentGenerator
/**
* mybatis自定义注释实现
* @author shuhaith
**/
public class MyCommentGenerator implements CommentGenerator {
private Properties properties = new Properties();
private boolean suppressDate = false;
private boolean suppressAllComments = false;
private boolean addRemarkComments = false;
private String dateFormatString;
private Calendar calendar = Calendar.getInstance();
private String author = "";
private String copyRightName = "";
public MybatisCommentGenerator() {
dateFormatString =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
/**
* 添加配置信息,初始化该类中的私有变量
* 该方法执行顺序仅次于构造方法
*/
@Override
public void addConfigurationProperties(Properties properties) {
this.properties.putAll(properties);
this.suppressDate = StringUtility.isTrue(properties.getProperty("suppressDate"));
this.suppressAllComments = StringUtility.isTrue(properties.getProperty("suppressAllComments"));
this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
this.author = properties.getProperty("author");
this.copyRightName = properties.getProperty("copyRightName");
}
/**
* 添加自定义javaDoc标签
*/
protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
javaElement.addJavaDocLine(" *");
StringBuilder sb = new StringBuilder();
sb.append(" * @author ").append(author);
javaElement.addJavaDocLine(sb.toString());
sb.setLength(0);
if (markAsDoNotDelete) {
javaElement.addJavaDocLine(" * do_not_delete_during_merge");
}
if (dateFormatString != null) {
sb.append(" * @createTime ").append(dateFormatString);
}
javaElement.addJavaDocLine(sb.toString());
}
/**
* Java属性注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
if (!this.suppressAllComments) {
field.addJavaDocLine("/**");
StringBuilder sb = new StringBuilder(" * ");
sb.append(introspectedColumn.getRemarks());//表中注释
field.addJavaDocLine(sb.toString());
field.addJavaDocLine(" */");
}
}
/**
* Java属性注释
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
if (!this.suppressAllComments) {
StringBuilder sb = new StringBuilder();
field.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());//没有注释使用表名代替
field.addJavaDocLine(sb.toString());
field.addJavaDocLine(" */");
}
}
/**
* java类注释
*/
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
addClassComment(innerClass, introspectedTable, false);
}
/**
* java类注释
*/
@Override
public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {
if (!this.suppressAllComments) {
StringBuilder sb = new StringBuilder();
innerClass.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
innerClass.addJavaDocLine(sb.toString());
this.addJavadocTag(innerClass, b);
innerClass.addJavaDocLine(" */");
}
}
/**
* 枚举类注释
*/
@Override
public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
if (!this.suppressAllComments) {
StringBuilder sb = new StringBuilder();
innerEnum.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
innerEnum.addJavaDocLine(sb.toString());
this.addJavadocTag(innerEnum, false);
innerEnum.addJavaDocLine(" */");
}
}
/**
* get方法注释
*/
@Override
public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (!this.suppressAllComments) {
StringBuilder sb = new StringBuilder();
method.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" *");
sb.setLength(0);
sb.append(" * @return ");
sb.append(introspectedColumn.getActualColumnName());
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" */");
}
}
/**
* set方法注释
*/
@Override
public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
if (!this.suppressAllComments) {
StringBuilder sb = new StringBuilder();
method.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedColumn.getRemarks());
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" *");
sb.setLength(0);
sb.append(" * @param ");
sb.append(introspectedColumn.getActualColumnName());
method.addJavaDocLine(sb.toString());
method.addJavaDocLine(" */");
}
}
/**
* 通用方法注释
*/
@Override
public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
if (!this.suppressAllComments) {
StringBuilder sb = new StringBuilder();
method.addJavaDocLine("/**");
sb.append(" * ");
sb.append(introspectedTable.getFullyQualifiedTable());
method.addJavaDocLine(sb.toString());
this.addJavadocTag(method, false);
method.addJavaDocLine(" */");
}
}
/**
* Java文件注释
*/
@Override
public void addJavaFileComment(CompilationUnit compilationUnit) {
compilationUnit.addFileCommentLine("/*");
compilationUnit.addFileCommentLine("* " + compilationUnit.getType().getShortName() + ".java");
compilationUnit.addFileCommentLine("* Copyright ©2018-" + calendar.get(Calendar.YEAR) +
" " + copyRightName);
compilationUnit.addFileCommentLine("* @createTime " + dateFormatString +
"");
compilationUnit.addFileCommentLine("*/");
}
@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) {
}
}
3、运行自定义注释类有多重方法,一种是用MBG运行,另一种使用本地main
方法运行。第一种需要将MyCommentGenerator
打包成jar并导入到本地Maven仓库再将其引入,比较麻烦,所以我这里选择第二种,使用本地方法。
public class MyCommentGeneratorTest{
public static void main(String[] args) {
try {
List<String> warnings = new ArrayList<>();
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mybatisGenerator.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(inputStream);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(new VerboseProgressCallback());
for (String warning : warnings)
System.out.println(warning);
} catch (IOException | SQLException | InterruptedException
| InvalidConfigurationException | XMLParserException e) {
e.printStackTrace();
}
}
}
4、运行main
方法,可以看到model
和dao
包内已经有生成的模型类和数据操作类。