项目结构预览

扩展mybatis-generator自动生成代码项目_generator

实现功能

  1. 通用的新增方法
  2. 通用的分页方法
  3. 通用的修改方法

注意事项

  • 需要修改的位置

generatorConfig.properties文件中

  1. 项目路径
  2. jdbcConnection 连接的相关配置

generatorConfig.xml文件中

  1. 生成对应表及类名 这个配置需要修改,你需要对哪些表生产代码就添加哪些表

运行

直接运行GeneratorStartUp类即可

相关扩展介绍

  1. 自定义文档注释
    由于​​​mybatis-generator​​​ 自带的文档注释对我们中国人不太友好。为了项目需要,我在此项目中扩展了一下文档注释。
    首先,我自定义了​​​MyCommentGenerator​​​类,其继承自​​DefaultCommentGenerator​​ 在该类中我们需要以下几个方法
  2. ​addGeneralMethodComment​​ 方法,该方法用于给方法添加文档注释
  3. ​addFieldComment​​ 方法,该方法用于给属性添加文档注释
  4. ​addGetterComment,addSetterComment​​这两个方法分别是给get,set方法添加文档注释
  5. 做好这些之后,我们需要修改一下​​generatorConfig.xml​​​中的配置​​<commentGenerator type="com.jay.generator.internal.MyCommentGenerator"> <property name="javaFileEncoding" value="UTF-8"/> </commentGenerator>​
  6. 配置属性化
    原有的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
*/
@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;

}
  1. ​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的几点说明

  1. 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相关技术探究

项目结构介绍

  1. ​api​​​包主要提供外部接口,供扩展使用,切入点可以试​​MyPluginAdapter​​类
  2. ​codegen​​​ 包是生成文件的核心包,入口是​​IntrospectedTableMyBatis3Impl​​​类,生成对应文件文件需要的类在对应的
    子包中,如:生成xml文件相关的类在​​​xmlmapper​​包中。
  3. ​internal​​​ 包下​​DefaultCommentGenerator​​ 类是用于生成对应的文档注释。可以扩展,扩展之后再修改一下generatorConfig.xml

涉及到的设计模式

  1. 适配器模式
    具体的适配器模式可以参考:​​​设计模式学习06----之适配器模式​
  2. 工厂方法模式:
    扩展mybatis-generator自动生成代码项目_generator_02
    具体的工厂方法模式可以参考:​​​设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式​

参考文档:

​http://www.mybatis.org/generator/index.html​

资源下载