MyBatis的逆向工程

2021-01-29 11:01:29 浏览数 (2)

用MyBatis的逆向工程对应注释很是烦恼,再者公司要求代码要增加协议,又前后端分离需要swagger的支持,而且看源码,不会增加类注释和注解,方法是空的,自定义无效,所以就改动了下代码生成器的源码,效果如下,这个是直接改的源码,为了方便大家,我把其他东西删掉了,默认生成没有协议注释和注解。

但是我提供了一个自定义类,大家有需要可以自己编辑。

这个包我是在Oracle上测试的,没有试过sqlserver、mysql那些,有问题可以提出来,谢谢。

资源:之前上传的csdn资源竟然要积分,这次换了个百度网盘的。

链接:https://pan.baidu.com/s/1RQDhjiF_L6uT3cE0fFtCcQ 提取码:j53u

工程名自动获取,用户名自动获取,在数据库中要有注释才能生成注释。

自定义类:

代码语言:javascript复制
package com.sunnada.gaia.task.construction;

import java.util.Set;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

/**
 *  注释
 *
 * @author LI
 */
public class CustomGenerator extends DefaultCommentGenerator {

    /**
     * 增加类注释
     * @param topLevelClass
     * @param introspectedTable
     * @return
     */
    public void addAllClassComment(JavaElement topLevelClass, IntrospectedTable introspectedTable) {
        topLevelClass.addJavaDocLine("/**");
        String remarks = introspectedTable.getRemarks();
        //判断有注释才增加注释
        if ( StringUtility.stringHasValue(remarks)) {
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));
            for (String remarkLine : remarkLines) {
                topLevelClass.addJavaDocLine(" *   "   remarkLine);
            }
        }
        topLevelClass.addJavaDocLine(" *");
        //这里获取的是计算机名
        topLevelClass.addJavaDocLine(" * @author " System.getenv().get("COMPUTERNAME"));
        topLevelClass.addJavaDocLine(" */");
    }

    /**
     * 属性注释
     * @param field
     * @param introspectedTable
     * @param introspectedColumn
     */
    @Override
    public void addFieldComment(Field field,
                                IntrospectedTable introspectedTable,
                                IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        if(isEmpty(remarks))
            return;
        field.addJavaDocLine("/**"); //$NON-NLS-1$
        if (StringUtility.stringHasValue(remarks)) {
            field.addJavaDocLine(" *   "   remarks);  //$NON-NLS-1$
        }
        field.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    /**
     * 这个是通用方法注释(就是mapper)
     * 暂不用注释
     * @param method 方法对象
     * @param introspectedTable 表信息
     */
    @Override
    public void addGeneralMethodComment(Method method,
                                        IntrospectedTable introspectedTable) {
//通用方法不注释
//        StringBuilder sb = new StringBuilder();
//        //获取列名
//        List<IntrospectedColumn> list = introspectedTable.getBaseColumns();
//        for (IntrospectedColumn column : list) {
//            //如果是delete,根据id删除
//            //如果是update,根据id更新
//            //如果是insert,新增表名
//            //如果是select,根据id查询
//        }
//        method.addJavaDocLine("/**"); //$NON-NLS-1$
        sb.append(introspectedTable.getFullyQualifiedTable());
//        method.addJavaDocLine(" * 待写");
//
//        method.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    /**
     * get方法注释
     * @param method 方法对象
     * @param introspectedTable 表信息
     * @param introspectedColumn 列信息
     */
    @Override
    public void addGetterComment(Method method,
                                 IntrospectedTable introspectedTable,
                                 IntrospectedColumn introspectedColumn) {
        StringBuilder sb = new StringBuilder();
        String remarks = introspectedColumn.getRemarks();
        if(isEmpty(remarks))
            return;
        method.addJavaDocLine("/**"); //$NON-NLS-1$
        if (StringUtility.stringHasValue(remarks)) {
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));  //$NON-NLS-1$
            for (String remarkLine : remarkLines) {
                method.addJavaDocLine(" *   获取 "   remarkLine);  //$NON-NLS-1$
            }
        }
        method.addJavaDocLine(" *"); //$NON-NLS-1$
        sb.setLength(0);
        sb.append(" * @return "); //$NON-NLS-1$
        sb.append(getSimpleRemark(introspectedColumn.getRemarks()));
        method.addJavaDocLine(sb.toString());

        method.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    /**
     * set方法注释
     * @param method 方法对象
     * @param introspectedTable 表信息
     * @param introspectedColumn 列信息
     */
    @Override
    public void addSetterComment(Method method,
                                 IntrospectedTable introspectedTable,
                                 IntrospectedColumn introspectedColumn) {
        StringBuilder sb = new StringBuilder();
        String remarks = introspectedColumn.getRemarks();
        if(isEmpty(remarks))
            return;
        method.addJavaDocLine("/**"); //$NON-NLS-1$
        if (StringUtility.stringHasValue(remarks)) {
            method.addJavaDocLine(" *   设置 "   remarks);  //$NON-NLS-1$
        }
        method.addJavaDocLine(" *"); //$NON-NLS-1$

        Parameter parm = method.getParameters().get(0);
        sb.setLength(0);
        sb.append(" * @param "); //$NON-NLS-1$
        sb.append(parm.getName());
        sb.append(" ");
        sb.append(getSimpleRemark(remarks));
        method.addJavaDocLine(sb.toString());
        method.addJavaDocLine(" */"); //$NON-NLS-1$
    }

    /**
     * 属性的注解
     *
     * @param field 属性
     * @param introspectedTable 表信息
     * @param introspectedColumn 列信息
     * @param imports 导包信息
     */
    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable,
                                   IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> imports) {
        String remark = introspectedColumn.getRemarks();
        //如果是前后端分离的话,都是swagger,那么实体类生成必须要增加,就不存在判断了
//        if(!isEmpty(remark))
        {
            imports.add(new FullyQualifiedJavaType("io.swagger.annotations.ApiModelProperty")); //$NON-NL
            field.addAnnotation("@ApiModelProperty(value="" getSimpleRemark(remark) "")");
        }
    }

    /**
     * 实体类注解
     * @param innerClass
     * @param introspectedTable
     * @param imports
     */
    @Override
    public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable,
                                   Set<FullyQualifiedJavaType> imports) {
        String remarks = introspectedTable.getRemarks();
//        if(!isEmpty(remarks))
        {
            imports.add(new FullyQualifiedJavaType("io.swagger.annotations.ApiModel")); //$NON-NLS-1$/$NON-NLS-1$
            innerClass.addAnnotation("@ApiModel("" remarks "")");
        }
    }

    /**
     * 类文件的头注释(企业协议)
     *
     * @return
     */
    @Override
    public String getClassFileComment() {
        StringBuilder sb = new StringBuilder();
//        sb.append("/**");
//        sb.append(System.getProperty("line.separator"));
//        sb.append(" * ");
//        sb.append("Created on [");
//        sb.append(dateToString(new Date(),"yyyy/MM/dd HH:mm"));
//        sb.append("] by ");
//        sb.append(System.getenv().get("COMPUTERNAME"));
//        sb.append(System.getProperty("line.separator"));
//        sb.append(" * ");
//        sb.append(System.getProperty("line.separator"));
//        sb.append(" * 项目名称: ");
//        sb.append(getProjectName());
//        sb.append(System.getProperty("line.separator"));
//        sb.append(" * ");
//        sb.append(System.getProperty("line.separator"));
        //协议内容
//        sb.append(" */ ");
//        sb.append(System.getProperty("line.separator"));
        return sb.toString();
    }
}

还有xml的配置文件里有这样一段话,一个是自定义类的配置,一个是默认的。

代码语言:javascript复制
  <!--<commentGenerator type="com.sunnada.gaia.task.construction.CustomGenerator">-->
        <commentGenerator >
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
            <property name="suppressAllComments" value="false"/>
        </commentGenerator>

0 人点赞