2012年11月13日火曜日

MyBatis/iBATIS用のコードを自動生成する「MyBatis Generator」を使う

前回は、MyBatisの基本的な使い方を見てきました。今回はそこで手作業にて行ってきた各ファイルの自動生成ツール「MyBatis Generator」の使い方を説明していきたいと思っています。

MyBatis Generator Eclipse pluginのセットアップ
EclipseのメニューからHelp -> New Install Softwareを選択し、以下のURLを入力することでEclipse pluginがセットアップされます。
http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/

インストールできましたら、メニューからFile -> New -> Other...を選択し、MyBatis Generator Configuration Fileを指定して、設定ファイル(デフォルトではgeneratorConfig.xml)を生成し、環境に合わせて編集します。このファイルは、Generateするための設定情報です。


  
    
    
    
    
    

各タグの説明ですが、javaModelGeneratorタグはエンティティクラスファイル、sqlMapGeneratorタグはXMLのMapperファイル、javaClientGeneratorタグはMapperクラスファイルの出力先を指定するためのタグです。tableタグで対象とするテーブル名を記述します。このtableNameにはワイルドカードも指定できるようです。ファイル編集後は、このgeneratorConfig.xmlを選択して、右クリックで「Generate MyBatis/iBATIS Artifacts」を選択しますと、エンティティクラスファイルとMapperファイル、Mapperクラス、Exampleクラスの4つのファイルが生成されます。(ちなみにMyBatis用だけでなく、2.2以上のiBATIS以上のファイルを生成できるようです。)

例えば、blogテーブルの場合は以下の4つのファイルが生成。
  • Blog.java :エンティティクラス。
  • BlogExample.java :Generator独自のクラスっぽい。SQL を呼び出す際、条件を指定するために利用するクラス。
  • BlogMapper.java :クエリを実行するための Java インターフェイス。
  • BlogMapper.xml :Mapper XML ファイルで、ほとんどの SQL はこのファイルに記述。
ちなみに、自動生成された JavaとXML ファイルのコメントには@mbggeneratedというアノテーションがあります。MyBatis Generatorが再度コードを生成するとき、このアノテーションが付加された要素だけを削除してから再度新しい要素を生成されます。そのため、このアノテーションがある場合は、手動で修正すると消えてしまいますのでご注意を。 話はそれましたが、続けますとBlogMapper.xmlを前回のように、mybatis-config.xmlのmapperタグに記述されていればデータベースアクセスできるようになります。例えば以下のようなコードでレコードを登録して、件数をカウントするということが簡単にできます。

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = new Blog();
blog.setId(0);
blog.setContent("Test-Test");
mapper.insert(blog);
int count = mapper.countByExample(new BlogExample());
System.out.println(count);
session.close();

myBatis Generatorをカスタマイズ
このMyBatis GeneratorをPluginを作ることで、カスタマイズできます。具体的にはファイル名やクラス名を変えたり、インターフェースやスーパークラスを追加できたり、メソッド、コンストラクタなどを追加できたりと、結構いろいろ生成するファイルを変更することができます。
まずはここから"Mapping Generator"をダウンロードして、解凍します。そのmybatis-generator-core-x.x.x.jarファイル(私は1.3.2を利用)をEclipseにコピーして、ビルドパスを設定します。
次にorg.mybatis.generator.api.PluginAdapterを継承したクラスを作成します。このクラス内で生成するタイミングに合わせてオーバーライドするメソッドを選択肢、中身を実装します。(例えば、初期化時ならinitializedメソッドをオーバーライド。)以下の例では、エンティティクラスを生成する際に、エンティティクラスにコンストラクタを追加するというサンプルです。

package com.test.generator.plugins;

import java.util.List;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;

public class GenPlugin extends PluginAdapter {

 @Override
 public boolean validate(List arg) {
  return true;
 }

 @Override
 public void initialized(IntrospectedTable introspectedTable) {
  super.initialized(introspectedTable);
 }

 @Override
 public boolean modelBaseRecordClassGenerated(
   TopLevelClass topLevelClass,
   IntrospectedTable introspectedTable) {
  Method method = new Method();
  method.setVisibility(JavaVisibility.PUBLIC);
  method.setConstructor(true);
  method.setName(topLevelClass.getType().getShortName());
  method.addBodyLine("System.out.println(\"Called constructor\");");
  topLevelClass.addMethod(method);
  return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable);
 }
}

この作成したクラスをgeneratorConfig.xmlにcontextタグの中にpluginタグとして、追加します。

  
    
       .....
  

そうすると以下のコンストラクタがBlogクラスに追加されます。

public Blog() {
 System.out.println("Called constructor");
}

このプラグイン機能でいろいろと生成もいじれそうなので、開発の生産性向上に役立ちそうですね。

外部キーなどの対応
ここまで来たら、以下のように参照関係のあるテーブルの場合に自動生成してくれるかを試してみようと思います。

CREATE TABLE blog (
  id INT,
  content VARCHAR(255),
  PRIMARY KEY(id)
);
CREATE TABLE tag (
  id INT,
  blog_id INT,
  name VARCHAR(100),
  PRIMARY KEY(id),
  FOREIGN KEY (blog_id) REFERENCES blog(id)
);

generateConfig.xmlのtableにtagテーブルも追加して、"Generate"!ってやってみたら、Tag関連のファイルは生成されましたらが、参照関係についてのフィールドなどは全然生成されなかったです。本来であれば、Blog.getTags()みたいなメソッドが追加されてList<Blog>を取得できるようなコード生成してくれることを期待したのですが、外部キーの生成は自動的にやってくれないらしいですね。これは手動でやるとMapperなどの修正も必要なので結構めんどくさく、非常に残念。。
こちらのフォーラムにも同様の記事がありました。。。これもまたプラグインを使って作ってみるしかなさそうですね。。

これらMyBatis Generatorの詳細はこちらのチュートリアルを参照ください。

1 件のコメント:

  1. iBATISのときは、「iBator」というものがあったみたいですね。
    http://ibatis.apache.org/tools/ibator

    返信削除