自定义Mybatis Generator注释

参考链接

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&amp;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方法,可以看到modeldao包内已经有生成的模型类和数据操作类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值