MyBatis 代码生成插件
2021-06-14 本文已影响0人
SheHuan
maven 项目中,整合了 MyBatis 后,可以集成 mybatis generator 插件来生成数据库表对应的 Java Bean、 以及 MyBatis 的 mapper 文件。
首先在pom.xml
添加插件:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<verbose>true</verbose>
<!--生成文件时是否覆盖已有文件-->
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 根据自己的数据库版本修改 -->
<version>8.0.15</version>
</dependency>
</dependencies>
</plugin>
然后将插件的配置文件generatorConfig.xml
放在resources
目录:
<?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="mysql" defaultModelType="hierarchical"
targetRuntime="MyBatis3Simple">
<!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表; 一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
<property name="autoDelimitKeywords" value="false"/>
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化java代码 -->
<property name="javaFormatter"
value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代码 -->
<property name="xmlFormatter"
value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
<!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="mergeable" value="flase"/>
<!-- 配置表结构对应 Java Bean 的注解生成器 -->
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!-- 配置数据库连接 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0"
userId="root"
password="shehuan">
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- java 类型处理器 用于处理 DB中的类型到 java 中的类型,默认使用 JavaTypeResolverDefaultImpl;
注意一点,默认会先尝试使用 Integer,Long,Short 等来对应 DECIMAL 和 NUMERIC 数据类型 -->
<javaTypeResolver
type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成 mysql表对应的 Java Bean 类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录,生成的类会放到指定目录中,如果目录不存在,生成器不会自动建目录 -->
<javaModelGenerator targetPackage="com.sh.mybatis.bean"
targetProject="src/main/java">
<!-- 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter; -->
<property name="constructorBased" value="false"/>
<!-- 是否创建一个不可变的类,如果为true,那么代码生成器会创建一个没有setter方法的类,取而代之的是类似constructorBased的类 -->
<property name="immutable" value="false"/>
<!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
<property name="trimStrings" value="false"/>
</javaModelGenerator>
<!-- 生成 mapper.xml 文件,如果 javaClientGenerator中配置了 type="XMLMAPPER",这个元素就必须配置 -->
<sqlMapGenerator targetPackage="com.sh.mybatis.mapper"
targetProject="src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成 mapper.java 接口文件,type可选的参数如下:
1、ANNOTATEDMAPPER:会生成 mapper.java 接口,sql 以注解的形式出现在接口方法上,不会生成对应的 xml 文件
2、XMLMAPPER:会生成 mapper.java 接口,以及包含 sql 的 mapper.xml 文件 -->
<javaClientGenerator targetPackage="com.sh.mybatis.mapper"
type="XMLMAPPER" targetProject="src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="true"/>
<!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查 -->
<property name="rootInterface" value=""/>
</javaClientGenerator>
<!-- tableName的值为 % 表示给所有表生成 bean、mapper;或者单独指定表名也行 -->
<table tableName="%" schema="SCOTT">
<property name="constructorBased" value="false"/>
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
jdbcConnection
标签是用来配置数据库连接的。
修改javaModelGenerator
、sqlMapGenerator
、javaClientGenerator
标签中的targetPackage
属性来配置生成文件保存的目录即可。
最后边的table
标签用来配置生成单表的文件还是全部表的文件。
最后编译项目,运行如下插件即可:
生成的目标文件如下:
但是里边的注释乱七八糟的,额外添加了许多没用的:
这是由于插件生成注解时默认使用DefaultCommentGenerator
类,我们理想的情况是只在生成数据库表对应的 Java Bean 时添加表以及字段的注释即可。
所以就需要自定义注解生成的类,先添加依赖:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
自定义的注解生成类如下,需要实现CommentGenerator
接口:
public class MyCommentGenerator implements CommentGenerator {
private Properties properties;
public MyCommentGenerator() {
properties = new Properties();
}
@Override
public void addConfigurationProperties(Properties properties) {
// 获取自定义的 properties
this.properties.putAll(properties);
}
// 字段注解
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
if (StringUtils.isEmpty(introspectedColumn.getRemarks())) {
return;
}
// 获取字段注释
String remarks = introspectedColumn.getRemarks();
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + remarks);
field.addJavaDocLine(" */");
}
// 类注解
@Override
public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
String author = properties.getProperty("author");
// 获取表注释
String remarks = introspectedTable.getRemarks();
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * " + remarks);
topLevelClass.addJavaDocLine(" *");
topLevelClass.addJavaDocLine(" * @author " + author);
topLevelClass.addJavaDocLine(" */");
}
}
然后在generatorConfig.xml
中修改注解生成器的配置,指定我们自定义的注释生成类:
<!-- 配置表结构对应 Java Bean 的注解生成器 -->
<commentGenerator type="com.sh.mybatis.generator.MyCommentGenerator">
<!-- 自定义属性 -->
<property name="author" value="zhangsan"/>
</commentGenerator>
由于使用了自定义的注释生成类,所以无法像前边那样直接运行插件完成操作,需要我们通过代码来执行:
public class MyGenerator {
public static void main( String[] args ) throws Exception {
List<String> warnings = new ArrayList<>();
File configFile = new File("src/main/resources/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(true);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
运行后,再看User
类的注释,就符合我们的预期了: