$30 off During Our Annual Pro Sale. View Details »

jOOQってなんて読むの?から始めるSpringBootとO/Rマッパーの世界

Yu Watanabe
February 10, 2016

 jOOQってなんて読むの?から始めるSpringBootとO/Rマッパーの世界

Yu Watanabe

February 10, 2016
Tweet

More Decks by Yu Watanabe

Other Decks in Technology

Transcript

  1. “jOOQってなんて読むの?”
    から始める
    SpringBootと
    O/Rマッパーの世界
    The “Garden” at Bizreach.inc, Shibuya, Tokyo
    2016-02-08
    @nabedge わたなべ

    View Slide

  2. Who ?
    ● わたなべ
    ○ twitter: @nabedge
    ○ (株)ビズリーチ SREグループ エンジニア
    ○ O/Rマッパの使用経験
    ■ O/Rマッパ使うなど軟弱ゥ -> S2JDBC -> MyBatis ->
    -> DBFlute -> QueryDSL...そしてjOOQを試し中
    ● 過去の講演資料など
    ○ http://www.slideshare.net/nabedge/presentations

    View Slide

  3. 今日の流れ
    1. 参加者全員による自己紹介
    a. お名前
    b. 業種、職種 (例:会計処理パッケージソフト屋でJava書いてます)
    c. 最近使っている RDBMSと、O/Rマッパーは? (例:OracleとMyBatis)
    2. jOOQの概要
    3. デモいろいろ
    4. まとめ

    View Slide

  4. jOOQ概要

    View Slide

  5. jOOQってなんて読むの?

    View Slide

  6. 汎用言語とDSL
    汎用言語
    DSL
    Domain Specific Language = ドメイン特化言語
    エクセルマクロ
    正規表現
    SQL
    Makefile
    Java
    C言語
    HTML

    View Slide

  7. つまりjOOQとは?
    ● SQLをJavaで書け
    る”internal DSL”
    (意訳: オレオレDSL)
    を提供するJavaライブラリと
    ツールのこと。

    View Slide

  8. jOOQの開発元(の収入源)は?

    View Slide

  9. DEMO
    https://github.com/nabedge/jooq-demo2

    View Slide

  10. まとめ

    View Slide

  11. Java, SQL, jOOQ
    ● DSL = Domain Specific Language = ドメイン特化言語
    ● jOOQとは?
    ○ SQLをJavaで書ける”internal DSL” (意訳: オレオレDSL)
    を提供するJava-APIライブラリとツール
    ● jOOQの効果は?
    ○ Java上でタイプセーフにSQLを書いて実行できる

    View Slide

  12. Javaエンジニアにとっての生産性って、
    タイプセーフのことですよね。
    ● CTRL+Spaceキーだけでなんとなく仕事が進められる。
    ● 書き間違えるとコンパイルエラーでわかる。
    実行して初めて間違いがわかるより早い
    ● DB定義を変更するとコンパイルエラーでわかる。
    テーブル定義の影響範囲がすぐわかるため
    開発とテストをしやすくなる。

    View Slide

  13. jOOQの使い方ざっくり(1)
    1. テーブルを張った状態のDBを用意する
    a. sql-maven-plugin あるいは Flyway が便利
    2. jOOQ + maven or gradle or API直たたき で、
    jOOQ-DSL的なJavaコードを自動生成する
    3. 自動生成したコードをIDE上でソースコード扱い(コンパイル対象)にする
    a. src/main/java 配下に出力するならそこをVCS管理にするかignoreするかは要
    検討
    b. target/generated-sources (デフォルト)配下に出力するならIDEの設定に少し
    注意

    View Slide

  14. jOOQの使い方ざっくり(2)
    4. ビジネスロジック層(リポジトリ層)のJavaクラス内で、
    自動生成したコードを使ってSQLを組んで実行
    5. テーブル定義の変更の場合は1に戻ってやり直すだけ

    View Slide

  15. jOOQでのCRUD
    ● 先ほどデモしたとおりです
    ● デモのコードは https://github.com/nabedge/jooq-demo2
    ● UpdatableRecordはRuby on RailsでいうActiveRecordに近いらしい

    View Slide

  16. SpringBootとjOOQとトランザクション管理
    ● SpringBootにはjOOQのDslContextクラスのインスタンスを使うための設定が初め
    から組み込まれている
    ● “@Transactional” をクラスまたはメソッドにつけるだけでトランザクションに包まれる
    ● @Transactionalの中であれば異なるO/Rマッパを使っても同じトランザクションで管
    理される
    ○ 全てのO/RマッパのインスタンスがSpring配下で一元管理されたDataSourceを使っているのが前提
    (次ページ参照)

    View Slide

  17. どうやってjOOQに移行しようか?
    ● 他のO/Rマッパ(MyBatis, JdbcTemplate, etc)のDataSourceの
    管理が、Springの管理下にあるかどうか
    ヒント:TransactionAwareDataSourceProxy
    ● 正しくSpringを使えばO/Rマッパの複数併用は可能
    ○ 併用の例はサンプルコードみてね
    ● 併用しながら徐々にjOOQで書き直せばいい

    View Slide

  18. 疑り深いあなたのために
    ● 実際に組み立て&発行されるSQL文を
    JDBCのレベルでトラップして確認するには? -> log4jdbcをどうぞ
    ● そんなことしなくてもjOOQならSQL文のログ出力機能が初めからあるけどね。
    ○ ただし “commit”, “rollback” の実行までをもログに吐く にはlog4jdbcしかなさそう。
    ● jOOQを使いつつ「手組み」の文字列をSQLに含めることも可能
    ○ https://www.jooq.org/doc/3.9/manual/sql-building/plain-sql/
    ● SQL文の組み立てだけをjOOQのgetSQL()でやって、他の手段でそれを実行するこ
    とも可能。超疑り深い人用。

    View Slide

  19. おしまい

    View Slide