今回は前回からの続きで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/releasesmybatis-3.2.5.jar
記事作成時点での最新バージョンは「mybatis 3.2.5」
mybatis-generator
https://github.com/mybatis/generator/releasesmybatis-generator-core-1.3.2.jar
※クラスパスには含めません
postgreSQL jdbcドライバ
http://jdbc.postgresql.org/download.htmlpostgresql-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.cgijavassist.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.zip2. パッケージ構成
今回作成する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内でクエリの定義が行えることでしょうか。
機会があればそちらの方法も試してみようと思います。
Nice post! thank you! ;)
返信削除