ブログ アーカイブ

自己紹介

本ブログをご覧いただき、ありがとうございます。
株式会社ヒューマンインタラクティブテクノロジー(HIT)の技術グループ担当者です。

弊社ホームページ

2014年3月22日土曜日

MyBatisで遊んでみる(2) 第二章 mybatis-generatorによるMapper自動生成

どうも、トムです。
今回は前回からの続きでmybatis-generatorについて書いていきます。

mybatis-generatorはmybatisで利用するMapperファイル(SQLMapper)やJava Model(Entity)、Java Client(Mapper)などのSQLマッピングクラスを自動生成してくれるツールです。
これらを導入することで開発時にテーブル変更などがあった際、比較的楽に関連ファイルを作成することが出来ます。

前回で以下のテーブルが出来ていることを前提で進んでいきます。
\d my.dept
            テーブル "my.dept"
  列  |           型           |  修飾語
------+------------------------+----------
 id   | integer                | not null
 name | character varying(256) | not null
インデックス:
    "dept_pkey" PRIMARY KEY, btree (id)
参照元:
    TABLE "my.emp" CONSTRAINT "emp_dept_id_fkey" FOREIGN KEY (dept_id) REFERENCES my.dept(id)

\d my.emp
              テーブル "my.emp"
   列    |           型           |  修飾語
---------+------------------------+----------
 id      | integer                | not null
 dept_id | integer                | not null
 name    | character varying(256) | not null
 tel     | character varying(12)  | not null
インデックス:
    "emp_pkey" PRIMARY KEY, btree (id, dept_id)
外部キー制約:
    "emp_dept_id_fkey" FOREIGN KEY (dept_id) REFERENCES my.dept(id)

第二章 mybatis-generatorによるMapper自動生成

1. モジュールダウンロード

まずは必要なモジュールをダウンロードします。
mybatis 3
https://github.com/mybatis/mybatis-3/releases
mybatis-3.2.5.jar
記事作成時点での最新バージョンは「mybatis 3.2.5」
mybatis-generator
https://github.com/mybatis/generator/releases
mybatis-generator-core-1.3.2.jar
※クラスパスには含めません
postgreSQL jdbcドライバ
http://jdbc.postgresql.org/download.html
postgresql-9.3-1101.jdbc41.jar
記事作成時点での最新バージョンは「9.3-1101」
対応するドライバの種類は以下の通りです。
JDKバージョン 対応ドライバ
JDK 1.5 JDBC3
JDK 1.6 JDBC4
JDK 1.7, 1.8 JDBC41

ognl-3.0.6.jar
http://struts.apache.org/download.cgi
javassist.jar
http://sourceforge.jp/projects/sfnet_jaopframework/downloads/Library/javassist.jar/
log4j-1.2.17.jar
http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip


2. パッケージ構成

今回作成するMyBatisサンプルのパッケージ構成は以下の通り

3. Mapper、Entity自動生成の為の準備

以下の設定ファイルを新規に作成します。

mybatis-generator用の設定ファイル

