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"));
これだけ。雰囲気は分かって頂けたのではないかと。
なんだかいけそうな気がする〜!?