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

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

作者石臻臻, 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天前
|
JavaScript Java Android开发
在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
12 1
|
3天前
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
29 5
|
5天前
|
SQL Java 关系型数据库
Java中的ORM框架——myBatis
Java中的ORM框架——myBatis
|
2天前
|
Java
创建java文件 自动添加作者、时间等信息 – IDEA 技巧
创建java文件 自动添加作者、时间等信息 – IDEA 技巧
4 0
|
2天前
|
Java
java 文件读写实例
java 文件读写实例
|
3天前
|
Java Maven
Java 怎样从 excel 中读取文件、写入文件
Java 怎样从 excel 中读取文件、写入文件
10 0
|
3天前
|
Java 数据库连接 Android开发
SSM框架——使用MyBatis Generator自动创建代码
SSM框架——使用MyBatis Generator自动创建代码
11 2
|
3天前
|
Java
Java读取txt文件和写入txt文件-多种方法-java读写文件-java读写
Java读取txt文件和写入txt文件-多种方法-java读写文件-java读写
15 0
|
4天前
|
IDE 数据可视化 Java
Java基础6-Java文件和Java包结构和常用的jar包(二)
Java基础6-Java文件和Java包结构和常用的jar包(二)
11 0
|
4天前
|
Java Unix 编译器
Java基础6-Java文件和Java包结构和常用的jar包(一)
Java基础6-Java文件和Java包结构和常用的jar包(一)
15 0