运行MyBatis Generator

MBG 提供了很多种运行方式,常用的有以下几种。

  • 使用 Java 编写代码运行

  • 从命令提示符运行

  • 使用 Maven Plugin 运行

  • 使用 Eclipse 插件运行

这几种方式都有各自的优点和缺点,大家在看完下面的详细介绍后,可以根据自己的情况选择合适的方式,下面按顺序详细介绍这几种运行方式。

使用Java编写代码运行

在写代码前,需要先把 MBG 的 jar 包添加到项目当中。

第一种方式是,从地址 https://github.com/mybatis/generator/releases 下载 jar 包。

第二种方式是,使用 Maven 方式直接引入依赖,在 pom.xml 中添加如下依赖。

<!--MyBatis生成器-->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.5</version>
</dependency>

在 MyBatis 项目中添加 tk.mybatis.generator 包,创建 Generator.java 类。

package tk.mybatis.generator;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

/**
 * 读取 MBG 配置生成代码
 */
public class Generator {

	public static void main(String[] args) throws Exception {
		//MBG 执行过程中的警告信息
		List<String> warnings = new ArrayList<String>();
		//当生成的代码重复时,覆盖原代码
		boolean overwrite = true;
		//读取我们的 MBG 配置文件
		InputStream is = Generator.class.getResourceAsStream("/generator/generatorConfig.xml");
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(is);
		is.close();

		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		//创建 MBG
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
		//执行生成代码
		myBatisGenerator.generate(null);
		//输出警告信息
		for(String warning : warnings){
			System.out.println(warning);
		}
	}
}

使用 Java 编码方式运行的好处是,generatorConfig.xml 配置的一些特殊的类(如 commentGenerator 标签中 type 属性配置的 MyCommentGenerator 类)只要在当前项目中,或者在当前项目的 classpath 中,就可以直接使用。使用其他方式时都需要特别配置才能在 MBG 执行过程中找到 MyCommentGenerator 类并实例化,否则都会由于找不到这个类而抛出异常。

使用 Java 编码不方便的地方在于,它和当前项目是绑定在一起的,在 Maven 多子模块的情况下,可能需要增加编写代码量和配置量,配置多个,管理不方便。但是综合来说,这种方式出现的问题最少,配置最容易,因此推荐使用。

从命令提示符运行

从命令提示符运行就必须使用 jar 包,按照 5.3.1 节中提供的地址下载MBG的压缩包,解压后从 lib 目录中找到 mybatis-generator-core-1.3.3.jar 文件。

将这个 jar 文件和 generatorConfig.xml 文件放到一起。从这里就可以体会到为什么说这种配置方式不方便了,因为需要修改 generatorConfig.xml 配置文件。

将 MySQL 的 JDBC 驱动(如 mysql-connector-java-5.1.38.jar)放到当前目录中,然后再配置文件中添加 classPathEntry,代码如下。

<generatorConfiguration>
	 <classPathEntry location="F:\.m2\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>

    <context id="MySqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!--其它原有配置-->
    </context>
</generatorConfiguration>

除此之外,在当前目录中添加 src 文件夹,在 src 中再添加 main 文件夹,main 文件夹中添加 java 和 resources 文件夹。此时,当前目录的结构如图5-1所示。

image 2024 05 22 16 37 49 298
Figure 1. 图5-1 目录结构

下面介绍一下 MBG 命令行可以接受的几个参数。

  • -configfile fileName:指定配置文件的名称。

  • -overwrite(可选):指定了该参数后,如果生成的 Java 文件存在已经同名的文件,新生成的文件则会覆盖原有的文件。没有指定该参数的情况下,如果存在同名的文件,MBG 会为新生成的代码文件指定一个唯一的名字(如 MyClass.java.1、MyClass.java.2 等)。

  • -verbose(可选):指定该参数,执行过程会输出到控制台。

  • -forceJavaLogging(可选):指定该参数,MBG 将会使用 Java 日志记录而不会使用 Log4J,即使 Log4J 在运行时的类路径中。

  • -contextids context1,context2,..(可选):指定该参数,逗号隔开的这些 context 会被执行。这些指定的 context 必须和配置文件中 context 标签的 id 属性一致。只有指定的 contextid 会被激活执行。如果没有指定该参数,所有的 context 都会被激活执行。

  • -tables table1,table2,…​(可选):指定该参数,逗号隔开的这些表会被运行,这些表名必须和 table 配置中的表名完全一致,只有被指定的表会被执行。如果没有指定该参数,所有的表都会被执行。

