Jiemamyってなんぞ(8) - 使ってみようJiemamyAPI

Jiemamyでは内容的には不完全ながらも、全ての型とメソッドにJavadocを付けている*1ので、使いやすいかと思います。ML等で質問を受ける機会があれば、それを元にどこがどう分かり難かったのかを分析し、今後もJavadocの強化を続けて行く所存です。

さっそくコードからいきましょかね。新しくモデルを作って、テーブルを1つ追加する例です。

// Jiemamyの初期化(新しいモデルを作る場合)
Jiemamy jiemamy = Jiemamy.newInstance();
JiemamyFactory factory = jiemamy.getFactory();
RootModel rootModel = factory.getRootModel();

// Dialectを指定して、そのインスタンスを得る
rootModel.setDialectClassName(MySqlDialect.class.getName());
Dialect dialect = rootModel.findDialect();

// テーブルを作って、テーブル名をつける
TableModel tableModel = factory.newModel(TableModel.class);
tableModel.setName("T_USER");

// カラムを作って、カラム名をつける
ColumnModel columnId = factory.newModel(ColumnModel.class);
columnId.setName("ID");

// データ型を作って、カラムに設定する
BuiltinDataTypeMold mold1 = dialect.findDataTypeMold(DataTypeCategory.INTEGER);
BuiltinDataType dataType1 = factory.newDataType(mold1);
columnId.setDataType(dataType1);

// テーブルにカラムを追加する
tableModel.getAttributes().add(columnId);

// もういっこカラム作って同じことする
ColumnModel columnName = factory.newModel(ColumnModel.class);
columnName.setName("NAME");

BuiltinDataTypeMold mold2 = dialect.findDataTypeMold(DataTypeCategory.VARCHAR);
BuiltinDataType dataType2 = factory.newDataType(mold2);
dataType2.getAdapter(SizedDataTypeAdapter.class).setSize(36);
columnName.setDataType(dataType2);

tableModel.getAttributes().add(columnName);

// テーブルをRootModelに追加する
rootModel.getEntities().add(tableModel);

見ての通り、Jiemamyのモデルインスタンスはnewしません。仕様と実装を完全分離目指していたら、こうなっちまいました。僕はもう、DOMみたいなもん*2だと諦めてますので、僕と一緒に諦めて下さいw

作ったモデルをどうしましょかね。とりあえずExporterでSQLファイルにしてみましょうか。

SqlExporter exporter = new SqlExporter();
DefaultSqlExportConfig config = new DefaultSqlExportConfig();
config.setDataSetIndex(-1);
config.setEmitDropStatements(false);
config.setOutputFile(new File("./target/test.sql"));
config.setOverwrite(true);
boolean result = exporter.exportModel(rootModel, config);

初めてnewが出てきましたが。こんな感じでSQLファイルを出力。

ほいじゃ、せっかく作ったモデルだからXML形式で保存してみます。

JiemamySerializer serializer = jiemamy.getSerializer();
serializer.serialize(rootModel, new FileOutputStream("./target/output.jer"));

これだけ。じゃあ逆に読み込みは?

JiemamySerializer serializer = jiemamy.getSerializer();
RootModel deserialized = serializer.deserialize(new FileInputStream("./target/output.jer"));

これだけ。雰囲気は分かって頂けたのではないかと。

なんだかいけそうな気がする〜!?

*1:付けてるつもりw

*2:DOMも、新しいElement等はnewできないっすよね。それと同じ。