4.3K Views
February 08, 16
スライド概要
2016/2 勉強会atビズリーチ
Engineer. Java, Kotlin(Server Side), JavaScript, Vue.js, Spring boot, CI/CD tool, build tool, monitoring, and activity as SRE
“jOOQってなんて読むの?” から始める SpringBootと O/Rマッパーの世界 The “Garden” at Bizreach.inc, Shibuya, Tokyo 2016-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概要
jOOQってなんて読むの?
汎用言語とDSL Domain Specific Language = ドメイン特化言語 DSL 正規表現 Makefile エクセルマクロ SQL 汎用言語 Java C言語 HTML
つまりjOOQとは? ● SQLをJavaで書け る”internal DSL” (意訳: オレオレDSL) を提供するJavaライブラリと ツールのこと。
jOOQの開発元(の収入源)は?
DEMO https://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. 2. sql-maven-plugin あるいは Flyway が便利 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文のログ出力機能が初めからあるけどね。 ○ ● jOOQを使いつつ「手組み」の文字列をSQLに含めることも可能 ○ ● ただし “commit”, “rollback” の実行までをもログに吐く にはlog4jdbcしかなさそう。 https://www.jooq.org/doc/3.9/manual/sql-building/plain-sql/ SQL文の組み立てだけをjOOQのgetSQL()でやって、他の手段でそれを実行するこ とも可能。超疑り深い人用。
おしまい