除了上面几个 MBG 的参数外,还要简单介绍一下 java 命令的参数。

  • -jar XXX.jar:执行 jar 包时的基本参数。

  • -Dfile.encoding=XXX:一般命令行的环境都是 GBK 编码,因此如果需要生成 UTF-8 编码的代码,则要在 java 命令上指定该参数,这里的 XXX 可以是 UTF-8、GBK 等编码。

  • -cp:当需要依赖其他的 jar 包时,通过 cp 命令可将其他 jar 包添加到当前的 classpath 环境中,使用 -cp 时不能使用 -jar。

知道基本的命令后,先用最简单的命令执行 MBG 看一下结果,在当前目录中打开命令行(或将命令行移到当前目录),输入以下命令。

java -jar mybatis-generator-core-1.3.3.jar -configfile generatorConfig.xml

执行这个命令后,可以在 src/main 下面的对应目录中看到生成的代码,如果查看这个文件的编码,会发现这些编码都是 GBK 方式。现在很多项目,尤其是使用 Maven 的项目,基本上都是 UTF-8 编码,想要生成 UTF-8 编码的文件,可以输入如下命令(由于上一条命令已经生成了一次,因此这里增加了 -overwrite 参数)。

java -Dfile.encoding=UTF-8 -jar mybatis-generator-core-1.3.3.jar -configfile generatorConfig.xml -overwrite

再次查看编码,会发现编码都已经变成 UTF-8 方式了。

可以看到,命令行方式的特点是完全独立于项目,针对不同项目配置不同的 generatorConfig.xml 文件。在对 MBG 的定制很少的时候,这种方式使用起来也比较方便。但是当需要定制一些自己的实现时,这种方式就会变得麻烦起来,假设要使用自己实现的 MyCommentGenerator 类,需要按照如下步骤进行操作。

  1. 将包含 MyCommentGenerator 类的项目打包为 jar(假设为 my-comment-generator.jar)。

  2. 将该 jar 包放到当前目录中。

  3. 需要使用 -cp 参数代替 -jar,将依赖的 jar 都列出来。

修改的命令如下。

java -Dfile.encoding=UTF-8 -cp my-comment-generator.jar;mybatis-generator-core-1.3.3.jar org.mybatis.generator.api.ShellRunner -configfile generatorConfig.xml -overwrite

需要注意,-cp 后面有多个 jar 包时,在 Windows 系统中要使用英文分号 “;” 隔开,在 Linux 系统中要使用英文冒号 “:” 隔开,jar 包最后面需指明要执行的主类(包含 main 方法的类)。

这种方式的命令写起来虽然麻烦,但是可以在 Windows 中创建 .bat 批处理文件(Linux 为 .sh),在当前目录下创建一个 run.bat 文件,在 run.bat 中输入上面的命令保存。之后需要运行时,直接用鼠标双击 run.bat 即可。

使用Maven Plugin运行

使用 Maven 插件方式和第一种 Java 编码方式类似,都是和项目绑定在一起的,当需要引用其他类时,需要给 Maven 插件添加依赖,否则会找不到类。

在 MyBatis simple 项目的 pom.xml 中添加如下插件配置。

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.3</version>
    <configuration>
        <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>simple</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</plugin>

configuration 标签中的配置类似于命令行中的参数,通过名称即可理解。

这个配置中特殊的地方在于插件中的 dependencies 配置,在 generatorConfig.xml 配置文件中,没有通过 classPathEntry 方式配置 JDBC 驱动,这里通过添加依赖将 JDBC 驱动添加到了 MBG 的 classpath 中,另外还添加了当前项目的依赖。这样一来,若在当前项目中定制了 MBG 的某个实现,配置后可以直接找到。需要特别注意的是,当前项目必须执行过 mvn install(通过 Maven 命令将当前项目安装到本地仓库),否则会找不到当前项目的依赖。

