最近はDB設計はER MasterというEclipseプラグインでER図を書いて終わりというのがほとんどだ。

で、create table文は吐いてくれるものの、JavaのDAOとかはHibanate前提のものしか吐けないっぽいのでS2Daoを使いたい私は悶々とする日々だった(大げさ)。また、create table文の吐き出しは外部キーも吐かれるので、実際にDBを作る時には外部キー制約をサボってプログラム側で何とかする事も多いので純粋にテーブルだけ作れる奴が欲しかった。

今まではER MasterでER図を書く→Excelにエクスポート→Excel VBAのマクロでジェネレートとやっていたが、DB変更のたびにこのワンクッションをするもの煩わしい。
そこで、ER Masterで作られたXML(.ermファイルの中身はXML)からDB構造を得られれば自分でどんなジェネレーターでも作れるじゃないかと一念発起。

まずはJAXBで解析しようと思ったがDTDやXSDがなさそうなのでtrangも使ってみたがあまりいいクラスを吐けないので断念。また悶々とする日々が続いた。

続いてSAXで自前でパースしようと思ったけど結局XML構造を掌握していないと㍉。

で、それなら本家のソースを使えばいいじゃないかという事で試してみると案外よさそうな感じになった。もちろんER Masterの作者様の本来の意図とはかけ離れたイレギュラーでイリーガルなものである。

ER Masterのソースを取ってきて、

import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.persistent.Persistent;
・・・
Persistent persistent = Persistent.getInstance();
ERDiagram diagram = persistent.load(InputStream);
for (ERTable table : diagram.getDiagramContents().getContents().getTableSet()) {
 for (NormalColumn column : table.getNormalColumns()) {
  ・・・
 }
}

とすると、tableでテーブル情報が、columnで列情報が得られる。もちろんInputStreamはermファイルを読み込むためのFileInputStreamであろう。
後はその情報を元に自分でcreate table文やDAO系のJavaクラスをテキストファイルとして作ればジェネレーターの完成だ。POIも駆使すれば自分好みのDB設計書Excelも吐ける。

まさに「こうかはばつぐんだ」という奴で、規模がでかい開発になればなるほどDB周り自動生成の価値が高くなる。DB変更だってER図さえ直せば後はcreate table文、S2DaoのDAOIFと基本的なテーブル読み書き(selectByPK、selectByAny、insert、updateByPK、deleteByPK)も数秒で勝手に作り直してくれる。便利!