Mybatis generator修改Mapper.java文件实现详解

 更新时间:2022年09月30日 09:39:10   作者:石臻臻的杂货铺  
这篇文章主要为大家介绍了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 文件添加了注解,如果想改更多,可以按照它的格式来做;

以上就是Mybatis generator修改Mapper.java文件实现详解的详细内容,更多关于Mybatis generator修改Mapper.java的资料请关注脚本之家其它相关文章!

相关文章

  • Java源码解析之ClassLoader

    Java源码解析之ClassLoader

    在看系统启动的流程中看到了ClassLoader使用,重新温故下ClassLoader流程和原理,文中有非常详细的代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Java super关键字的使用方法详解

    Java super关键字的使用方法详解

    这篇文章主要介绍了Java super关键字的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家对super关键字彻底掌握,需要的朋友可以参考下
    2017-10-10
  • 二维码生成Java实现代码

    二维码生成Java实现代码

    这篇文章主要为大家详细介绍了二维码生成Java实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringBoot配置发送Email的示例代码

    SpringBoot配置发送Email的示例代码

    本篇文章主要介绍了SpringBoot配置发送Email的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 一文详细讲解Java的父子继承、方法的重写与super关键字

    一文详细讲解Java的父子继承、方法的重写与super关键字

    Java中继承是通过extends关键字实现,帮助减少代码重复,提高复用性,子类继承父类的属性和方法,但私有成员除外,方法重写(override)使子类改造父类方法以适应新功能,这篇文章主要介绍了Java的父子继承、方法的重写与super关键字的相关资料,需要的朋友可以参考下
    2024-10-10
  • 详解IntelliJ IDEA中TortoiseSVN修改服务器地址的方法

    详解IntelliJ IDEA中TortoiseSVN修改服务器地址的方法

    这篇文章主要介绍了详解IntelliJ IDEA中TortoiseSVN修改服务器地址的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • GC调优实战之过早提升Premature Promotion

    GC调优实战之过早提升Premature Promotion

    这篇文章主要为大家介绍了GC调优实战之过早提升Premature Promotion
    2022-01-01
  • SpringMVC中使用bean来接收form表单提交的参数时的注意点

    SpringMVC中使用bean来接收form表单提交的参数时的注意点

    本篇文章主要介绍了SpringMVC中使用bean来接收form表单提交的参数时的注意点,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • Idea如何去除Mapper警告方法解析

    Idea如何去除Mapper警告方法解析

    这篇文章主要介绍了Idea如何去除Mapper 警告的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 10分钟带你理解Java中的弱引用

    10分钟带你理解Java中的弱引用

    这篇文章将带大家快速理解Java中弱引用,文章介绍的很详细,对大家学习Java很有帮助哦,有需要的可以参考借鉴。
    2016-08-08

最新评论