【Mybatis】Mybatis generator如何修改Mapper.java文件
【摘要】 我写的代码生成插件Gitee地址同样是在扩展 Mybatis generator插件的时候,有这样一个需求是需要在生成的,那么 如何修改Mapper.java文件?跟着Mybatis generator 源码去找一找 哪里可以扩展 源码分析:源码入口:Context.generateFiles() public void generateFiles(ProgressCallback c...
我写的代码生成插件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 文件添加了注解,如果想改更多,可以按照它的格式来做;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)