Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

MyBatis Generatorを使ってコードの自動生成をしてみる

スポンサードリンク


皆さんJavaでORMは何を使っているでしょうか?だいたいJPA(Hibernate)かMyBatisだと思いますが、
Hibernateはやりたいことに対して複雑すぎるのがあって敬遠していると思います。
そこでMyBatisなのですが、何かと書くの面倒、楽したいってのはあると思います。
そこで検討してみるのがMyBatis Generatorではないでしょうか。というので、導入方法の紹介です。
今回やってみたのはアノテーションでの自動生成方法です。
XMLでの生成も簡単に設定で変えられます。

前提条件

コマンドラインで使えるMavenが入っていること
Eclipse Pleiades のJava Full Editionを入れとく

Pleiadesは昔重すぎて、余計なのがたくさんついてる印象であまり好きでなかったですが、
久々に使ってみるとよいです。いまだと必要なものだけが入っていていい感じ!
プラグインの相性が悪い変なハマりも少なくていいかも。

英語化したい場合は
[eclipseのインストールフォルダ]\eclipse\eclipse.iniファイルを変更
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jarの行を削除
最後の行に-Duser.language=en_USを追加
これでEclipseを再起動する

MarketplaceからMyBatisGeneratorを入れる

MarketplaceからMyBatis Generator 1.4.2をEclispeに入れる。

PostgreSQLをインストール

普通にインストールする。
Macの場合はここ参照

適当なデータを用意する

https://www.postgresqltutorial.com/postgresql-getting-started/postgresql-sample-database/

Spring Boot Projectを作成する

Name: demo-mybatis-generator
Type: Maven
Packaging: Jar
Java Version: 17
Language: Java

Lombok, Spring Boot DevTools, Spring Web がデフォルトで選ばれていると思うけど、
これに加えて
MyBatis Framework, PostgreSQL Driver, Thymeleaf を追加で入れる。

設定ファイルを整備する

src/man/resources/application.properties に以下を追記

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/dvdrental
spring.datasource.username=postgres
spring.datasource.password=postgres

※用意したデータの場合です。

pom.xmlの編集

https://mybatis.org/generator/running/runningWithMaven.html
を参考に
pom.xmlに次を追記する。

    <build>
        <plugins>
            <plugin>
                ...(関係ないので省略)
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.2</version>
                <configuration>
                    <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>${postgresql.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

※Eclipseから実行する場合はいらないところがいくつかあります。

generatorConfig.xmlの編集

Javaの場合はtargetRuntimeで指定する生成方法で3つの方法があり、大きく次の特徴があります。

MyBatis3DynamicSql MyBatis3 MyBatis3Simple
コード生成量 少なめ 多い 少ない
使うクラス MyBatis Dynamic SQL ~Example 普通のMapper
Annotation/XML Annotation 選択可 選択可

デフォルトはMyBatis3DynamicSqlでタイプセーフでコード生成量も比較的少なく そのままで柔軟なクエリが欠けるといった特徴があります。
しかし、独自DSLみたいな書き方を強制されるので人を選ぶ感じがあります。
自分で書く場合はAnnotationベースで書いちゃうって場合が多いと思います。 その場合、MyBatis3Simpleが多くの場合適してるのではないかと思います。

src/main/resources/generatorConfig.xml

<?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>
    <!-- 生成タイプはMyBatis3Simpleを選びます -->
    <context id="postgres" targetRuntime="MyBatis3Simple">
        <!-- 生成コメントの設定 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        
        <!-- DB接続設定 -->
        <jdbcConnection driverClass="org.postgresql.Driver"
            connectionURL="jdbc:postgresql://localhost:5432/dvdrental"
            userId="postgres" password="postgres">
        </jdbcConnection>
        
        <!-- Entityの設定 -->
        <javaModelGenerator
            targetPackage="com.example.demo.entity"
            targetProject="src/main/java">
        </javaModelGenerator>
        
        <!-- Mapper(XML)の設定 -->
        <!--
        <sqlMapGenerator
            targetPackage="com.example.demo.mapper"
            targetProject="src/main/resources">
        </sqlMapGenerator>
        -->
        
        <!-- Mapper(Java)の設定 -->
        <javaClientGenerator type="ANNOTATEDMAPPER"
            targetPackage="com.example.demo.mapper"
            targetProject="src/main/java">
        </javaClientGenerator>
        
        <!-- コードを生成するテーブルを指定 -->
        <table tableName="actor" modelType="flat">
        </table>
    </context>
</generatorConfiguration>

かなり細かい設定ができますので、気になる方は、こちらを参照。
MyBatis Generator Core – MyBatis Generator XML Configuration File Reference

この設定の場合、自分でMapper書きたいなと思えば、簡単に追加することができます。
自動生成したコードを直接触るのはどうなの?とかいうのはあるかと思いますが、
そこはプロジェクト次第だと思います。

コードの自動生成

コマンドプロンプトから

mvn mybatis-generator:generate

この例ではentity配下にActor.java
mapper配下にActorMapper.java
が生成されます。