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

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

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屋のまじめな話 | 株式会社アスペア

Seasar2の開発の進め方

ページ駆動開発

HTMLで作成されたUIモックベースに開発を進める手法。Seasar2で使う開発手法。
テーブル設計、Dotengを使ってDaoの自動生成、Pageクラスの作成を行い、処理を作っていく。

ページ駆動開発の手順

  1. UIモックを作成し、ユーザーレビュー
  2. 入出力項目の洗い出し、テーブル設計
  3. Doltengを用い、EntityとDaoを作成
  4. HTMLの入出力項目のタグのidにテーブル名のカラムを記述
  5. HTMLのボタンのタグのidに処理メソッド名を記述
  6. Doltengを用い、JavaのPageクラスを自動生成
  7. ユーザー要件に合わせて、ロジックを記述

1,2の詳細は省きます。3〜6について詳細を以下に記載します。

3. Doltengを用い、EntityとDaoを作成

EntityとDaoの名称
Entity:テーブル名 例) emp
Dao:テーブル名 + Dao 例) empDao

4. HTMLの入出力項目のタグのidにテーブル名のカラムを記述

テーブルカラム名とPageクラスのフィールドを紐付ける

<input text="text" id="empName"/>
<span id="empName">SCOTT</span>

emp_nameというテーブルカラム名の場合、empNameのようにキャメルケースでidに記述する。

5. HTMLのボタンのタグのidに処理メソッド名を記述

idへ処理用メソッド名を設定し、画面遷移を実現する。

<input type="submit" id="go〜"/>

idへ設定する処理名

内容を引き継ぐのみ:go + 画面名
入力チェックなしに遷移:jump + 画面名
何らかの処理を行う:do + 処理名

6. Doltengを用い、JavaのPageクラスを自動生成

DoktebgはHTMLとDBのメタ情報を用いてPageクラスを自動生成する。

Pageクラス
プロパティー:HTMLの入出力項目はid値をプロパティー名とする。
型はデフォルト、String。変更可能で。DBカラム型から自動設定も可能。
メソッド:id値がdoから始まっているものをメソッドとして作成する。
画面初期表示時に一度だけ呼ばれるメソッド initialize()、画面再表示時に呼ばれるメソッド prerender()はHTMLへの記述なしで自動生成される

※ jumpXxxやgoXxxはTeedaが自動的に処理するため、メソッドは作成されない。

ユーザー要件に合わせて、ロジックを記述

initialze()、prerender()、do〜のメソッドに要件に合わせたロジックを記述して、完成。

Seasar2の特徴とプロダクト構成

Seasar2によるスーパーアジャイルなWeb開発のChapter1の内容をピックアップ、自分の知見を少し追記してまとめました。詳細は書籍で確認してみてください。

プラットフォームの問題

Javaフレームワークは画面遷移の設定、DI(依存性の注入)の設定など、とにかくXMLに設定を書く傾向があり、 XML地獄に陥りがち。

XMLコンパイルされるものではないため、eclipseにおけるエラー表示がされないため、 間違いに気づきづらく、デバッグ時間が増える傾向にある。この結果、生産性が低下してしまう。

Struts,Springはその代表格。

Welcome to the Apache Struts project
Spring

再デプロイの問題

XMLファイル、ソースコードの修正時にアプリケーションを再デプロイして、アプリケーションサーバーを 再起動しなければならない。

Ruby言語ではソース修正後に再デプロイ、再起動なしですぐに結果を確認できる。
サクサク感のある開発が、やる気や効率を上げてくれる。

そういったJavaの問題を解決してきたのがSeasar2

Searsar2の特徴

  • サクサク感のある開発
  • 設定ファイルいらずの開発

サクサク感のある開発

HOT deploy(ホットデプロイ)機能
アプリサーバーを起動させたまま、ソースコードの修正を認識させる。
再デプロイや再起動で待たされることがなくなる。

COOL deploy(クールデプロイ)機能
運用時にパフォーマンスを下げないためのCOOL deployモードを提供
HOT deployの時のように修正を即時で認識はしないモード

設定ファイルいらずの開発

定型的な設定はフレームワークが自動的に処理し、例外的な設定のみを 明示的に設定する思想でフレームワークが作られている。

何が起こっているかわからなくて不安、理解が浅くなると考える人に対して、 自動設定される内容を表示する機能も備えている。

プロダクト構成

Javaの生産性を上げるためのSeasar2の周辺のフレームワークツール群をSuper Agile Family と呼んでいます。その構成は以下の通りになっています。

  • Seasar2 (しーさーつー)
    • S2Container (えすつーこんてなー)
    • S2Dxo (えすつーだっくすおー)
  • Teeda (てぃーだ)
  • S2Dao (えすつーだお)
  • Dolteng (どぅるてん)

Seasarの生みの親のひが やすをさんが沖縄出身ということで沖縄にちなんだ名前が多い。

Seasar2

S2Container

