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

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

Embed Size (px)

Citation preview

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

Who ?

● わたなべ

○ twitter: @nabedge

○ (株)ビズリーチ SREグループ エンジニア

○ O/Rマッパの使用経験

■ O/Rマッパ使うなど軟弱ゥ -> S2JDBC -> MyBatis ->

-> DBFlute -> QueryDSL...そしてjOOQを試し中

● 過去の講演資料など

○ http://www.slideshare.net/nabedge/presentations

今日の流れ

1. 参加者全員による自己紹介

a. お名前

b. 業種、職種 (例:会計処理パッケージソフト屋でJava書いてます)

c. 最近使っている RDBMSと、O/Rマッパーは? (例:OracleとMyBatis)

2. jOOQの概要

3. デモいろいろ

4. まとめ

jOOQ概要

汎用言語とDSL

汎用言語

DSL

Domain Specific Language = ドメイン特化言語

エクセルマクロ

正規表現

SQL

Makefile

JavaC言語

HTML

つまりjOOQとは?

● SQLをJavaで書け

る”internal DSL”

(意訳: オレオレDSL)

を提供するJavaライブラリと

ツールのこと。

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

まとめ

Java, SQL, jOOQ

● DSL = Domain Specific Language = ドメイン特化言語

● jOOQとは?

○ SQLをJavaで書ける”internal DSL” (意訳: オレオレDSL)

を提供するJava-APIライブラリとツール

● jOOQの効果は?

○ Java上でタイプセーフにSQLを書いて実行できる

Javaエンジニアにとっての生産性って、タイプセーフのことですよね。

● CTRL+Spaceキーだけでなんとなく仕事が進められる。

● 書き間違えるとコンパイルエラーでわかる。

実行して初めて間違いがわかるより早い

● DB定義を変更するとコンパイルエラーでわかる。

テーブル定義の影響範囲がすぐわかるため

開発とテストをしやすくなる。

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の設定に少し

注意

jOOQの使い方ざっくり(2)

4. ビジネスロジック層(リポジトリ層)のJavaクラス内で、

自動生成したコードを使ってSQLを組んで実行

5. テーブル定義の変更の場合は1に戻ってやり直すだけ

jOOQでのCRUD

● 先ほどデモしたとおりです

● デモのコードは https://github.com/nabedge/jooq-demo2

● UpdatableRecordはRuby on RailsでいうActiveRecordに近いらしい

SpringBootとjOOQとトランザクション管理

● SpringBootにはjOOQのDslContextクラスのインスタンスを使うための設定が初め

から組み込まれている

● “@Transactional” をクラスまたはメソッドにつけるだけでトランザクションに包まれる

● @Transactionalの中であれば異なるO/Rマッパを使っても同じトランザクションで管

理される

○ 全てのO/RマッパのインスタンスがSpring配下で一元管理されたDataSourceを使っているのが前提

(次ページ参照)

どうやってjOOQに移行しようか?

● 他のO/Rマッパ(MyBatis, JdbcTemplate, etc)のDataSourceの

管理が、Springの管理下にあるかどうか

ヒント:TransactionAwareDataSourceProxy

● 正しくSpringを使えばO/Rマッパの複数併用は可能

○ 併用の例はサンプルコードみてね

● 併用しながら徐々にjOOQで書き直せばいい

疑り深いあなたのために

● 実際に組み立て&発行される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()でやって、他の手段でそれを実行するこ

とも可能。超疑り深い人用。

おしまい