<?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="context1">
    <!--
      生成するクラスオブジェクトにタイムスタンプを付与するかどうかを設定します。
      value="true" の場合は生成しません。

      詳細は公式リファレンス参照
      http://mybatis.github.io/generator/configreference/commentGenerator.html
    -->
    <commentGenerator>
        <property name="suppressDate" value="true" />
    </commentGenerator>

    <!-- JDBCの設定 -->
    <jdbcConnection driverClass="org.postgresql.Driver"
                        connectionURL="jdbc:postgresql://192.168.100.100:5432/test" userId="mybatisuser"
                        password="password" />

    <!--
       Java Model(Entity)クラスの生成先を指定します。
       targetPackage : 生成先パッケージ
       targetProject : プロジェクトディレクトリから生成先パッケージの親ディレクトリまでのパス

       詳細は公式リファレンス参照
       http://mybatis.github.io/generator/configreference/javaModelGenerator.html
     -->
    <javaModelGenerator targetPackage="jp.hit.sample.mybatis.entity"
                        targetProject="src" >
    </javaModelGenerator>

    <!--
       SQL Mapperファイルの生成先を指定します。
       targetPackage : 生成先パッケージ
       targetProject : プロジェクトディレクトリから生成先パッケージの親ディレクトリまでのパス

       詳細は公式リファレンス参照
       http://mybatis.github.io/generator/configreference/sqlMapGenerator.html
     -->
    <sqlMapGenerator targetPackage="jp.hit.sample.mybatis.mapper"
                        targetProject="resource" />

    <!--
       Java Clientクラスの生成先を指定します。
       Java ClientはSQL Mapperファイルを呼び出すためのインターフェースクラスです。
       targetPackage : 生成先パッケージ
       targetProject : プロジェクトディレクトリから生成先パッケージの親ディレクトリまでのパス

       詳細は公式リファレンス参照
       http://mybatis.github.io/generator/configreference/javaClientGenerator.html

       type :
         type="ANNOTATEDMAPPER"
            アノテーションを定義したMapperインターフェースクラスとアノテーションの実装を定義したSqlProviderクラスを生成する。
            Mapperファイルは生成しない。
            Mapperファイルを使用せずにアノテーションでクエリを発行したい人向け

         type="MIXEDMAPPER"
            アノテーションを定義したMapperインターフェースクラスとMapperファイルを生成する。
            SqlProviderクラスは生成しない。
            Mapperファイルとアノテーションでのクエリ発行を両立したい人向け。

         type="XMLMAPPER"
            MapperインターフェースクラスとMapperファイルのみ生成する。
            SQLを全部Mapperファイルで管理したい人向け。
     -->
    <javaClientGenerator targetPackage="jp.hit.sample.mybatis.client"
                        targetProject="src" type="XMLMAPPER" />

    <!--
     自動生成対象のテーブル名を[tableName]に指定する。
     ※テーブル名の指定はワイルドカードが利用できます

     詳しい設定値については公式サイトのリファレンスを参照してください。
     http://mybatis.github.io/generator/configreference/table.html

     modelType :
       modelType="flat"
          ドメインクラスのみ作成。
       modelType="hierarchical"
          自動生成するMapperのパラメータの為にPrimary Keyエンティティを生成します。
          MapperでPKを指定したクエリ(selectByPrimaryKey等)のパラメータがデフォルトでPrimary Keyエンティティになります。
     -->
    <table schema="my" tableName="%"
            enableInsert="true"
            enableSelectByPrimaryKey="true"
            enableSelectByExample="true"
            enableUpdateByPrimaryKey="true"
            enableUpdateByExample="false"
            enableDeleteByPrimaryKey="true"
            enableDeleteByExample="false"
            enableCountByExample="false"
            selectByExampleQueryId="false"
            modelType="hierarchical">
    </table>
  </context>
</generatorConfiguration>

Antでmybatis-generatorを実行するためのビルドファイル

<?xml version="1.0" encoding="utf-8"?>
<project default="genfiles" basedir=".">
  <property name="generated.source.dir" value="${basedir}" />

  <path id="class.path">
    <fileset dir="lib" includes="*.jar" />
    <dirset dir="bin" />
  </path>

  <!-- 自動生成実行 -->
  <target name="genfiles" description="Generate the files" depends="init">
    <!-- mybatis generator 実行 -->
    <taskdef name="mbgenerator" classname="org.mybatis.generator.ant.GeneratorAntTask"
            classpathref="class.path" />
    <mbgenerator overwrite="true" configfile="resource/generatorConfig.xml"
            verbose="false">
    </mbgenerator>
    <!-- postgresの場合 PKオブジェクトとして[テーブル名Pkey]のファイルが作成されるが不要なため削除する -->
    <delete verbose="true">
      <fileset dir="./src/jp/hit/sample/mybatis/entity" includes="*Pkey.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/entity" includes="*PkeyExample.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/client" includes="*PkeyMapper.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/client" includes="*PkeySqlProvider.java"/>
      <fileset dir="./resource/jp/hit/sample/mybatis/mapper"  includes="*PkeyMapper.xml" />
    </delete>
  </target>

  <!-- 生成先パッケージ初期化 -->
  <target name="init" description="Initialize">
    <!-- パッケージ作成 -->
    <mkdir dir="./src/jp/hit/sample/mybatis/entity"/>
    <mkdir dir="./src/jp/hit/sample/mybatis/client"/>
    <mkdir dir="./resource/jp/hit/sample/mybatis/mapper"/>
    <!-- パッケージ内削除 ※全消しなので要注意 -->
    <delete verbose="true">
      <fileset dir="./src/jp/hit/sample/mybatis/entity" includes="*.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/client" includes="*.java"/>
      <fileset dir="./resource/jp/hit/sample/mybatis/mapper"  includes="*.xml" />
    </delete>
  </target>
</project>



4. 自動生成実行

Antでmybatis-generatorを実行します。
Buildfile: <workspace_path>\MyBatis\ant_mybatis-gemerator-build.xml
init:
genfiles:
BUILD SUCCESSFUL
Total time: 3 seconds


ここでエラーになる場合は、generatorConfig.xmlのJDBC設定やDBの設定周りを見直してみてください。
自動生成に成功すればパッケージ以下にMapperクラス、Entityクラス、Mapperが作成されます。


今回はMapperファイルを利用してのクエリ発行を行うのでJava Clientの設定値でtype="XMLMAPPER"を指定しました。
mybatisにはMapperファイルを利用したクエリ発行以外にもアノテーションを利用したクエリ発行の方法も可能です。
アノテーションを利用したクエリ発行のメリットは余計な外部ファイルを持たせずに全てclass内でクエリの定義が行えることでしょうか。
機会があればそちらの方法も試してみようと思います。

1 件のコメント: