generator自动生成实体类的过程中加入lombok注解、自动继承基础类
第一步:在resources目录下新建generator配置文件。我自己写的如下:
(下面会专门讲里面的自定义插件,其他的配置网上一搜一大堆,应该没什么)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!--数据库驱动-->
<context id="myGen" targetRuntime="MyBatis3">
<!--自定义插件 -->
<plugin type="com.weina.codegenerator.LombokPlugin">
<property name="hasLombok" value="true"/>
</plugin>
<!--关闭注释-->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/myproject?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC"
userId="root"
password="myc123456">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成Model类存放位置-->
<javaModelGenerator targetPackage="com.weina.myproject.entity" targetProject="entity/src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
<property name="rootClass" value="com.weina.myproject.entity.BaseEntity"/>
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="com.weina.myproject.mapper" targetProject="entity/src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.weina.myproject.mapper" targetProject="entity/src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名-->
<!--<table tableName="test"
domainObjectName="Test"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"></table>-->
<table tableName="m_user"
domainObjectName="MUser"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
第二步:在pom文件中加入下面配置(跟dependencies同级)
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<executions>
<execution>
<id>Generate Mybatis Files</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
如果没有上面配置文件中的plugin(自定义插件),那么这样配置就可以使用了。但现在有配置。
第三步:在自己项目下新建一个插件类
public class LombokPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> list) {
return true;
}
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 添加实体的import
topLevelClass.addImportedType("com.weina.annotation.WnColumn");
topLevelClass.addImportedType("com.weina.annotation.WnTable");
topLevelClass.addImportedType("lombok.Data");
topLevelClass.addImportedType("lombok.Builder");
topLevelClass.addImportedType("lombok.NoArgsConstructor");
topLevelClass.addImportedType("lombok.AllArgsConstructor");
//添加实体的注解
topLevelClass.addAnnotation("@Data");
topLevelClass.addAnnotation("@Builder");
topLevelClass.addAnnotation("@NoArgsConstructor");
topLevelClass.addAnnotation("@AllArgsConstructor");
topLevelClass.addAnnotation("@WnTable(tableName = \"" + introspectedTable.getFullyQualifiedTable() + "\")");
//添加注释
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine("* Created by Mybatis Generator on " + date2Str(new Date()));
topLevelClass.addJavaDocLine("*/");
return true;
}
// 添加字段注解
@Override
public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
field.addAnnotation("@WnColumn(fieldName = \"" + introspectedColumn.getActualColumnName() + "\")");
return true;
}
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
return super.clientGenerated(interfaze, topLevelClass, introspectedTable);
}
// 由于我使用lombok,所以此处不生成setter方法
@Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
//return super.modelSetterMethodGenerated(method, topLevelClass, introspectedColumn, introspectedTable, modelClassType);
return false;
}
@Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
return false;
}
private String date2Str(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
return sdf.format(date);
}
上面这个类就是配置文件中使用的插件类。可自行修改
第四步:客户端类,生成代码的main方法类
public class GeneratorClient {
public static void main(String[] args) {
String path = GeneratorClient.class.getResource("/").getPath();
String filePath = path + "generatorConfig.xml";// 这是我的配置文件名
args = new String[] { "-configfile", filePath, "-overwrite" };
//E:\Workspaces\IdeaProjects\myproject\entity\src\main\resources\generatorConfig.xml
ShellRunner.main(args);
}
}
运行main方法,即可生成想要的代码
注意:由于我的实体类都继承一个BaseEntity.所以运行之前,要建好BaseEntity类,BaseEntity中有的字段,不会在子类中生成,比如BaseEntity
public class BaseEntity {
private Long id;
private Long createTime;
}
那么生成子类的时候,如果子类中有这两个字段,就不会再在子类中生成了。
如果不需要子类继承统一父类,直接去掉配置文件中
javaModelGenerator下的
<property name="rootClass" value="com.weina.myproject.entity.BaseEntity"/>
就行了
之前看了好几篇文章,都说要把插件类先 生成jar包,再放到mybaits的jar中,试过,也行,但太麻烦了。
如果有人有疑问,我的目录结构如下:
如果需要完整项目,请移步
我的github