作者:石臻臻,CSDN 博客之星 Top5、Kafka Contributor、nacos 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 文件添加了注解,如果想改更多,可以按照它的格式来做;
评论