【Mybatis】Mybatis generator如何修改Mapper.java文件

我写的代码生成插件Gitee地址

同样是在扩展 Mybatis generator插件的时候,有这样一个需求是需要在生成的,那么 如何修改Mapper.java文件?

跟着Mybatis generator 源码去找一找 哪里可以扩展


源码分析:

源码入口:Context.generateFiles()

   public void generateFiles(ProgressCallback callback,
            List<GeneratedJavaFile> generatedJavaFiles,
            List<GeneratedXmlFile> generatedXmlFiles, List<String> warnings)
            throws InterruptedException {

        if (introspectedTables != null) {
            for (IntrospectedTable introspectedTable : introspectedTables) {
                callback.checkCancel();
                introspectedTable.initialize();
                introspectedTable.calculateGenerators(warnings, callback);
                //这里是 javaFiles的组装地方,主要去看一下introspectedTable
                        .getGeneratedJavaFiles()方法
                generatedJavaFiles.addAll(introspectedTable
                        .getGeneratedJavaFiles());
                        //
                generatedXmlFiles.addAll(introspectedTable
                        .getGeneratedXmlFiles());

                //这里预留了插件来生成JavaFile文件;
                generatedJavaFiles.addAll(pluginAggregator
                        .contextGenerateAdditionalJavaFiles(introspectedTable));
                //这里预留了插件来生成Xml文件;
                generatedXmlFiles.addAll(pluginAggregator
                        .contextGenerateAdditionalXmlFiles(introspectedTable));
            }
        }

        generatedJavaFiles.addAll(pluginAggregator
                .contextGenerateAdditionalJavaFiles());
        generatedXmlFiles.addAll(pluginAggregator
                .contextGenerateAdditionalXmlFiles());
    }

然后进入introspectedTable.getGeneratedJavaFiles()方法

@Override
    public List<GeneratedJavaFile> getGeneratedJavaFiles() {
        List<GeneratedJavaFile> answer = new ArrayList<GeneratedJavaFile>();
        //javaModelGenerators 存的是 JavaModel 和 JavaModelExample 类
        for (AbstractJavaGenerator javaGenerator : javaModelGenerators) {
        //这一行才是重点,因为所有的准备数据都是在这个方法里面
            List<CompilationUnit> compilationUnits = javaGenerator
                    .getCompilationUnits();
            for (CompilationUnit compilationUnit : compilationUnits) {
                GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit,
                        context.getJavaModelGeneratorConfiguration()
                                .getTargetProject(),
                                context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING),
                                context.getJavaFormatter());
                answer.add(gjf);
            }
        }

        //  clientGenerators 然后javaModelGenerators 存的是 JavaMapper.java文件 
        for (AbstractJavaGenerator javaGenerator : clientGenerators) {
         //这一行才是重点,因为所有的准备数据都是在这个方法里面
            List<CompilationUnit> compilationUnits = javaGenerator
                    .getCompilationUnits();
            for (CompilationUnit compilationUnit : compilationUnits) {
                GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit,
                        context.getJavaClientGeneratorConfiguration()
                                .getTargetProject(),
                                context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING),
                                context.getJavaFormatter());
                answer.add(gjf);
            }
        }

        return answer;
    }

重点方法:javaGenerator.getCompilationUnits();

这个方法是真正填充数据的地方

AbstractJavaGenerator 这个是抽象类,主要是用来生成Java文件的 下面有很多实现类;

比如生成

JavaModel 文件的BaseRecordGenerator

JavaModelExample文件的ExampleGenerator

Mapper.java文件的JavaMapperGenerator

这个实现类都实现了getCompilationUnits方法;这些方法都在为即将生成的文件组装数据

我们看一下JavaMapperGenerator 中的实现

 @Override
    public List<CompilationUnit> getCompilationUnits() {
        progressCallback.startTask(getString("Progress.17", //$NON-NLS-1$
                introspectedTable.getFullyQualifiedTable().toString()));
        CommentGenerator commentGenerator = context.getCommentGenerator();

        FullyQualifiedJavaType type = new FullyQualifiedJavaType(
                introspectedTable.getMyBatis3JavaMapperType());
        Interface interfaze = new Interface(type);
        interfaze.setVisibility(JavaVisibility.PUBLIC);
        //看到这里喜出望外,这里就是扩展点了;因为它把inerfaze给传进去了,那我们可以在这里做一些我们想做的事情
        commentGenerator.addJavaFileComment(interfaze);

        //省略无关......

修改Mapper.java文件

在前几篇文章中我们已经创建了CommentGenerator对象了,那我们可以在这里面来做扩展

    @Override
    public void addJavaFileComment(CompilationUnit compilationUnit) {
            //生成的是 JavaModel 和 JavaModelExample 文件
            if(compilationUnit instanceof TopLevelClass){
                //这里可以修改  JavaModel 和 JavaModelExample 文件
                /*TopLevelClass topLevelClass = (TopLevelClass)compilationUnit;
                String shortName = compilationUnit.getType().getShortName();
                topLevelClass.addAnnotation("@Resource");
                topLevelClass.addImportedType("javax.annotation.Resource");*/
            }

            //生成的是Mapper.java 文件
            if(compilationUnit instanceof Interface){
                Interface anInterface = (Interface)compilationUnit;
                //下面的可以给JavaFile 添加注释
                //topLevelClass.addFileCommentLine("/**generator by Shirc generator common.....**/");
                String shortName = compilationUnit.getType().getShortName();
                if(shortName!=null||shortName.endsWith("Mapper"))return;
                //只给JavaModel添加注解就行了,Example不需要
                anInterface.addAnnotation("@Resource");
                anInterface.addImportedType(new FullyQualifiedJavaType("javax.annotation.Resource"));
            }
    }

上面的代码中 给Mapper.java 文件添加了注解,如果想改更多,可以按照它的格式来做;

上一篇:关闭防火墙和杀毒软件的脚本


下一篇:LoadRunner脚本编写之一