为了让mybatis generator生成的代码更符合自己企业的需求,可以通过以下方式,扩展mybatis generator
例子包含扩展功能:
生成通用扩展Dao文件(包含java文件和xml文件),对自定义sql和默认sql的统一操作;
去除无用的注释,按照列备注显示到实体字段注释;
自定义Jdbc类型到java类型映射;
使用Lombok代替getter、Setter
Github 源码:查看
一、编写扩展插件
新创建一个基本的maven项目命名Extend
本文中的扩展主要以打jar包方式引入到mybatis generator 插件中,扩展、插件的编写都在extend项目中进行。
项目结构如下,创建自己需要的包,如comment、plugin、resolver
pom.xml 加入打包插件,引入mybatis-generator核心依赖
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打Jar包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<!--<mainClass>com.xxg.Main</mainClass>-->
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
》》》准备就绪开始编写插件
生成扩展Dao文件
由于默认生成的mapper、model、xml文件不够灵活,当需要添加额外的sql操作时需要手动添加Dao类进行扩展,而且重复生成时,xml文件会一直追加。为解决以上问题,尝试添加自定义扩展生成java文件和xml文件。
在cn.aesop.extend.plugin包下创建类AddExtendDaoPlugin.java 继承org.mybatis.generator.api.PluginAdapter 开始编写自定义插件
更多细节参见:https://github.com/aesopcmc/mybatis-generator-extend/blob/master/extend/src/main/java/cn/aesop/extend/plugin/AddExtendDaoPlugin.java
重写 validate 返回true,插件才能生效
@Override
public boolean validate(List<String> list) {
// TODO 自定义验证
return true;
}
处理默认生成的文件不追加,直接覆盖
@Override
public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {
daoBaseName = introspectedTable.getFullyQualifiedTable().getDomainObjectName() + "Dao";
try {
Field field = sqlMap.getClass().getDeclaredField("isMergeable");
field.setAccessible(true);
field.setBoolean(sqlMap, false);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
在插件类中可以直接通过properties 获取传入的参数
String targetPackage = properties.getProperty("targetPackage");
对于如何传入参数后续进行说明
生成扩展xxxDao.java文件
该方法会对应每一个实体,只生成一次,已生成的不会覆盖
@Override
public List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) {
// ...
}
生成扩展xxxDao.xml文件
该方法会对应每一个实体,只生成一次,已生成的不会覆盖
@Override
public List<GeneratedXmlFile> contextGenerateAdditionalXmlFiles(IntrospectedTable introspectedTable) {
// ...
}
使用Lombok注解替换Getter、Setter方法
在cn.aesop.extend.plugin包下创建类UseLombokPlugin.java 继承org.mybatis.generator.api.PluginAdapter 开始编写
更多细节参见:https://github.com/aesopcmc/mybatis-generator-extend/blob/master/extend/src/main/java/cn/aesop/extend/plugin/UseLombokPlugin.java
自定义注解,加载数据库comment注解,去除默认生成的无用的注释
在cn.aesop.extend.comment包下创建类MySQLCommentGenerator.java 开始编写
更多细节参见:https://github.com/aesopcmc/mybatis-generator-extend/blob/master/extend/src/main/java/cn/aesop/extend/comment/MySQLCommentGenerator.java
Jdbc类型到java类型映射,自定义扩展解析类
在cn.aesop.extend.resolver包下创建类MyJavaTypeResolverDefaultImpl.java 继承org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl 开始编写
更多细节参见:https://github.com/aesopcmc/mybatis-generator-extend/blob/master/extend/src/main/java/cn/aesop/extend/comment/MySQLCommentGenerator.java
打包,生成jar文件
二、项目使用mybatis generator生成文件、并添加扩展
详细配置参看:https://github.com/aesopcmc/mybatis-generator-extend/tree/master/example
pom.xml配置说明
- 引入两个依赖
lombok
、mybatis-spring-boot-starter Mybatis核心
- 添加mybatis generator的maven插件
mybatis-generator-maven-plugin
,引入依赖,该依赖是上面打包好的扩展jarextend-1.0-SNAPSHOT.jar
- 配置属性properties:mybatis.generator.xxx开头的属性皆为generator内置属性,其他为自定义属性,可在配置文件
generatorConfig.xml
中引用使用
generatorConfig.xml配置说明
<context targetRuntime="MyBatis3" defaultModelType="flat">
MyBatis3:默认值,可以生成带有XxxExampl的文件
flat:
该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。一般使用这个模型就够了
通过plugin
标签type
属性引入插件,使用property添加插件传入插件参数
通过commentGenerator
标签 type
属性添加自定义注解,注意需要设置addRemarkComments
属性值为true
通过javaTypeResolver
标签 type
属性自定义类映射。
在table
标签下添加<generatedKey column="id" sqlStatement="JDBC"/>
,插入数据会返回主键绑定,还可以添加枚举映射 <columnOverride column="model_name" jdbcType="VARCHAR" javaType="cn.aesop.example.enums.ModelNameEnum"/>
配置完成,执行maven插件生成代码
完毕。
以上内容涉及到的技术来源
官方文档
官方源码样例demo