使用代码方式调用 MyBatis Generator,并生成自定义注释

MyBatis Generator 是个不错的工具,能方便的从数据库表逆向生成 Java 实体类以及 Mapper 文件。

通常项目中使用插件的方式调用 MyBatis Generator,常用的开发工具(Eclipse、IDEA)下都有对应的插件。当然 MyBatis Generator 还有不依赖开发环境的 maven 插件可用,而本文主要讲的是使用代码方式调用 MyBatis Generator。

为什么要使用代码方式?

主要有以下两方面的原因:

  1. 由于项目的开发工具不统一,有些同事习惯使用老的 Eclipse,有些同事喜欢流行的 IDEA。而当使用插件生成代码时,MyBatis Generator 在不同 IDE 下的配置文件 mybatis-generator.xml 在配置方面有些不一样,要搞两份配置,比较麻烦。

  2. MyBatis Generator 默认生成的代码注释不合我们项目需求,特别是一大段英文注释,着实让我们项目开发同事接受不了,但完全关闭注释又不行,毕竟开发还是希望至少能显示字段名称和注释的。

    于是我们写了一个自定义的 CommentGenerator,但是这个自定义的CommentGenerator 保存在项目代码里,如果要使用 maven 插件的话,需要修改 MyBatis Generator 的源码包,也很麻烦。

基于此,我们使用在项目代码里增加一个工具类,通过 Java 代码的方式调用 MyBatis Generator。

配置操作步骤

1,加入相关依赖:

1
2
3
4
5
6
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
<scope>provided</scope><!-- 不用打进最后的生产包 -->
</dependency>

2,创建工具类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MybatisGeneratorStarter {

/**
* 通过执行本方法,调用 Mybatis Generator 工具,生成相应代码。
* 避免 Eclipse、IDEA 之间插件使用的差异。
* @param args
* @return
*/
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
String configFilePath = MybatisGeneratorStarter.class.getClassLoader().getResource("mybatis-generator.xml").getFile(); // mybatis-generator.xml 配置文件放在 resources 目录里。
File configFile = new File(configFilePath);
ConfigurationParser parser = new ConfigurationParser(warnings);
Configuration config = parser.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(true); // 存在则覆盖
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}

具体代码写法,亦可参考官方文档:http://mybatis.org/generator/running/running.html

3,执行该 main 方法,查看生成效果。

执行遇到报错:nested exception is java.net.UnknownHostException: mybatis.org

在开发机器没有网的情况下,执行上述 main 方法,可能会报错:nested exception is java.net.UnknownHostException: mybatis.org

这是由于 mybatis-generator.xml 文件配置的问题。默认情况下,XML 的 DTD 文件配置的是一个网址,如:

1
2
3
4
5
6
<?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>
...
</generatorConfiguration>

因此 MyBatis Generator 会试图去网上拉 http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd 文件,网络不通自然就异常了。

解决办法就是对 XML 配置使用本地 DTD 文件。具体步骤如下:

  1. 找到上述 mybatis-generator-core-1.3.6.jar 依赖包,在包的 org\mybatis\generator\config\xml\ 目录下,可以看到 mybatis-generator-config_1_0.dtd 文件,把该文件拷贝到项目的 resources 目录里。

  2. 修改 mybatis-generator.xml 文件使用本地 DTD/mybatis-generator-config_1_0.dtd

    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "/mybatis-generator-config_1_0.dtd">
    <!-- MyBatis Generator 配置文件 -->
    <generatorConfiguration>
    ...
    </generatorConfiguration>

这样就使用本地 classPath 下的 DTD 定义,不会再去网上下载。