写点什么

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

  • 2022-10-18
    江西
  • 本文字数:3684 字

    阅读完需:约 1 分钟

作者石臻臻,CSDN 博客之星 Top5Kafka Contributornacos Contributor华为云 MVP,腾讯云 TVP,滴滴 Kafka 技术专家 KnowStreaming


KnowStreaming 是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不够的同学,可以联系我,当你导师带你参与开源!

我写的代码生成插件Gitee地址同样是在扩展 Mybatis generator 插件的时候,有这样一个需求是需要在生成的,那么 如何修改 Mapper.java 文件?跟着 Mybatis generator 源码去找一找 哪里可以扩展

1 源码分析:源码入口: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());    }
复制代码

2 然后进入 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;    }
复制代码

3 重点方法:javaGenerator.getCompilationUnits();

这个方法是真正填充数据的地方 AbstractJavaGenerator 这个是抽象类,主要是用来生成 Java 文件的 下面有很多实现类;比如生成 JavaModel 文件的 BaseRecordGeneratorJavaModelExample 文件的 ExampleGeneratorMapper.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 文件添加了注解,如果想改更多,可以按照它的格式来做;

发布于: 刚刚阅读数: 3
用户头像

关注公众号: 石臻臻的杂货铺 获取最新文章 2019-09-06 加入

进高质量滴滴技术交流群,只交流技术不闲聊 加 szzdzhp001 进群 20w字《Kafka运维与实战宝典》PDF下载请关注公众号:石臻臻的杂货铺

评论

发布
暂无评论
【Mybatis】Mybatis generator如何修改Mapper.java文件_mybatis_石臻臻的杂货铺_InfoQ写作社区