DBFlueteの特徴
ORマッパー
- DBのメタ情報を元にコードを自動生成してくれ、SQL発行をタイプセーフに行うことができる。
- JDBC APIのみに依存
- DBのテーブル構造のまま、Javaから操作できるようにしてくれる。
- クラスフィールドとDBカラムのマッピング設定は不要
- テーブルがクラス(entity)になり、カラムがフィールドになる。
- 外部キーから関連の多重度を推測し、適切なフィールドを追加。(1:Nならば1側にListをN側にTを追加)
- DBテーブル構造に対応するSQL生成コードが生成される。
- テーブルAとテーブルBに外部キーがあれば、テーブルAとテーブルBをJoinするメソッドなど
DB周りの便利な各種ツール
- O/Rマッピング用コード生成ツール(jdbc,generate,sql2entity,doc,manage,regenerate)
- DBスキーマを作成する(ReplaceSchema)
- Entity
- レコード値を保持するクラス。(テーブルと1:1で対応)
- SQL発行結果を詰めたり、INSERT/UPDATEのパラメータを詰めるために使用する。
- conditionBean(CB)
- クエリの組み立てに使用するクラス。(テーブルと1:1で対応)
- Behavior(Bhv)
- 組み立てたCBを引数として受け取り、実際にSQL発行を行うクラス。(テーブルと1:1で対応)
- BehaviorはDIコンテナ管理下となる。ビジネスロジック側ではDIコンテナからインジェクションしてもらう。
public class ProductRepositoryTest {
@Inject
private ProductBhv productBhv;
@Test
public void selectRow() {
ProductCB cb = productBhv.newMyConditionBean();
cb.query().setProductCode_Equal("XXXXX");
Product product = productBhv.selectEntity(cb);
assertThat(product.getProductCode(), is("XXXXX"));
}
@Test
public void selectRows() {
ProductCB cb = productBhv.newMyconditionBean();
cb.query().setProductName_LikePrefix("iPad");
List<Product> products = productBhv.selectList(cb);
assertThat(products.stream().map(Prodcut::getProductName).collect(toList()), hasItems("iPad", "iPad mini", "iPad Air"));
}
@Test
public void selectJoin() {
ProductCB cb = val.newMyConditionBean();
cb.query().setProductCode_Equal("XXXXX");
cb.setupSelect_Manufacture();
Product product = productBhv.selectEntity(cb);
assertThat(product.getManufacture().getName(), is("Foxconn"));
}
@Test
public void insert() {
Product product = new Product();
product.setProductCode("ZZZZZ");
product.setProductName("iPad Nano");
productBhv.insert(product);
ProductCB cb = new ProductCB();
cb.query().setProductName_LikePrefix("iPad");
assertThat(productBhv.selectEntity(cb);
}
@Test
public void update() {
Product product = new Product();
product.setProductCode("ZZZZZ");
product.setProductName("iPad Micro");
prdouctBhv.update(product);
assertThat(productBhv.selectByPKValue("ZZZZZ").getProductName(), is("iPad Micro"));
}
@Test
public void delete() {
Product product = new Product();
product.setProductCode("ZZZZZ");
prodcut.setProductName("iPad Micro");
productBhv.delete(product);
assertThat(productBhv.selectByPKValue("ZZZZZ").getProductName(), is(nullValue());
}
}
参考URL
DBFluteをできるだけ簡単に説明してみる - taktosの日記
DBFluteって、凄いんだぜ!: Web屋のまじめな話 | 株式会社アスペア