Upload
nabedge-watanabe
View
242
Download
3
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ってなんて読むの?
DEMOhttps://github.com/nabedge/jooq-demo2
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での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()でやって、他の手段でそれを実行するこ
とも可能。超疑り深い人用。