擴充套件mybatis-generator自動生成程式碼專案
阿新 • • 發佈:2019-02-04
專案結構預覽
實現功能
- 通用的新增方法
- 通用的分頁方法
- 通用的修改方法
注意事項
- 需要修改的位置
generatorConfig.properties檔案中
- 專案路徑
- jdbcConnection 連線的相關配置
generatorConfig.xml檔案中
- 生成對應表及類名 這個配置需要修改,你需要對哪些表生產程式碼就新增哪些表
執行
直接執行GeneratorStartUp類即可
相關擴充套件介紹
- 自定義文件註釋
由於mybatis-generator
自帶的文件註釋對我們中國人不太友好。為了專案需要,我在此專案中擴充套件了一下文件註釋。
首先,我自定義了MyCommentGenerator
DefaultCommentGenerator
在該類中我們需要以下幾個方法
addGeneralMethodComment
方法,該方法用於給方法新增文件註釋addFieldComment
方法,該方法用於給屬性新增文件註釋addGetterComment,addSetterComment
這兩個方法分別是給get,set方法新增文件註釋- 做好這些之後,我們需要修改一下
generatorConfig.xml
中的配置<commentGenerator type="com.jay.generator.internal.MyCommentGenerator">
<property name="javaFileEncoding" value="UTF-8"/>
</commentGenerator>
- 配置屬性化
原有的mybatis-generator的工具,相關的配置個人感覺不是很方便。所以我也做了相應的修改。
首先,新建一個屬性檔案,如generatorConfig.properties
然後把相關配置放在該屬性檔案中:
如:
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/ssh_employee?useUnicode\=true&characterEncoding\=UTF-8
user=root
password=1234
我們先在generatorConfig.xml
<properties resource="generatorConfig.properties"></properties>
然後就可以使用相關的key,如:
<jdbcConnection driverClass="${driverClass}" connectionURL="${jdbcUrl}" userId="${user}" password="${password}">
3. 新增自定義方法
到了最重要的一個環節,當
mybatis-generator
自動內建的方法不滿足我們的需求的時候,我們可以擴充套件自定義方法。步驟如下: 1. 自定義類
MyIntrospectedTableMyBatis3SimpleImpl
繼承IntrospectedTableMyBatis3SimpleImpl
,如下:
/**
* XML的生成方法
* @param javaClientGenerator
* @param warnings
* @param progressCallback
*/
@Override
protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, List<String> warnings, ProgressCallback progressCallback) {
this.xmlMapperGenerator = new MySimpleXMLMapperGenerator();
this.initializeAbstractGenerator(this.xmlMapperGenerator, warnings, progressCallback);
}
/**
* Mapper類的生成方法
* @return
*/
@Override
protected AbstractJavaClientGenerator createJavaClientGenerator() {
if (this.context.getJavaClientGeneratorConfiguration() == null) {
return null;
} else {
String type = this.context.getJavaClientGeneratorConfiguration().getConfigurationType();
Object javaGenerator;
if ("XMLMAPPER".equalsIgnoreCase(type)) {
javaGenerator = new MySimpleJavaClientGenerator();
} else if ("ANNOTATEDMAPPER".equalsIgnoreCase(type)) {
javaGenerator = new MySimpleAnnotatedClientGenerator();
} else if ("MAPPER".equalsIgnoreCase(type)) {
javaGenerator = new MySimpleJavaClientGenerator();
} else {
javaGenerator = (AbstractJavaClientGenerator) ObjectFactory.createInternalObject(type);
}
return (AbstractJavaClientGenerator)javaGenerator;
}
}
/**
* model類的生成方法
* @param warnings
* @param progressCallback
*/
@Override
protected void calculateJavaModelGenerators(List<String> warnings, ProgressCallback progressCallback) {
super.calculateJavaModelGenerators(warnings, progressCallback);
}
分別新建:MySimpleXMLMapperGenerator
類,MySimpleJavaClientGenerator
類,用於生成xml檔案和mapper檔案。
3. MySimpleXMLMapperGenerator
類繼承SimpleXMLMapperGenerator
類重寫getSqlMapElement
方法
@Override
protected XmlElement getSqlMapElement() {
FullyQualifiedTable table = this.introspectedTable.getFullyQualifiedTable();
this.progressCallback.startTask(Messages.getString("Progress.12", table.toString()));
XmlElement answer = new XmlElement("mapper");
String namespace = this.introspectedTable.getMyBatis3SqlMapNamespace();
answer.addAttribute(new Attribute("namespace", namespace));
this.context.getCommentGenerator().addRootComment(answer);
this.addResultMapElement(answer);
this.addDeleteByPrimaryKeyElement(answer);
this.addInsertElement(answer);
this.addUpdateByPrimaryKeyElement(answer);
this.addSelectByPrimaryKeyElement(answer);
this.addSelectAllElement(answer);
this.addCountListElement(answer);
this.addQueryPageListElement(answer);
return answer;
}
MySimpleJavaClientGenerator
類繼承SimpleJavaClientGenerator
類重寫getCompilationUnits
方法,如
@Override
public List<CompilationUnit> getCompilationUnits() {
this.progressCallback.startTask(Messages.getString("Progress.17", this.introspectedTable.getFullyQualifiedTable().toString()));
CommentGenerator commentGenerator = this.context.getCommentGenerator();
FullyQualifiedJavaType type = new FullyQualifiedJavaType(this.introspectedTable.getMyBatis3JavaMapperType());
Interface interfaze = new Interface(type);
interfaze.setVisibility(JavaVisibility.PUBLIC);
//新增新增類註釋,這個是新增到類頭部,沒有多大作用
commentGenerator.addJavaFileComment(interfaze);
String rootInterface = this.introspectedTable.getTableConfigurationProperty("rootInterface");
if (!StringUtility.stringHasValue(rootInterface)) {
rootInterface = this.context.getJavaClientGeneratorConfiguration().getProperty("rootInterface");
}
if (StringUtility.stringHasValue(rootInterface)) {
FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(rootInterface);
interfaze.addSuperInterface(fqjt);
interfaze.addImportedType(fqjt);
}
this.addDeleteByPrimaryKeyMethod(interfaze);
this.addInsertMethod(interfaze);
this.addSelectByPrimaryKeyMethod(interfaze);
this.addSelectAllMethod(interfaze);
this.addUpdateByPrimaryKeyMethod(interfaze);
this.addCountListMethod(interfaze);
this.addQueryPageListMethod(interfaze);
List<CompilationUnit> answer = new ArrayList<CompilationUnit>();
if (this.context.getPlugins().clientGenerated(interfaze, (TopLevelClass) null, this.introspectedTable)) {
answer.add(interfaze);
}
List<CompilationUnit> extraCompilationUnits = this.getExtraCompilationUnits();
if (extraCompilationUnits != null) {
answer.addAll(extraCompilationUnits);
}
return answer;
}
generatorConfig.xml的幾點說明
- table 的配置的相關屬性說明:
<table tableName="sh_department" domainObjectName="ShDepartment"
enableInsert="true" enableDeleteByPrimaryKey="false" enableUpdateByPrimaryKey="true"
enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false" selectByPrimaryKeyQueryId="false"></table>
說明:tableName="sh_department"
表示表名為sh_department,
domainObjectName="ShDepartment"
表示實體類(model)的名稱為ShDepartment
enableInsert="true"
表示 生成 insert方法
enableDeleteByPrimaryKey="false"
表示不生成deleteByPrimaryKey方法
所以enablexxx="false"
為true表示生成某方法,為false表示不生成某方法。
mybatis-generator-core相關技術探究
專案結構介紹
api
包主要提供外部介面,供擴充套件使用,切入點可以試MyPluginAdapter
類codegen
包是生成檔案的核心包,入口是IntrospectedTableMyBatis3Impl
類,生成對應檔案檔案需要的類在對應的
子包中,如:生成xml檔案相關的類在xmlmapper
包中。internal
包下DefaultCommentGenerator
類是用於生成對應的文件註釋。可以擴充套件,擴充套件之後再修改一下generatorConfig.xml