项目结构预览
实现功能
- 通用的新增方法
- 通用的分页方法
- 通用的修改方法
注意事项
- 需要修改的位置
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
<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
*/
protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, List<String> warnings, ProgressCallback progressCallback) {
this.xmlMapperGenerator = new MySimpleXMLMapperGenerator();
this.initializeAbstractGenerator(this.xmlMapperGenerator, warnings, progressCallback);
}
/**
* Mapper类的生成方法
* @return
*/
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
*/
protected void calculateJavaModelGenerators(List<String> warnings, ProgressCallback progressCallback) {
super.calculateJavaModelGenerators(warnings, progressCallback);
}
分别新建:MySimpleXMLMapperGenerator
类,MySimpleJavaClientGenerator
类,用于生成xml文件和mapper文件。
3. MySimpleXMLMapperGenerator
类继承SimpleXMLMapperGenerator
类重写getSqlMapElement
方法
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
方法,如
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
涉及到的设计模式
- 适配器模式
具体的适配器模式可以参考:设计模式学习06----之适配器模式 - 工厂方法模式:
具体的工厂方法模式可以参考:设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式
参考文档:
http://www.mybatis.org/generator/index.html
资源下载