配置好插件之后,可以执行如下 Maven 命令。

mvn mybatis-generator:generate

在 Eclipse 中执行命令时,可以在 pom.xml 文件上单击鼠标右键选择 Run As 中的 Maven build 选项,打开如图5-2所示的界面。

image 2024 05 22 16 50 39 319
Figure 2. 图5-2 Maven build

将 Name 改为 simple-mbg,然后在 Goals 中输入 mybatis-generator:generate,可以选择 Skip Tests,最后点击 Run 执行即可。下次若想重新执行,从 Eclipse 工具栏的 Run 中选择 simple-mbg 即可。

使用Eclipse插件运行

MBG 针对 Eclipse 提供了相应的插件,可以更好地生成代码。Eclipse 插件的最大好处就是,这是 MBG 中唯一一种支持代码合并的运行方式。在前面几种运行方式中,生成代码的注释中都有一个 @mbggenerated 标记,这个标记的含义是,被标记的这个字段或方法是自动生成的,重新生成时会被覆盖。没有这个标记的代码不是自动生成的,不应该被覆盖。但是前面 3 种方式在重新生成的时候,这个标记没有任何作用,不管有没有这个标记都会被覆盖,即自己在生成后的代码中添加的内容都会被覆盖。这就导致增加字段或方法后,若需要重新生成,就必须自己比对文件把加入的代码恢复,使用起来很不方便。MBG 的 Eclipse 插件支持这个标记,因此该插件有很大的优势。

安装Eclipse插件

从 MBG 的发布页面 https://github.com/mybatis/generator/releases 中下载插件,此处使用如下版本。

mybatis-generator-eclipse-site-1.3.3.201606241937.zip

下载插件后,在 Eclipse 中选择菜单 Help 中的 Install New Software,打开如图5-3所示的窗口。

image 2024 05 22 16 52 40 840
Figure 3. 图5-3 Install New Software

点击 Add 按钮,在弹出的窗口中选择 Archive,选择下载完成的 MBG 插件,输入 Name MBG 后,点击 OK。

从下拉列表中选择全部的 MyBatis Generator,点击 Next,一步步完成安装,安装完成后重启 Eclipse。

使用Eclipse插件

打开之前在 src/main/resources 下面创建的 generator/generatorConfig.xml 文件,对这个文件做一些简单修改。

Eclipse 插件的运行方式有点特殊,JDBC 驱动需要通过 classPathEntry 进行配置,其他定制的类只要在当前项目或当前项目的 classpath 中即可使用。

在配置文件中增加 classPathEntry 配置,指定 MySQL 驱动的位置,然后在 context 中添加一个 javaFileEncoding 的 property 标签配置,指定生成代码的编码方式为 UTF-8,修改的部分配置如下。

<generatorConfiguration>
	 <classPathEntry location="F:\.m2\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>

    <context id="MySqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        <!--其它原有配置-->
    </context>
</generatorConfiguration>

除此之外,在和 targetProject 有关的相对路径中需要增加当前的项目名称,将 src\main\java 改为 simple\src\main\java,将 src\main\resources 改为 simple\src\main\resources。

完成上述修改后,在配置文件中单击鼠标右键,选择如图5-4所示的选项。

image 2024 05 22 16 56 00 791
Figure 4. 图5-4 Generate MyBatis

点击 Generate MyBatis 后就会自动生成代码。

@mbggenerated标记

在默认的注释生成器中,生成的实体类、Mapper 接口、Mapper XML 文件中都有这个标记。使用 Eclipse 插件的时候,不要手动删除注释中的这个标记,这样当重新生成表的相关代码时,这些代码都会被自动合并。

当需要在自动生成的代码中添加自己的代码时,不要在自己添加的内容中增加 @mbggenerated 标记,这样就可以保证在重新生成时不会覆盖之前所做的改动,这个优点在给实体类增加字段、给 Mapper 接口添加方法、给 Mapper XML 文件添加方法时非常有用,尤其在初期表改动相对频繁时特别有用。