首先附上我扩展后项目的github地址
点击打开链接
用过mybatis-generator的人应该都清楚,它默认是不支持Java代码合并的,只支持XML合并,这给我们的开发工作带来了一些麻烦。查看源代码
它默认的代码是这样的: /* (non-Javadoc)
* @see org.mybatis.generator.api.ShellCallback#mergeJavaFile(java.lang.String, java.lang.String, java.lang.String[], java.lang.String)
*/
public String mergeJavaFile(String newFileSource,
String existingFileFullPath, String[] javadocTags, String fileEncoding)
throws ShellException {
throw new UnsupportedOperationException();
}
仅仅是抛出了一个不支持的异常。如是我试着去扩展了这个接口,中间借助了JavaParser这个用于解析Java文件的工具,附上它的github地址:点击打开链接
在引用它的maven包的时候我发现,原来mybatis-generator中也对它有使用,只是版本比较低,我将其改成了高版本的,修改后如下:<!-- TODO: Raising above 2.4.0 required jdk 8 usage -->
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>3.2.10</version>
<!--<scope>test</scope>-->
</dependency>
最后我重写了mergeJavaFile方法,这个代码如下:
public String mergeJavaFile(String newFileSource,
String existingFileFullPath)
throws ShellException, FileNotFoundException {
return new JavaFileMergerJaxp().getNewJavaFile(newFileSource,existingFileFullPath);
}
public String getNewJavaFile(String newFileSource, String existingFileFullPath) throws FileNotFoundException {
CompilationUnit newCompilationUnit = JavaParser.parse(newFileSource);
CompilationUnit existingCompilationUnit = JavaParser.parse(new File(existingFileFullPath));
return mergerFile(newCompilationUnit,existingCompilationUnit);
}
public String mergerFile(CompilationUnit newCompilationUnit,CompilationUnit existingCompilationUnit){
StringBuilder sb = new StringBuilder(newCompilationUnit.getPackageDeclaration().get().toString());
newCompilationUnit.removePackageDeclaration();
//合并imports
NodeList<ImportDeclaration> imports = newCompilationUnit.getImports();
imports.addAll(existingCompilationUnit.getImports());
Set importSet = new HashSet<ImportDeclaration>();
importSet.addAll(imports);
NodeList<ImportDeclaration> newImports = new NodeList<>();
newImports.addAll(importSet);
newCompilationUnit.setImports(newImports);
for (ImportDeclaration i:newCompilationUnit.getImports()) {
sb.append(i.toString());
}
newLine(sb);
NodeList<TypeDeclaration<?>> types = newCompilationUnit.getTypes();
NodeList<TypeDeclaration<?>> oldTypes = existingCompilationUnit.getTypes();
for (int i = 0;i<types.size();i++) {
//截取Class
String classNameInfo = types.get(i).toString().substring(0, types.get(i).toString().indexOf("{")+1);
sb.append(classNameInfo);
newLine(sb);
newLine(sb);
//合并fields
List<FieldDeclaration> fields = types.get(i).getFields();
List<FieldDeclaration> oldFields = oldTypes.get(i).getFields();
List<FieldDeclaration> newFields = new ArrayList<>();
HashSet<FieldDeclaration> fieldDeclarations = new HashSet<>();
fieldDeclarations.addAll(fields);
fieldDeclarations.addAll(oldFields);
newFields.addAll(fieldDeclarations);
for (FieldDeclaration f: newFields){
sb.append(f.toString());
newLine(sb);
newLine(sb);
}
//合并methods
List<MethodDeclaration> methods = types.get(i).getMethods();
List<MethodDeclaration> existingMethods = oldTypes.get(i).getMethods();
for (MethodDeclaration f: methods){
sb.append(f.toString());
newLine(sb);
newLine(sb);
}
for (MethodDeclaration m:existingMethods){
boolean flag = true;
for (String tag : MergeConstants.OLD_ELEMENT_TAGS) {
if (m.toString().contains(tag)) {
flag = false;
break;
}
}
if (flag){
sb.append(m.toString());
newLine(sb);
newLine(sb);
}
}
//判断是否有内部类
types.get(i).getChildNodes();
for (Node n:types.get(i).getChildNodes()){
if (n.toString().contains("static class")){
sb.append(n.toString());
}
}
}
return sb.append(System.getProperty("line.separator")+"}").toString();
}
希望能给大家带来一些参考