mybatis-generator源码修改—修改实体注释

mybatis-generator在日常开发中使用的比较多,而且比较方便,但是也想根据自己的需要做一些修改,于是自己研究并修改了源码

项目地址:https://gitee.com/yikun/mybatis-generator-chenyk/tree/release1.4.1

直接修改:mybatis-generator-core即可,修改之后使用maven打包成jar包,替换maven仓库里面对应的jar包即可。

1、修改实体类注释

实体类的注释要替换成数据表和对应字段的注释,而且信息还要再丰富一点。

先看修改之后的效果:

mybatis-generator源码修改—修改实体注释_第1张图片

1)先找到从数据库获取表和字段的地方,在:org.mybatis.generator.internal.db.DatabaseIntrospector,这个类下面,找到:introspectTables这个方法:

mybatis-generator源码修改—修改实体注释_第2张图片

我们先进入:getColumns这个方法,往下看可以看到,是在这里获取表的字段以及基本的属性的:

mybatis-generator源码修改—修改实体注释_第3张图片

在setRemarks这一步,原来其实获取不到对应字段的注释的,我们在这里修改一下,从oracle的user_col_comments表获取到每个字段的注释,增加一个方法:

    /**
     * 获取表字段的注释
     * add by chenyk on 20220410
     * @param tableName
     * @return
     */
    public Map getColumnComment(String tableName){
        Map result = new HashMap<>();
        Statement statement = null;
        ResultSet rs = null;

        try{
            StringBuilder sql = new StringBuilder();
            sql.append(" select cm.table_name, \n");
            sql.append("        cm.column_name, \n");
            sql.append("        cm.comments  \n");
            sql.append(" from user_col_comments cm  \n");
            sql.append(" where table_name='"+tableName+"' \n");
            System.out.println(sql.toString());

            statement = databaseMetaData.getConnection().createStatement();

            rs = statement.executeQuery(sql.toString());
            while (rs.next()){
                String column_name = rs.getString("column_name");
                String comments = rs.getString("comments");
                //System.out.println(column_name+" <----:---->"+comments);
                result.put(column_name,comments);
            }

        }catch (Exception e){
            logger.error("",e);
        }
        finally {
            closeResultSet(rs);
            closeStatement(statement);
        }

        return result;
    }

 至于表的注释,原来是在enhanceIntrospectedTable这个方法里面设置,但是其实是获取不到表的注释的,我们通过oracle的表:user_tab_comments,获取表的注释,增加一个方法:

   /**
     * 获取表的注释
     * add by chenyk on 20220410
     * @param tableName
     * @return
     */
    public String getTableComment(String tableName){
        Statement statement = null;
        ResultSet rs = null;

        try{
            StringBuilder sql = new StringBuilder();
            sql.append("select c.COMMENTS \n");
            sql.append("from user_tab_comments c \n");
            sql.append("where c.TABLE_NAME='"+tableName+"' \n");

            System.out.println(sql);

            statement = databaseMetaData.getConnection().createStatement();

            rs = statement.executeQuery(sql.toString());

            String comments = null;

            while (rs.next()){
                comments = rs.getString("COMMENTS");
            }

            return comments;

        }catch (Exception e){
            logger.error("",e);
        }
        finally {
            closeResultSet(rs);
            closeStatement(statement);
        }

        return null;
    }

2)找到生成实体类注释的地方

在org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator,这个类里面是生成实体的地方,我们找到这一段

mybatis-generator源码修改—修改实体注释_第4张图片

最终找到生成注释的地方:org.mybatis.generator.internal.DefaultCommentGenerator。

可以重新创建一个类,修改这个方法,生成每个字段的注释:

 public void addFieldComment(Field field,
                                IntrospectedTable introspectedTable,
                                IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }

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

        String remarks = introspectedColumn.getRemarks();
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {

            String[] remarkLines = remarks.split(System.getProperty("line.separator")); //$NON-NLS-1$
            for (String remarkLine : remarkLines) {
                field.addJavaDocLine(" *   " + remarkLine); //$NON-NLS-1$
            }
        }

        String s = " *  column " //$NON-NLS-1$
                + introspectedTable.getFullyQualifiedTable()
                + '.'
                + introspectedColumn.getActualColumnName();
        field.addJavaDocLine(s);

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

 修改这个方法,生成对应类的注释:

public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        if (suppressAllComments || !addRemarkComments) {
            return;
        }

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

        String remarks = introspectedTable.getRemarks();
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            String[] remarkLines = remarks.split(System.getProperty("line.separator")); //$NON-NLS-1$
            for (String remarkLine : remarkLines) {
                topLevelClass.addJavaDocLine(" *  " + remarkLine); //$NON-NLS-1$
            }
        }

        String s = " *  table " //$NON-NLS-1$
                + introspectedTable.getFullyQualifiedTable();
        topLevelClass.addJavaDocLine(s);

        if(StringUtility.stringHasValue(author)){
            topLevelClass.addJavaDocLine(" *  @author  "+author);
        }

        String dateString = getDateString();
        topLevelClass.addJavaDocLine(" *  date "+dateString);


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

你可能感兴趣的:(java)