MyBatis Generator生成Oracle数据库对应实体类时无法获取注释问题

血红的双手。 提交于 2019-12-19 14:43:09

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

  最近在利用mybatis generator生成Oracle数据库对应的实体类时发现一个问题,特此记录下。
  因为项目使用到了swagger2,所以想在生成实体类时通过表注释和字段注释生成对应的@ApiMode和@ApiModelProperty等注解。但是发现没有效果,经过查看源码发现OracleDatabaseMetaData类会判断remarksReporting属性的值是否为true,当为ture时才会获取注释。故只用在jdbcConnection配置中多加一条属性 <property name="remarksReporting" value="true"/> 即可。

源码如下:

package org.mybatis.generator.api;

public class MyBatisGenerator {
    public void generate(ProgressCallback callback, Set<String> contextIds,
            Set<String> fullyQualifiedTableNames, boolean writeFiles) throws SQLException,
            IOException, InterruptedException {
        // 只关注关键代码,前面代码没有复制进来
        for (Context context : contextsToRun) {
            // 重要的是该方法
            context.introspectTables(callback, warnings,
                    fullyQualifiedTableNames);
        }
        // 后面的方法逻辑忽略
    }
}
package org.mybatis.generator.config;

public class Context extends PropertyHolder {
    public void introspectTables(ProgressCallback callback,
            List<String> warnings, Set<String> fullyQualifiedTableNames)
            throws SQLException, InterruptedException {
        // 前面的方法逻辑忽略 重要的是databaseIntrospector.introspectTables方法
        List<IntrospectedTable> tables = databaseIntrospector.
            .introspectTables(tc);
        if (tables != null) {
            introspectedTables.addAll(tables);
        }
    }
}
package org.mybatis.generator.internal.db;

public class DatabaseIntrospector {
    public List<IntrospectedTable> introspectTables(TableConfiguration tc) {
        // 前面的方法逻辑忽略 重要的是 calculateIntrospectedTables方法
        List<IntrospectedTable> introspectedTables = calculateIntrospectedTables(
                tc, columns);
    }

   private List<IntrospectedTable> calculateIntrospectedTables(
            TableConfiguration tc,
            Map<ActualTableName, List<IntrospectedColumn>> columns) {
        // 前面的方法逻辑忽略 重要的是 enhanceIntrospectedTable方法
        enhanceIntrospectedTable(introspectedTable);
   }

    private void enhanceIntrospectedTable(IntrospectedTable introspectedTable) {
        // 前面的方法逻辑忽略 重要的是 databaseMetaData.getTables方法
        ResultSet rs = databaseMetaData.getTables(fqt.getIntrospectedCatalog(), fqt.getIntrospectedSchema(),
     }
}
package oracle.jdbc;

public class OracleDatabaseMetaData implements AdditionalDatabaseMetaData {
	// 此处没有找到oralce的源码
    public synchronized ResultSet getTables(String var1, String var2, String var3, String[] var4) throws SQLException {
        String var6 = "       c.comments AS remarks\n";
        String var7 = "       NULL AS remarks\n";
        // 可以看到此处会判断remarksReporting的值是否为true,为true才有查原注释,否则会把null值当成注释
        if (this.connection.getRemarksReporting()) {
            var22 = var22 + var6 + var8;
        } else {
            var22 = var22 + var7 + var9;
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!