SlideShare a Scribd company logo
jOOQの紹介
@chipstar_light
• 皆さんが現場で使っているのはORMですか?
• Hibernate?Doma?MyBatis?

その他のJPA実装?
• Object Mappingを有効活用できてない
• トランザクションスクリプトだし…
• Smart UIだし…
• DTOとか、Modelとかないし…
• 良くてもViewModel
• BeanUtilsレベルで問題ない
• 既にあるテーブルでなんとかしないといけない
• レガシーシステムだし…
• 他システムの連携が多くて…
• オブジェクトモデルとのミスマッチが…
• チューニングできるレベルのSQLを扱いたい
• 自由なjoin、union、procedure、

insert into select、sub query、etc…
jOOQ
• そんな人のためのデータベースアクセスライブラリ
• http://www.jooq.org/
• jOOQ generates Java code from your
database and lets you build typesafe SQL
queries through its fluent API.
• ただし!使った事無いです…。詳しくはご自分で。
jOOQ特徴
• Database First
• 既にあるテーブルスキーマから始めます
• Typesafe SQL
• タイプセーフに流れるインタフェースでSQL書けます
• Code Generation
• マッピング定義やモデル、ActiveRecordなどを自動生成
• スキーマはJavaクラスで定義
create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count())
.from(AUTHOR)
.join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID))
.where(BOOK.LANGUAGE.eq("DE"))
.and(BOOK.PUBLISHED.gt(date("2008-01-01")))
.groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.having(count().gt(5))
.orderBy(AUTHOR.LAST_NAME.asc().nullsFirst())
.limit(2)
.offset(1)
.forUpdate()
.of(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME,
COUNT(*)
FROM AUTHOR
JOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_ID
WHERE BOOK.LANGUAGE = 'DE'
AND BOOK.PUBLISHED > DATE '2008-01-01'
GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
HAVING COUNT(*) > 5
ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST
LIMIT 2
OFFSET 1
FOR UPDATE
OF AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME
SQLとDSLの対比
コードはjOOQ公式サイトから引用
引用:jOOQ http://www.jooq.org/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/jooq-spring.xml"})
public class QueryTest {
@Autowired
DSLContext create;
@Test
public void testJoin() throws Exception {
// All of these tables were generated by jOOQ's Maven plugin
Book b = BOOK.as("b");
Author a = AUTHOR.as("a");
BookStore s = BOOK_STORE.as("s");
BookToBookStore t = BOOK_TO_BOOK_STORE.as("t");
Result<Record3<String, String, Integer>> result =
create.select(a.FIRST_NAME, a.LAST_NAME, countDistinct(s.NAME))
.from(a)
.join(b).on(b.AUTHOR_ID.equal(a.ID))
.join(t).on(t.BOOK_ID.equal(b.ID))
.join(s).on(t.BOOK_STORE_NAME.equal(s.NAME))
.groupBy(a.FIRST_NAME, a.LAST_NAME)
.orderBy(countDistinct(s.NAME).desc())
.fetch();
assertEquals(2, result.size());
assertEquals("Paulo", result.getValue(0, a.FIRST_NAME));
assertEquals("George", result.getValue(1, a.FIRST_NAME));
assertEquals("Coelho", result.getValue(0, a.LAST_NAME));
assertEquals("Orwell", result.getValue(1, a.LAST_NAME));
assertEquals(Integer.valueOf(3), result.getValue(0, countDistinct(s.NAME)));
assertEquals(Integer.valueOf(2), result.getValue(1, countDistinct(s.NAME)));
}
}
SELECT
コードサンプル
コードはjOOQ公式サイトから引用
引用:jOOQ http://www.jooq.org/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/jooq-spring.xml"})
@TransactionConfiguration(transactionManager="transactionManager")
public class TransactionTest {
@Autowired DSLContext dsl;
@Autowired DataSourceTransactionManager txMgr;
@Autowired BookService books;
!
@After
public void teardown() {
// Delete all books that were created in any test
dsl.delete(BOOK).where(BOOK.ID.gt(4)).execute();
}
!
@Test
public void testExplicitTransactions() {
boolean rollback = false;
TransactionStatus tx = txMgr.getTransaction(new DefaultTransactionDefinition());
try {
// This is a "bug". The same book is created twice, resulting in a
// constraint violation exception
for (int i = 0; i < 2; i++)
dsl.insertInto(BOOK)
.set(BOOK.ID, 5)
.set(BOOK.AUTHOR_ID, 1)
.set(BOOK.TITLE, "Book 5")
.execute();
}
catch (DataAccessException e) {
txMgr.rollback(tx);
}
}
INSERT
コードサンプル
コードはjOOQ公式サイトから引用
引用:jOOQ http://www.jooq.org/
皆さんも是非試してみてくだ
さい!

More Related Content

Similar to jOOQの紹介

ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
yusuke shibui
 
Creators'night#3今井
Creators'night#3今井 Creators'night#3今井
Creators'night#3今井
Daisuke Imai
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
chibochibo
 
React+fluxを導入した話
React+fluxを導入した話React+fluxを導入した話
React+fluxを導入した話
Yuki Ishikawa
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
Shuzo Kashihara
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
Developers Summit
 
Devとopsをつなぐchat ops
Devとopsをつなぐchat opsDevとopsをつなぐchat ops
Devとopsをつなぐchat ops
ikikko
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
Toru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
Toru Takahashi
 
勉強会をやる人募集中
勉強会をやる人募集中勉強会をやる人募集中
勉強会をやる人募集中
Tomo Mizuno
 
PythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEGPythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEG
Jun Okazaki
 
鹿駆動
鹿駆動鹿駆動
鹿駆動
Shinichi Kozake
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.jsAkio Ishida
 
160531 IoT LT #15 @ 日本IBM
160531 IoT LT #15 @ 日本IBM160531 IoT LT #15 @ 日本IBM
160531 IoT LT #15 @ 日本IBM
Toshiki Tsuboi
 
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
Ryo Sasaki
 
Java8 code kata (Japanese)
Java8 code kata (Japanese)Java8 code kata (Japanese)
Java8 code kata (Japanese)
Hiroaki Kono
 
Yapc2012ltthon
Yapc2012ltthonYapc2012ltthon
Yapc2012ltthon
Junya Murabe
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
Hiroto Yamakawa
 
#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身
Hisateru Tanaka
 
ALMツールたべくらべ
ALMツールたべくらべALMツールたべくらべ
ALMツールたべくらべ
Kaoru NAKAMURA
 

Similar to jOOQの紹介 (20)

ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
 
Creators'night#3今井
Creators'night#3今井 Creators'night#3今井
Creators'night#3今井
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
 
React+fluxを導入した話
React+fluxを導入した話React+fluxを導入した話
React+fluxを導入した話
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
 
Devとopsをつなぐchat ops
Devとopsをつなぐchat opsDevとopsをつなぐchat ops
Devとopsをつなぐchat ops
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
勉強会をやる人募集中
勉強会をやる人募集中勉強会をやる人募集中
勉強会をやる人募集中
 
PythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEGPythonのGUI_2018 with NSEG
PythonのGUI_2018 with NSEG
 
鹿駆動
鹿駆動鹿駆動
鹿駆動
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.js
 
160531 IoT LT #15 @ 日本IBM
160531 IoT LT #15 @ 日本IBM160531 IoT LT #15 @ 日本IBM
160531 IoT LT #15 @ 日本IBM
 
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
ビットキーのIoT基盤におけるAWS IoT Rule Action 活用
 
Java8 code kata (Japanese)
Java8 code kata (Japanese)Java8 code kata (Japanese)
Java8 code kata (Japanese)
 
Yapc2012ltthon
Yapc2012ltthonYapc2012ltthon
Yapc2012ltthon
 
Lombok ハンズオン
Lombok ハンズオンLombok ハンズオン
Lombok ハンズオン
 
#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身
 
ALMツールたべくらべ
ALMツールたべくらべALMツールたべくらべ
ALMツールたべくらべ
 

More from Takuya Kitamura

アジャイルの手法を取り入れたプロジェクトマネジメントの実例
アジャイルの手法を取り入れたプロジェクトマネジメントの実例アジャイルの手法を取り入れたプロジェクトマネジメントの実例
アジャイルの手法を取り入れたプロジェクトマネジメントの実例
Takuya Kitamura
 
大手ユーザー企業に入ってマネジメントでやってみたこと
大手ユーザー企業に入ってマネジメントでやってみたこと大手ユーザー企業に入ってマネジメントでやってみたこと
大手ユーザー企業に入ってマネジメントでやってみたこと
Takuya Kitamura
 
グローバル空調メーカーによるIoTプラットフォームへの挑戦
グローバル空調メーカーによるIoTプラットフォームへの挑戦グローバル空調メーカーによるIoTプラットフォームへの挑戦
グローバル空調メーカーによるIoTプラットフォームへの挑戦
Takuya Kitamura
 
サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦
サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦
サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦
Takuya Kitamura
 
キレイなコードの書き方
キレイなコードの書き方キレイなコードの書き方
キレイなコードの書き方
Takuya Kitamura
 
AngularJSとバックエンドサービスAppPotで作る業務システムハンズオン
AngularJSとバックエンドサービスAppPotで作る業務システムハンズオンAngularJSとバックエンドサービスAppPotで作る業務システムハンズオン
AngularJSとバックエンドサービスAppPotで作る業務システムハンズオン
Takuya Kitamura
 
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるSwiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考える
Takuya Kitamura
 
UXデザイン✕アジャイル✕受託開発
UXデザイン✕アジャイル✕受託開発UXデザイン✕アジャイル✕受託開発
UXデザイン✕アジャイル✕受託開発
Takuya Kitamura
 
スマートデバイスSIの落とし穴と適した開発手法とは?
スマートデバイスSIの落とし穴と適した開発手法とは?スマートデバイスSIの落とし穴と適した開発手法とは?
スマートデバイスSIの落とし穴と適した開発手法とは?
Takuya Kitamura
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
Takuya Kitamura
 

More from Takuya Kitamura (10)

アジャイルの手法を取り入れたプロジェクトマネジメントの実例
アジャイルの手法を取り入れたプロジェクトマネジメントの実例アジャイルの手法を取り入れたプロジェクトマネジメントの実例
アジャイルの手法を取り入れたプロジェクトマネジメントの実例
 
大手ユーザー企業に入ってマネジメントでやってみたこと
大手ユーザー企業に入ってマネジメントでやってみたこと大手ユーザー企業に入ってマネジメントでやってみたこと
大手ユーザー企業に入ってマネジメントでやってみたこと
 
グローバル空調メーカーによるIoTプラットフォームへの挑戦
グローバル空調メーカーによるIoTプラットフォームへの挑戦グローバル空調メーカーによるIoTプラットフォームへの挑戦
グローバル空調メーカーによるIoTプラットフォームへの挑戦
 
サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦
サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦
サーバーレスアーキテクチャで実現するグローバル空調IoTプラットフォームへの挑戦
 
キレイなコードの書き方
キレイなコードの書き方キレイなコードの書き方
キレイなコードの書き方
 
AngularJSとバックエンドサービスAppPotで作る業務システムハンズオン
AngularJSとバックエンドサービスAppPotで作る業務システムハンズオンAngularJSとバックエンドサービスAppPotで作る業務システムハンズオン
AngularJSとバックエンドサービスAppPotで作る業務システムハンズオン
 
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるSwiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考える
 
UXデザイン✕アジャイル✕受託開発
UXデザイン✕アジャイル✕受託開発UXデザイン✕アジャイル✕受託開発
UXデザイン✕アジャイル✕受託開発
 
スマートデバイスSIの落とし穴と適した開発手法とは?
スマートデバイスSIの落とし穴と適した開発手法とは?スマートデバイスSIの落とし穴と適した開発手法とは?
スマートデバイスSIの落とし穴と適した開発手法とは?
 
ドメイン駆動設計入門
ドメイン駆動設計入門ドメイン駆動設計入門
ドメイン駆動設計入門
 

Recently uploaded

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
Yuki Miyazaki
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
sugiuralab
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 

Recently uploaded (9)

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 

jOOQの紹介