気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

DBFluteとは?

  • DBアクセスを行うO/Rマッパー (DBFlute Runtime)
  • DB周りの便利な各種ツール (DBFlute Client)

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)
    • DDLを実行し、Excel/CSV/TSVからデータをINSERTする。
    • DDL実行前に、既存のスキーマに存在するテーブルを自動で全DROPしてくれる。

DBFluteの主要クラス

  • Entity
    • レコード値を保持するクラス。(テーブルと1:1で対応)
    • SQL発行結果を詰めたり、INSERT/UPDATEのパラメータを詰めるために使用する。
  • conditionBean(CB)
    • クエリの組み立てに使用するクラス。(テーブルと1:1で対応)
  • Behavior(Bhv)
    • 組み立てたCBを引数として受け取り、実際にSQL発行を行うクラス。(テーブルと1:1で対応)
    • BehaviorはDIコンテナ管理下となる。ビジネスロジック側ではDIコンテナからインジェクションしてもらう。

DBFluteの利用例(CRUD)

public class ProductRepositoryTest {
  @Inject
  private ProductBhv productBhv;
  
  @Test
  public void selectRow() {
    // 条件設定Bean(CB)を生成
    ProductCB cb = productBhv.newMyConditionBean();
    
    // 「XXXXXとproduct_codeが等しい」の条件をCBへ追加
    cb.query().setProductCode_Equal("XXXXX");
    
    // 検索条件を元にselect発行、結果をproductのentityへ詰める
    Product product = productBhv.selectEntity(cb);
    
    // productのproduct_codeにXXXXXが設定されていることを確認
    assertThat(product.getProductCode(), is("XXXXX"));
  }
  
  @Test
  public void selectRows() {
    // 条件設定Bean(CB)を生成
    ProductCB cb = productBhv.newMyconditionBean();
    
    // iPadと前方一致するproduct_nameを持つ、productを検索
    cb.query().setProductName_LikePrefix("iPad"); // likeContain() 部分一致、likeSuffix() 後方一致
    
    // productを複数取得
    List<Product> products = productBhv.selectList(cb);
    
    // products内のproduct_nameのリストに「"iPad", "iPad mini", "iPad Air"」が含まれていることを確認
    assertThat(products.stream().map(Prodcut::getProductName).collect(toList()), hasItems("iPad", "iPad mini", "iPad Air"));
  }

  @Test
  public void selectJoin() {
    // 条件設定Bean(CB)を生成
    ProductCB cb = val.newMyConditionBean();
    
    // 「XXXXXとproduct_codeが等しい」の条件をCBへ追加
    cb.query().setProductCode_Equal("XXXXX");
    
    // productテーブルと関連しているmanufactureテーブルを結合
    cb.setupSelect_Manufacture();
    
    // 検索条件を元にselect発行、結果をproductのentityへ詰める
    Product product = productBhv.selectEntity(cb);
    
    // productの関連テーブルのmanufactureの名前がFoxconnであることを確認
    assertThat(product.getManufacture().getName(), is("Foxconn"));
  }
  
  @Test
  public void insert() {
    // 登録するproductの内容を作成する
    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 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屋のまじめな話 | 株式会社アスペア