DIコンテナーのこと。オブジェクトを疎結合に結びつけ、保守性を高めるSuper Agileを支える縁の下の 力持ち的な存在。ほとんど自動的に処理を行うため、使う側は存在を意識しない。

S2Dxo
MapとJavaBeans、JavaBeansとJavaBeansなどのオブジェクト間の変換を行う。
Entityを画面用オブジェクトに変換したり、その逆をやったりする。

いまいち、想像しづらい。実装時に意識することがあるんだろうか。

Teeda

沖縄の方言で「太陽」を意味するWeb機能を提供するフレームワーク
JSF(Java Server Faces)の実装の「Core」とその機能を拡張した「Extension」に分かれる。

もともとはViewテンプレートにJSPを用いていたり、設定ファイルを書く必要があったが、 Teeda Extensionにおいて、ViewテンプレートにHTMLを使う、規約重視によって 設定ファイルなしの開発を可能にしている。

S2Dao

DBアクセス機能を提供するフレームワーク。 実装を書かずにインタフェースにメソッドを記述するだけでDBアクセスを可能とする。

Dolteng

開発効率を上げるソース自動生成ツール
例外的なケースのみを明示的に実装する。

Seasar2のTeeda、S2Daoの基礎を一気に身につけるまとめ

下記、書籍における勉強したまとめをドンドン追記していきます!
ちょっと古めな技術ですが、必要に迫られたので。Seasar2におけるAgile FamilyのTeedaS2Daoの基礎知識を身につけていきます。

上記の本は8年前の内容になっているので、現在は使われなくなった技術なども紹介している可能性があります。Teedaに関して学習したかったのですが、公式ページ以外に学習できるのがこの本ぐらいだったので、こちらの本で一旦、学習を進めます。

概要理解

Seasar2の特徴とプロダクト構成

アフェリエイトリンク作成サービス ヨメレバの使い方

f:id:tamata78:20160527094633p:plain

書籍紹介ブログパーツ ヨメレバ

せっかくブログ書いているからアフェリエイト用リンクを貼り付けてみようか。。と思い、やってみました。
手順を忘れないようにメモしておきます。

「ヨメレバ」はブログ上で書籍を紹介するブログパーツです。
Amazon,楽天ブックス、7netなど多数へのリンクを表示することでアフェリエイト報酬の取りこぼしを減らせる。

アフェリエイト登録がされていれば ユーザーデータ登録、リンク生成を手軽に行うことができる。

ユーザーデーター入力

「ユーザーデーター入力」の項目で必須項目の「サイト名」、「Amazonアソシエイト」入力、任意のショップ(楽天ブックス、7net)などの アフェリエイトIDを入力して、保存ボタンをクリック!

f:id:tamata78:20160527095833p:plainf:id:tamata78:20160527095836p:plain

※データはCookieで保存されるため、次回からは入力する必要はありません

ブログパーツ生成

ユーザーデーター入力で情報を保存すると、ブログパーツ生成のメニューが出るので 10桁のISBN番号を入力、表示ボタンをクリックすると、リンクを生成できる。

f:id:tamata78:20160527094825p:plain

リンクをブログに貼り付ける

あとはそのリンクをブログに貼り付けて完成!!

f:id:tamata78:20160527100048p:plain

貼った内容は以下の通りに表示される。うーーーん、簡単!

PostgresSQLでテーブル名一覧とカラム名一覧を取得する方法

テーブル一覧を取得

SELECT relname AS table_name FROM pg_stat_user_tables

カラム名一覧を取得

SELECT * FROM pg_attribute WHERE attrelid = 'your_table_name'::regclass;

参考URL

http://chopl.in/post/2013/11/07/how_to_retrieve_tables_and_columns_with_postgres/

grepで検索した行の前後も表示する方法

grepで対象文字列が存在する行を表示

$ grep -n test1 test.conf
4:      test1 ←-nオプションを付けたので、4行目に該当する文字列があることが分かる

grepで対象文字列が存在する前後の行を表示

logの調査をする際にgrep実行前後の行も確認したい場合があるその場合は以下のようなコマンドが使える。

$ grep -3 -n test1 test.conf
1-[global]
2-      test
3-      test
4:      test1 ←-3オプションによって、前後各3行も表示される
5-      test
6-      test
7-      test

grepで対象文字列が存在する前、または後の行を表示

また、該当する行の後の行だけを表示したり、前の行だけを表示することもできる。後の行を表示するには-Aオプション、前の行を表示するには-Bオプションを使用し、併せて表示したい行数を指定する。

$ grep -A 3 -n test1 test.conf ←該当する行の後の3行を表示する
4:      test1 ←-3オプションによって、前後各3行も表示される
5-      test
6-      test
6-      test
$ grep -B 3 -n test1 test.conf ←該当する行の前の3行を表示する
1-[global]
2-      test
3-      test
4:      test1 ←-3オプションによって、前後各3行も表示される

参考URL

grepで該当する行の前後も一緒に表示するには