MyBatis Generatorを使ってみました。MyBatis Generatorは、Mapperクラス、取得したデータなどを格納するEntityクラス、SQLを記述するXMLファイルを自動生成してくれます。このジェネレーターを実行することでテーブル操作に必要なクラスやファイルを用意できるのでとても便利です。

目次

環境

  • JDK 12 (OpenJDK)
  • Apache Maven 3.6.1
  • MyBatis Generator Maven Plugin 1.3.7
  • MySQL 8.0.15

データベースはDockerでMySQLの環境構築で作成したものを使用します。

Mavenプロジェクトの作成

MyBatisでMySQLに接続すると同様に、Mavenでプロジェクトを作成します。

mvn archetype:generate \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false \
  -DgroupId=learning.mybatis \
  -DartifactId=mybatis-app

依存関係の追加

pom.xmlを編集し、MyBatis Generator Maven Pluginを追加します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.7</version>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
          </dependency>
        </dependencies>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

プラグインの依存関係にMySQLのコネクターを追加しないとClassNotFoundExceptionが発生します。

Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

MyBatis Generatorの設定ファイル

src/main/resourcesディレクトリにgeneratorConfig.xmlを作成します。

<!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" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost/world"
        userId="root"
        password="mysql">
    </jdbcConnection>

    <javaModelGenerator targetPackage="learning.mybatis.model" targetProject="src/main/java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="learning.mybatis.data"  targetProject="src/main/resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator type="XMLMAPPER" targetPackage="learning.mybatis.data"  targetProject="src/main/java">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table schema="world" tableName="countrylanguage" />

  </context>
</generatorConfiguration>

table要素には、生成対象となるテーブルを指定します。今回は、以下のcountrylanguageテーブルに対してジェネレーターを実行します。

mysql> desc countrylanguage;
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   | PRI |         |       |
| Language    | char(30)      | NO   | PRI |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | float(4,1)    | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+

ジェネレーターの実行

Mavenでジェネレーターを実行します。

mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate

mybatis.generator.overwrite=trueは必須ではありませんが、このオプションをつけないと実行時にファイルが既に存在した場合、suffix付きのファイルが生成されてしまうため、なるべくこのオプションをつけて実行したほうがよいと思います。

$ tree src/main/java/learning/mybatis/model
src/main/java/learning/mybatis/model
├── ...
├── Countrylanguage.java
├── Countrylanguage.java.1
├── Countrylanguage.java.2
├── Countrylanguage.java.3
├── CountrylanguageExample.java
├── CountrylanguageExample.java.1
├── CountrylanguageExample.java.2
├── CountrylanguageExample.java.3
├── CountrylanguageKey.java
├── CountrylanguageKey.java.1
├── CountrylanguageKey.java.2
└── CountrylanguageKey.java.3

実行結果の確認

クラスとXMLファイルが生成されていることを確認します。

$ tree mybatis-app
mybatis-app
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── learning
│   │   │       └── mybatis
│   │   │           ├── ...
│   │   │           ├── data
│   │   │           │   ├── ...
│   │   │           │   └── CountrylanguageMapper.java
│   │   │           └── model
│   │   │               ├── ...
│   │   │               ├── Countrylanguage.java
│   │   │               ├── CountrylanguageExample.java
│   │   │               └── CountrylanguageKey.java
│   │   └── resources
│   │       ├── generatorConfig.xml
│   │       ├── learning
│   │       │   └── mybatis
│   │       │       └── data
│   │       │           ├── ...
│   │       │           └── CountrylanguageMapper.xml
│   │       └── ...
...

ジェネレーター実行時のエラー

私の環境では、BUILD SUCCESSになっているにもかかわらず、以下のエラーが発生しました。

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

MySQLのコネクタに問題があるようなので、generatorConfig.xmlのconnectionURLにsslMode=DISABLEDをつけると解消しました。

connectionURL="jdbc:mysql://localhost/world?sslMode=DISABLED"

参考サイト:Java11からMySQL8への接続時に起きた問題の解決