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实现的导出Excel工具类实例

    java实现的导出Excel工具类实例

    这篇文章主要介绍了java实现的导出Excel工具类,结合具体实例形式分析了java导出Excel导出并生成Excel表格相关操作技巧与注意事项,需要的朋友可以参考下
    2017-10-10
  • JDBC用法小结

    JDBC用法小结

    这篇文章主要介绍了JDBC用法,较为详细的分析了基于JDBC进行数据库操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Mybatis 缓存原理及失效情况解析

    Mybatis 缓存原理及失效情况解析

    这篇文章主要介绍了Mybatis 缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java动态设置注解值及原理详解

    Java动态设置注解值及原理详解

    这篇文章主要介绍了Java动态设置注解值及原理详解,AnnotationInvocationHandler是注解的代理hander,通过反射获取类的注解时会通过AnnotationInvocationHandler创建代理对象并将数据存储到memberValues里,需要的朋友可以参考下
    2023-11-11
  • MyBatis游标Cursor的正确使用和百万数据传输的内存测试

    MyBatis游标Cursor的正确使用和百万数据传输的内存测试

    这篇文章主要介绍了MyBatis游标Cursor的正确使用和百万数据传输的内存测试,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java微信扫码支付模式一线下支付功能实现

    java微信扫码支付模式一线下支付功能实现

    本篇文章主要介绍了JAVA微信扫码支付模式一线下支付功能实现,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • java如何将实体类转换成json并在控制台输出

    java如何将实体类转换成json并在控制台输出

    这篇文章主要介绍了java如何将实体类转换成json并在控制台输出问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java接口回调的本质详解

    Java接口回调的本质详解

    大家好,本篇文章主要讲的是Java接口回调的本质详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • springboot项目启动后执行方法的三种方式

    springboot项目启动后执行方法的三种方式

    有时项目需求,需要项目启动的时候向数据库中查询一下系统属性,或者需要加载某个特定的方法,下面这篇文章主要给大家介绍了关于springboot项目启动后执行方法的三种方式,需要的朋友可以参考下
    2022-06-06
  • Java修改PowerPoint幻灯片批注信息

    Java修改PowerPoint幻灯片批注信息

    这篇文章主要介绍了Java修改PowerPoint幻灯片批注信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论