项目结构预览
实现功能
- 通用的新增方法
- 通用的分页方法
- 通用的修改方法
注意事项
- 需要修改的位置
generatorConfig.properties文件中
- 项目路径
- jdbcConnection 连接的相关配置
generatorConfig.xml文件中
- 生成对应表及类名 这个配置需要修改,你需要对哪些表生产代码就添加哪些表
运行
直接运行GeneratorStartUp类即可
相关扩展介绍
1自定义文档注释
由于 mybatis-generator 自带的文档注释对我们中国人不太友好。为了项目需要,我在此项目中扩展了一下文档注释。
首先,我自定义了MyCommentGenerator类,其继承自DefaultCommentGenerator 在该类中我们需要以下几个方法
2addGeneralMethodComment 方法,该方法用于给方法添加文档注释
3addFieldComment 方法,该方法用于给属性添加文档注释
4addGetterComment,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; }
4.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相关技术探究
项目结构介绍
api包主要提供外部接口,供扩展使用,切入点可以试MyPluginAdapter类
codegen 包是生成文件的核心包,入口是IntrospectedTableMyBatis3Impl类,生成对应文件文件需要的类在对应的
子包中,如:生成xml文件相关的类在 xmlmapper包中。
internal 包下 DefaultCommentGenerator 类是用于生成对应的文档注释。可以扩展,扩展之后再修改一下generatorConfig.xml
mybatis-generator-core相关技术探究
项目结构介绍
api包主要提供外部接口,供扩展使用,切入点可以试MyPluginAdapter类
codegen 包是生成文件的核心包,入口是IntrospectedTableMyBatis3Impl类,生成对应文件文件需要的类在对应的
子包中,如:生成xml文件相关的类在 xmlmapper包中。
internal 包下 DefaultCommentGenerator 类是用于生成对应的文档注释。可以扩展,扩展之后再修改一下generatorConfig.xml
涉及到的设计模式
适配器模式
具体的适配器模式可以参考:设计模式学习06----之适配器模式
工厂方法模式:
具体的工厂方法模式可以参考:设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式
参考文档:
http://www.mybatis.org/generator/index.html
资源下载
http://download.csdn.net/download/u014534808/10174149