SlideShare a Scribd company logo
1 of 66
Download to read offline
(C) CASAREAL, Inc. All rights reserved.
#jsug
Java ORマッパー選定の
ポイント
(株)カサレアル 多⽥真敏
2019年1⽉31⽇
JSUG勉強会
1
(C) CASAREAL, Inc. All rights reserved.
#jsug
このセッションについて
▸ 何故ORマッパーというものが必要か、

どんな種類があるのか、どう選べばいいのかを

解説します
▸ 各ORマッパーの詳細な設定⽅法などは触れません
▸ 初級〜中級者向け
▸ Javaで何らかのRDBアクセスプログラムを書いたことが
ある⽅が対象です
2
(C) CASAREAL, Inc. All rights reserved.
#jsug
⾃⼰紹介
▸ 多⽥真敏(@suke_masa)
▸ 研修トレーナー@カサレアル
▸ Spring / Java EE / Microservices

/ Cloud Foundry
▸ Pivotal認定講師
▸ ⽇本Springユーザ会スタッフ
▸ ⽇本GlassFishユーザー会運営メンバー
3
仕事柄、
「ORマッパーは何がいいですか」
と聞かれることは多いです
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
4
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
5
(C) CASAREAL, Inc. All rights reserved.
#jsug
JavaでDBアクセスと⾔えばJDBC
6
public class JdbcEmployeeRepository {
private final DataSource dataSource;
// 検索するSELECT⽂
private static final String SQL_SELECT_ALL =
"SELECT e.id, e.name, e.salary, e.joined_date,"
+ " e.department_id, d.name AS department_name"
+ " FROM employee e JOIN department d"
+ " ON e.department_id = d.id"
+ " ORDER BY e.id";
// 検索メソッド
public List<Employee> findAll() {
try (Connection con = dataSource.getConnection();
PreparedStatement ps = con.prepareStatement(SQL_SELECT_ALL);
ResultSet rs = ps.executeQuery()) {
// 次ページへ
(C) CASAREAL, Inc. All rights reserved.
#jsug
JavaでDBアクセスと⾔えばJDBC
7
List<Employee> employeeList = new ArrayList<>();
while (rs.next()) {
// ResultSetからEmployeeクラスに詰め替え
int id = rs.getInt("id");
String name = rs.getString("name");
BigDecimal salary = rs.getBigDecimal("salary");
LocalDate joinedDate = rs.getDate("joined_date").toLocalDate();
int departmentId = rs.getInt("department_id");
String departmentName = rs.getString("department_name");
Employee employee = new Employee(id, name, salary, joinedDate,
departmentId, departmentName);
// Listに追加する
employeeList.add(employee);
}
return employeeList;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
(C) CASAREAL, Inc. All rights reserved.
#jsug
JDBCの問題点
① SQLを⽂字列でプログラム内にベタ書きする
▸ 後から修正するのは⼤変、"+"で連結するのも⾯倒、

実⾏しないとスペルミスに気づけないことも…
② 毎回ほぼ同じことを書かなければならない※
▸ Connectionを取得して、PreparedStatementを作って、

rs.next()で繰り返して…
③ ResultSetをエンティティに詰め替えるのが⾯倒
▸ (rs.getXxx()で列の値を取得→setterで代⼊) × 列数
8※「ボイラープレートコード」と呼ばれる
😩
(C) CASAREAL, Inc. All rights reserved.
#jsug
そこでORマッパーの登場!
▸ Object Relational Mapping
▸ RDBのレコードをJavaのオブジェクトに変換する
▸ JDBCをラップして、冗⻑さを開発者に意識させ
ない
▸ SQLを⾃動発⾏したり、外部ファイルに記述し
たりできる
9
😆
(C) CASAREAL, Inc. All rights reserved.
#jsug
ORマッパーは世の中にたくさんある
10
Spring JDBC
JPA
(C) CASAREAL, Inc. All rights reserved.
#jsug
ORマッパーは4種類
11
(広義の)ORマッパー
1. JDBCラッパー型: JDBCを薄くラッピングしただけ
2. SQLマッパー型: SQLとクラスの詰め替えに特化
3. クエリビルダー型: クラスやメソッドでSQLを記述する
4. (狭義の)ORマッパー型: リレーション重視、SQL⾃動発⾏
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
12
(C) CASAREAL, Inc. All rights reserved.
#jsug
Type 1. JDBCラッパー型
▸ JDBCを薄くラッピングしただけ
▸ 記述の冗⻑さは、JDBCより少しマシになる程度
▸ 使いやすさと学習コストの低さが特徴
▸ 例
▸ Spring JDBC ←今回はコレを紹介
▸ Apache Commons DbUtils、sql2o
13
(C) CASAREAL, Inc. All rights reserved.
#jsug
Spring JDBC
▸ Spring Framework内で開発されている

JDBCラッパー
▸ Connection・PreparedStatementは

開発者に触らせない
▸ ResultSetからの詰め替えのみ開発者が記述する
▸ SpringのDIコンテナが無くても動く
▸ Java EEなど他の環境でも使える → 例
14
(C) CASAREAL, Inc. All rights reserved.
#jsug
サンプルコード
15
List<Employee> employeeList = jdbcTemplate.query(
"SELECT ... FROM ...",
(rs, rowNum) -> {
int id = rs.getInt("id");
String name = rs.getString("name");
BigDecimal salary = rs.getBigDecimal("salary");
LocalDate joinedDate =
rs.getDate("joined_date").toLocalDate();
int departmentId = rs.getInt("department_id");
String departmentName =
rs.getString("department_name");
return new Employee(id, name, salary, joinedDate,
departmentId, departmentName);
}
);
SQL RowMapper
(C) CASAREAL, Inc. All rights reserved.
#jsug
NamedParameterJdbcTemplateクラスの主なメソッド
▸ List<T> query(String, RowMapper<T>)
▸ 複数件検索
▸ List<T> query(String, Map<String,?>, RowMapper<T>)
▸ 複数件検索(パラメーター指定付き)
▸ T queryForObject(String, Map<String,?>, RowMapper<T>)
▸ 単一検索
▸ int update(String, Map<String,?>)
▸ INSERT・UPDATE・DELETEの実行
16
(C) CASAREAL, Inc. All rights reserved.
#jsug
RowMapper<T>インタフェース
▸ T mapRow(ResultSet rs, int rowNum)のみを持つ

関数型インタフェース
▸ ResultSetからエンティティに変換する処理を記述する
17
List<Employee> employeeList = jdbcTemplate.query(
"SELECT ... FROM ...",
(rs, rowNum) -> {
int id = rs.getInt("id");
String name = rs.getString("name");
...
return new Employee(...);
}
);
(C) CASAREAL, Inc. All rights reserved.
#jsug
query()におけるRowMapperのイメージ
▸ 各⾏ごとにmapRow()が実⾏される
18
id name salary
101 Alice $3000
102 Bob $3500
103 Chris $2500
mapRow()
mapRow()
mapRow()
Employee
Employee
Employee
(C) CASAREAL, Inc. All rights reserved.
#jsug
BeanPropertyRowMapperクラス
▸ 列名とプロパティ名が同じものは⾃動詰め替えしてくれる
▸ スネークケース(department_id)

↔ キャメルケース(departmentId) の変換対応
▸ Date and Time APIも対応
19
List<Employee> employeeList =
jdbcTemplate.query(SQL_SELECT_ALL,
BeanPropertyRowMapper.newInstance(Employee.class));
(C) CASAREAL, Inc. All rights reserved.
#jsug
JDBCができることは何でもできる
▸ 集計
▸ long count = getForObject(

"SELECT COUNT(*) ...", Long.class)
▸ バッチ更新
▸ batchUpdate()
▸ 1:Nリレーションを持つクラスへの変換
▸ ResultSetExtractor
20
(C) CASAREAL, Inc. All rights reserved.
#jsug
派⽣種:Bootiful SQL Template
▸ @cero_tさん作 (Java Champon!)
▸ Spring JDBCに、SQLマッパー型のような外部SQLファイル機能を追加
21https://github.com/cero-t/sqltemplate
(C) CASAREAL, Inc. All rights reserved.
#jsug
まとめ:Spring JDBC
▸ メリット
▸ ボイラープレートコードを削減できる
▸ 使い⽅が簡単
▸ BeanPropertyRowMapperなど意外と便利
▸ デメリット
▸ SQLは変わらずベタ書きする
▸ RowMapperの記述は⼿間がかかる
22
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
23
(C) CASAREAL, Inc. All rights reserved.
#jsug
Type 2. SQLマッパー型
▸ SQLとクラスの詰替えに特化
▸ SQLは別途テキストファイルに書くことが多い
▸ 例
▸ MyBatis ←今回は主にコレを紹介
▸ Doma ←コレも少し紹介
▸ Mirage SQL、Jdbi、
24
(C) CASAREAL, Inc. All rights reserved.
#jsug
MyBatis
▸ SQLをXMLに記述する
▸ 公式ドキュメントが多⾔語化されている
▸ 英語・⽇本語・スペイン語・ハングル語・中国語
▸ Apacheプロジェクトの頃は「iBatis」だった
▸ Apacheからの独⽴時に「MyBatis」になった
▸ iBatis時代からの経験者も多い?
25
(C) CASAREAL, Inc. All rights reserved.
#jsug
SQLを書くMapper XML
26
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="findById" resultType="Employee">
SELECT e.id AS id,
e.name AS name,
e.salary AS salary,
e.joined_date AS joined_date,
d.id AS department_id,
d.name AS department_name
FROM employee e
JOIN department d ON e.department_id = d.id
WHERE e.id = #{id}
</select>
</mapper>
(C) CASAREAL, Inc. All rights reserved.
#jsug
検索の実⾏
27
public interface EmployeeMapper {
public Employee findById(Integer id);
}
EmployeeMapper employeeMapper = ...;
Employee employee = employeeMapper.findById(1);
Mapper XMLと1対1の
インタフェース
(C) CASAREAL, Inc. All rights reserved.
#jsug
条件分岐
28
<update id="update">
UPDATE employee e
SET e.name = #{name}
<if test="salary != null">
, e.salary = #{salary}
</if>
WHERE e.id = #{id}
</update>
public interface EmployeeMapper {
public void update(String name, BigDecimal salary,
Integer id);
}
(C) CASAREAL, Inc. All rights reserved.
#jsug
不等号対策①
▸ CDATAセクションにする
29
<select id="findBySalaryUnder" resultType="Employee">
<![CDATA[
SELECT e.id AS id,
e.name AS name,
e.joined_date AS joined_date,
e.salary AS salary,
d.id AS department_id,
d.name AS department_name
FROM employee e
JOIN department d ON e.department_id = d.id
WHERE e.salary < #{salary}
ORDER BY e.id
]]>
</select>
CDATAセクションにする
(C) CASAREAL, Inc. All rights reserved.
#jsug
不等号対策②
▸ CDATAセクションにする
30
<select id="findBySalaryUnder" resultType="Employee">
SELECT e.id AS id,
e.name AS name,
e.joined_date AS joined_date,
e.salary AS salary,
d.id AS department_id,
d.name AS department_name
FROM employee e
JOIN department d ON e.department_id = d.id
WHERE e.salary &lt; #{salary}
ORDER BY e.id
</select>
エスケープする
(C) CASAREAL, Inc. All rights reserved.
#jsug
<if>タグと不等号が混じったSQLを書くと
▸ <if>とCDATAの舞い踊り😱
31
(C) CASAREAL, Inc. All rights reserved.
#jsug
まとめ:MyBatis
▸ メリット
▸ SQLが⾃由に記述できる
▸ デメリット
▸ XML内なので不等号の扱いが⾯倒
32
(C) CASAREAL, Inc. All rights reserved.
#jsug
Doma
▸ 2-way SQLが書ける
▸ SQL単体でも実⾏可能(後述)
▸ ドキュメントやメッセージが⽇本語

→ 英語化が進⾏中
▸ ⽇本語版ドキュメントは過去バージョンへ
33
※URLに「/en」と⼊っていますが、2.20.0までは全て⽇本語です。

 2.21.0以降は段階的に英語化されています。
(C) CASAREAL, Inc. All rights reserved.
#jsug
2-way SQL
34
SELECT
e.id AS id,
e.name AS name,
e.salary AS salary,
e.joined_date AS joined_date,
e.department_id AS department_id,
d.name AS department_name
FROM employee e
JOIN department d
ON e.department_id = d.id
WHERE e.id = /*id*/101
パラメーターや条件分岐は
コメントで書く
コメント直後の値は
Domaに無視される
▸ SQL単体でも、プログラムからでも実⾏可能
(C) CASAREAL, Inc. All rights reserved.
#jsug
まとめ:Doma
▸ メリット
▸ 2-way SQL!
▸ デメリット
▸ アノテーションプロセッサーが他ライブラリのものと

競合する可能性
▸ ほぼ個⼈のプロジェクト
35
ぜひ開発に
参加しましょう!
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
36
(C) CASAREAL, Inc. All rights reserved.
#jsug
Type 3. クエリビルダー型
▸ SQLをクラスやメソッドで記述する
▸ 記述を間違えるとコンパイルエラーになる
▸ これらのクラスは⾃動⽣成することが多い
▸ 例
▸ jOOQ ← 今回はコレを主に紹介
▸ DBFlute ←コレも少し紹介
▸ その他にもいろいろ(Reladomo、Querydsl、Ebean、Speedment、
Jinq、requery、Cayenne、Torque)
37
(C) CASAREAL, Inc. All rights reserved.
#jsug
先にお詫び
▸ このタイプは個⼈的に利⽤経験があまりなく、

内容薄めです
▸ 不正確な部分があればお知らせください
38
🙇
(C) CASAREAL, Inc. All rights reserved.
#jsug
jOOQ
▸ スイスのData Geekery GmbH社が開発
▸ 無償版・有償版などプランがいろいろある
39
(C) CASAREAL, Inc. All rights reserved.
#jsug
検索の例
40
create.select(EMPLOYEE.ID, EMPLOYEE.NAME)
.from(EMPLOYEE)
.orderBy(EMPLOYEE.ID.asc())
.fetch();
(C) CASAREAL, Inc. All rights reserved.
#jsug
まとめ:jOOQ
▸ メリット
▸ SQLタイプミスの⼼配がない!
▸ デメリット
▸ 複雑なSQLを完全に再現できるのか?
▸ いざとなったら⽂字列でSQLを書けるクエリビルダー型ORマッパー
もあるっぽい
▸ やや記述は冗⻑な気がする
41
(C) CASAREAL, Inc. All rights reserved.
#jsug
変わり種:DBFlute
▸ @jfluteさん作
▸ タイプセーフ記述 + 2-waySQL
▸ ドキュメント⽣成機能が充実
▸ DBスキーマからDB定義書(HTML)を⽣成
▸ 旧DBスキーマとの差分からDB変更履歴書(HTML)を
⽣成
42
http://dbflute.seasar.org
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
43
(C) CASAREAL, Inc. All rights reserved.
#jsug
JPA
▸ Java EEで標準化されたデータアクセスの仕様
▸ もともとはHibernateをモデルとしている
▸ JPA仕様に準拠したORマッパーの例
▸ EclipseLink
▸ Hibernate
44
(C) CASAREAL, Inc. All rights reserved.
#jsug
基本的なCRUD処理
45
// 主キー検索。SELECT⽂は⾃動発⾏される
Employee employee = entityManager.find(Employee.class, 1);
// 追加。INSERT⽂は⾃動発⾏される
entityManager.persist(new Employee(...));
// 更新。コミット時にUPDATE⽂が⾃動発⾏される
Employee employee = entityManager.find(Employee.class, 1);
employee.setName("Other Name");
// 削除。DELETE⽂が⾃動発⾏される
Employee employee = entityManager.find(Employee.class, 1);
entityManager.remove(employee);
(C) CASAREAL, Inc. All rights reserved.
#jsug
JPQLによる検索
▸ SQLに似ているが微妙に⽂法は違う
▸ 集合演算が出来ない、副問合せに制限あり、

3つ以上のテーブルの結合に難あり、…
46
// 主キー検索
String jpql = "SELECT e FROM Employee e"
+ " WHERE e.name LIKE :name";
List<Employee> employeeList =
entityManager.createQuery(jpql, Employee.class)
.setParameter("name", "%a%")
.getResultList();
(C) CASAREAL, Inc. All rights reserved.
#jsug
[超重要] エンティティの状態
47
永続化コンテキスト
MANAGED
状態
REMOVED
状態
NEW
状態
DETACHED
状態
persist()
detach()

clear()
merge()
remove()
flush()
flush()
refresh()
find()

JPQL
detach()

clear()
(C) CASAREAL, Inc. All rights reserved.
#jsug
実装依存な挙動
▸ EclipseLinkとHibernateでは、

同じコードでも挙動が違う部分が多々
▸ Hibernateの情報は、EclipseLinkで役に⽴たない

ことがある😱
48
(C) CASAREAL, Inc. All rights reserved.
#jsug
N+1問題
▸ 注⽂:明細などの1:Nリレーションが

ある場合に発⽣しうるパフォーマンス問題
▸ 注⽂の検索(1回)+ 各注⽂に紐づく明細(N回)

のSELECT⽂が発⾏される
▸ 対策はあるが(JOIN FETCH⽂)、

3つ以上のテーブル結合にはテクニックが必要
49
遅延読み込みが
⼤きな原因の1つ
(C) CASAREAL, Inc. All rights reserved.
#jsug
ネイティブSQLの扱いにも難あり
▸ 複数の⽅法があるが、制限がある or 記述が⾯倒
50
@Entity	
@SqlResultSetMapping(	
		name	=	"product_id_name",	
		classes	=	{	
				@ConstructorResult(targetClass	=	ProductDto.class,	
						columns	=	{	
								@ColumnResult(name	=	"id"),	
								@ColumnResult(name	=	"name")	
						}	
				)	
		}	
)	
public	class	Product	{	…	}
アノテーションの中に
アノテーションの中に
アノテーション
(C) CASAREAL, Inc. All rights reserved.
#jsug
学習コストは⾼い
▸ JPA仕様書はA4で600ページ以上
▸ もちろん全て英語
▸ 書籍「パーフェクトJava EE」でも

相当のページ数を割いている
▸ 多⽥の過去スライドは50分枠で120枚
▸ 削る前は160枚(それでも控えめにしてた)
51
(C) CASAREAL, Inc. All rights reserved.
#jsug
[アンケート] なぜJPAを選びましたか?
52
その他
10%
ベンダーサポート
があるから
40%
標準技術だから
50%
※個⼈の感覚値です
きちんとした技術検証なしに
選ばれているように感じる
(個⼈の意⾒)
(C) CASAREAL, Inc. All rights reserved.
#jsug
JPAを使ってもいい条件
53
① DBを新規に設計できる
② 集合演算やFROM句での副問合せなど、

複雑なSQLは要件的に少ない
③ 「パーフェクトJava EE」を読破した⼈が

プロジェクトに1⼈以上いる
1つでも当てはまらない項⽬があれば、
他のORマッパーを使った⽅がいいかも😅
※「向いている」とは⾔ってない
(C) CASAREAL, Inc. All rights reserved.
#jsug
まとめ:JPA
▸ 難易度が⾼いため、なるべく避けたほうが懸命
▸ 使うなら必死に勉強を
54
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
55
(C) CASAREAL, Inc. All rights reserved.
#jsug
Spring Data
▸ 多くのデータアクセス技術を抽象化して、

共通のインタフェースを提供
56
Spring Data
Spring
Data
JPA
Spring
Data
Redis
Spring
Data
MongoDB
・・・
(C) CASAREAL, Inc. All rights reserved.
#jsug
CrudRepositoryインタフェース
▸ 基本的なCRUDメソッドを持つ
▸ これを継承したインタフェースを作成するだけ
▸ 実装クラスやそのインスタンスはSpringが実⾏時に作成
57
public interface EmployeeRepository
extends CrudRepository<Employee, Integer> {
// 空でOK。メソッドの追加も可能
}
(C) CASAREAL, Inc. All rights reserved.
#jsug
エンティティクラス
▸ それぞれ付加するアノテーションが異なるが、

それ以外はほぼ同じ
58
// JPA
@Entity
public class Employee {
...
}
// Spring Data Redis
@RedisHash("employee")
public class Employee {
...
}
データストアが違っても同じように
アクセスできるのは本当にありがたい!
(C) CASAREAL, Inc. All rights reserved.
#jsug
RDB向けはSpring Data JPAのみ
▸ 「Spring Dataを使いたいから」というだけで

Spring Data JPAを使っている事も多いのでは?
▸ しかしJPAであることには変わりない
▸ JPAの複雑さを分かった上で採⽤してます?
59
(C) CASAREAL, Inc. All rights reserved.
#jsug
[告知] このあと!
▸ しんどーさんによる

Spring Data JDBCのセッションがあります
▸ Spring JDBCのSpring Data!
▸ JPAの複雑さなしでSpring Dataを使えるので期待
60
(C) CASAREAL, Inc. All rights reserved.
#jsug
⽬次
① ORマッパーとその分類
② Type 1. JDBCラッパー型
③ Type 2. SQLマッパー型
④ Type 3. クエリビルダー型
⑤ Type 4. ORマッパー型
⑥ Extra. Spring Data
⑦ まとめ
61
(C) CASAREAL, Inc. All rights reserved.
#jsug
正直、どれも⼀⻑⼀短あり。
62
⭕ 2-way SQLが書ける
❌ アノテーションプロセッサー
⭕ SQLが書ける
❌ XMLにSQLを書く
⭕ 簡単
❌ やや冗⻑、SQLベタ書き
⭕ タイプセーフ
❌ やや冗⻑
⭕ ⾼機能
❌ 複雑、SQLの扱いに難
享受するメリット・許容できるデメリットと、
プロジェクトの状況を鑑みて選定するしかない
(C) CASAREAL, Inc. All rights reserved.
#jsug
ORマッパー選定フロー ※個⼈の意⾒です
63
どうしても

JPAを使わなければならない

事情がある
ORマッパー型
タイプセーフに

SQLを記述したい
クエリ
ビルダー型
SQL
マッパー型
JDBC
ラッパー型
SQLを外部ファイルに

書きたい
Yes
No
No
No
Yes
Yes
(C) CASAREAL, Inc. All rights reserved.
#jsug
最後に伝えたいこと(建前)
▸ 「標準だから」だけの理由でJPAを選ばない🙅
▸ もしJPAを使うなら必死で勉強してください
▸ 選択肢が多くあることを知り、

プロジェクトに合わせて適切に選びましょう!
▸ ORマッパー名は挙げたので、

気になったものをググってください
64
(C) CASAREAL, Inc. All rights reserved.
#jsug
最後に伝えたいこと(※個⼈の(ry)
▸ とにかく安牌ならSpring JDBC or MyBatis
▸ Doma、DBFlute、クエリビルダー型は、

それらの知識がある⼈がいれば、良い選択と思います
▸ JPAを「積極的に採⽤したい」シチュエーションは、
特に思い浮かびません
▸ 個⼈プロジェクトが⼼配なら、

⾃社からコミッターを出しましょう
65
(C) CASAREAL, Inc. All rights reserved.
#jsug
Enjoy Data Access!!
▸ ご清聴ありがとうございました!
66

More Related Content

What's hot

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugMasatoshi Tada
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座Samir Hammoudi
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話JustSystems Corporation
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 

What's hot (20)

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 

Similar to Java ORマッパー選定のポイント #jsug

Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccMasatoshi Tada
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービューMasatoshi Tada
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)Koichi Sakata
 
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...オラクルユニバーシティ
 
SpringOneでの3⽇間とSpring 5.1最新情報
SpringOneでの3⽇間とSpring 5.1最新情報SpringOneでの3⽇間とSpring 5.1最新情報
SpringOneでの3⽇間とSpring 5.1最新情報CASAREAL, Inc.
 
20120421中国gtug
20120421中国gtug20120421中国gtug
20120421中国gtugYusuke Sato
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackkimukou_26 Kimukou
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradlekimukou_26 Kimukou
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013Takashi Someda
 
【基礎編】社内向けMySQL勉強会
【基礎編】社内向けMySQL勉強会【基礎編】社内向けMySQL勉強会
【基礎編】社内向けMySQL勉強会Yuji Otani
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
Asakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for HadoopAsakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for HadoopTakashi Kambayashi
 
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006Cloudera Japan
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツールYasumasa Suenaga
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - Tetsutaro Watanabe
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説Masahiko Sawada
 
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_techKazuhiro Sera
 

Similar to Java ORマッパー選定のポイント #jsug (20)

Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
 
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
20170428_【事前課題あり】ORACLE MASTER Bronze Oracle Database 12c 「12c SQL基礎[12c SQL]...
 
SpringOneでの3⽇間とSpring 5.1最新情報
SpringOneでの3⽇間とSpring 5.1最新情報SpringOneでの3⽇間とSpring 5.1最新情報
SpringOneでの3⽇間とSpring 5.1最新情報
 
20120421中国gtug
20120421中国gtug20120421中国gtug
20120421中国gtug
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hack
 
Chugokudb18_2
Chugokudb18_2Chugokudb18_2
Chugokudb18_2
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
 
【基礎編】社内向けMySQL勉強会
【基礎編】社内向けMySQL勉強会【基礎編】社内向けMySQL勉強会
【基礎編】社内向けMySQL勉強会
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
Asakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for HadoopAsakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for Hadoop
 
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
G-Tech2015 Hadoop/Sparkを中核としたビッグデータ基盤_20151006
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
Metaspace
MetaspaceMetaspace
Metaspace
 
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech
 

More from Masatoshi Tada

これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装Masatoshi Tada
 
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説Masatoshi Tada
 
Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-Masatoshi Tada
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会Masatoshi Tada
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるMasatoshi Tada
 
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Masatoshi Tada
 
Spring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugSpring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugMasatoshi Tada
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafMasatoshi Tada
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Masatoshi Tada
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltNetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltMasatoshi Tada
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccJPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccMasatoshi Tada
 

More from Masatoshi Tada (15)

これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装
 
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
 
Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-Java EE 8新機能解説 -Bean Validation 2.0編-
Java EE 8新機能解説 -Bean Validation 2.0編-
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
 
Spring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugSpring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsug
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with Thymeleaf
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltNetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccJPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
 

Recently uploaded

ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 

Recently uploaded (12)

2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 

Java ORマッパー選定のポイント #jsug

  • 1. (C) CASAREAL, Inc. All rights reserved. #jsug Java ORマッパー選定の ポイント (株)カサレアル 多⽥真敏 2019年1⽉31⽇ JSUG勉強会 1
  • 2. (C) CASAREAL, Inc. All rights reserved. #jsug このセッションについて ▸ 何故ORマッパーというものが必要か、
 どんな種類があるのか、どう選べばいいのかを
 解説します ▸ 各ORマッパーの詳細な設定⽅法などは触れません ▸ 初級〜中級者向け ▸ Javaで何らかのRDBアクセスプログラムを書いたことが ある⽅が対象です 2
  • 3. (C) CASAREAL, Inc. All rights reserved. #jsug ⾃⼰紹介 ▸ 多⽥真敏(@suke_masa) ▸ 研修トレーナー@カサレアル ▸ Spring / Java EE / Microservices
 / Cloud Foundry ▸ Pivotal認定講師 ▸ ⽇本Springユーザ会スタッフ ▸ ⽇本GlassFishユーザー会運営メンバー 3 仕事柄、 「ORマッパーは何がいいですか」 と聞かれることは多いです
  • 4. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 4
  • 5. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 5
  • 6. (C) CASAREAL, Inc. All rights reserved. #jsug JavaでDBアクセスと⾔えばJDBC 6 public class JdbcEmployeeRepository { private final DataSource dataSource; // 検索するSELECT⽂ private static final String SQL_SELECT_ALL = "SELECT e.id, e.name, e.salary, e.joined_date," + " e.department_id, d.name AS department_name" + " FROM employee e JOIN department d" + " ON e.department_id = d.id" + " ORDER BY e.id"; // 検索メソッド public List<Employee> findAll() { try (Connection con = dataSource.getConnection(); PreparedStatement ps = con.prepareStatement(SQL_SELECT_ALL); ResultSet rs = ps.executeQuery()) { // 次ページへ
  • 7. (C) CASAREAL, Inc. All rights reserved. #jsug JavaでDBアクセスと⾔えばJDBC 7 List<Employee> employeeList = new ArrayList<>(); while (rs.next()) { // ResultSetからEmployeeクラスに詰め替え int id = rs.getInt("id"); String name = rs.getString("name"); BigDecimal salary = rs.getBigDecimal("salary"); LocalDate joinedDate = rs.getDate("joined_date").toLocalDate(); int departmentId = rs.getInt("department_id"); String departmentName = rs.getString("department_name"); Employee employee = new Employee(id, name, salary, joinedDate, departmentId, departmentName); // Listに追加する employeeList.add(employee); } return employeeList; } catch (SQLException e) { throw new RuntimeException(e); } } }
  • 8. (C) CASAREAL, Inc. All rights reserved. #jsug JDBCの問題点 ① SQLを⽂字列でプログラム内にベタ書きする ▸ 後から修正するのは⼤変、"+"で連結するのも⾯倒、
 実⾏しないとスペルミスに気づけないことも… ② 毎回ほぼ同じことを書かなければならない※ ▸ Connectionを取得して、PreparedStatementを作って、
 rs.next()で繰り返して… ③ ResultSetをエンティティに詰め替えるのが⾯倒 ▸ (rs.getXxx()で列の値を取得→setterで代⼊) × 列数 8※「ボイラープレートコード」と呼ばれる 😩
  • 9. (C) CASAREAL, Inc. All rights reserved. #jsug そこでORマッパーの登場! ▸ Object Relational Mapping ▸ RDBのレコードをJavaのオブジェクトに変換する ▸ JDBCをラップして、冗⻑さを開発者に意識させ ない ▸ SQLを⾃動発⾏したり、外部ファイルに記述し たりできる 9 😆
  • 10. (C) CASAREAL, Inc. All rights reserved. #jsug ORマッパーは世の中にたくさんある 10 Spring JDBC JPA
  • 11. (C) CASAREAL, Inc. All rights reserved. #jsug ORマッパーは4種類 11 (広義の)ORマッパー 1. JDBCラッパー型: JDBCを薄くラッピングしただけ 2. SQLマッパー型: SQLとクラスの詰め替えに特化 3. クエリビルダー型: クラスやメソッドでSQLを記述する 4. (狭義の)ORマッパー型: リレーション重視、SQL⾃動発⾏
  • 12. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 12
  • 13. (C) CASAREAL, Inc. All rights reserved. #jsug Type 1. JDBCラッパー型 ▸ JDBCを薄くラッピングしただけ ▸ 記述の冗⻑さは、JDBCより少しマシになる程度 ▸ 使いやすさと学習コストの低さが特徴 ▸ 例 ▸ Spring JDBC ←今回はコレを紹介 ▸ Apache Commons DbUtils、sql2o 13
  • 14. (C) CASAREAL, Inc. All rights reserved. #jsug Spring JDBC ▸ Spring Framework内で開発されている
 JDBCラッパー ▸ Connection・PreparedStatementは
 開発者に触らせない ▸ ResultSetからの詰め替えのみ開発者が記述する ▸ SpringのDIコンテナが無くても動く ▸ Java EEなど他の環境でも使える → 例 14
  • 15. (C) CASAREAL, Inc. All rights reserved. #jsug サンプルコード 15 List<Employee> employeeList = jdbcTemplate.query( "SELECT ... FROM ...", (rs, rowNum) -> { int id = rs.getInt("id"); String name = rs.getString("name"); BigDecimal salary = rs.getBigDecimal("salary"); LocalDate joinedDate = rs.getDate("joined_date").toLocalDate(); int departmentId = rs.getInt("department_id"); String departmentName = rs.getString("department_name"); return new Employee(id, name, salary, joinedDate, departmentId, departmentName); } ); SQL RowMapper
  • 16. (C) CASAREAL, Inc. All rights reserved. #jsug NamedParameterJdbcTemplateクラスの主なメソッド ▸ List<T> query(String, RowMapper<T>) ▸ 複数件検索 ▸ List<T> query(String, Map<String,?>, RowMapper<T>) ▸ 複数件検索(パラメーター指定付き) ▸ T queryForObject(String, Map<String,?>, RowMapper<T>) ▸ 単一検索 ▸ int update(String, Map<String,?>) ▸ INSERT・UPDATE・DELETEの実行 16
  • 17. (C) CASAREAL, Inc. All rights reserved. #jsug RowMapper<T>インタフェース ▸ T mapRow(ResultSet rs, int rowNum)のみを持つ
 関数型インタフェース ▸ ResultSetからエンティティに変換する処理を記述する 17 List<Employee> employeeList = jdbcTemplate.query( "SELECT ... FROM ...", (rs, rowNum) -> { int id = rs.getInt("id"); String name = rs.getString("name"); ... return new Employee(...); } );
  • 18. (C) CASAREAL, Inc. All rights reserved. #jsug query()におけるRowMapperのイメージ ▸ 各⾏ごとにmapRow()が実⾏される 18 id name salary 101 Alice $3000 102 Bob $3500 103 Chris $2500 mapRow() mapRow() mapRow() Employee Employee Employee
  • 19. (C) CASAREAL, Inc. All rights reserved. #jsug BeanPropertyRowMapperクラス ▸ 列名とプロパティ名が同じものは⾃動詰め替えしてくれる ▸ スネークケース(department_id)
 ↔ キャメルケース(departmentId) の変換対応 ▸ Date and Time APIも対応 19 List<Employee> employeeList = jdbcTemplate.query(SQL_SELECT_ALL, BeanPropertyRowMapper.newInstance(Employee.class));
  • 20. (C) CASAREAL, Inc. All rights reserved. #jsug JDBCができることは何でもできる ▸ 集計 ▸ long count = getForObject(
 "SELECT COUNT(*) ...", Long.class) ▸ バッチ更新 ▸ batchUpdate() ▸ 1:Nリレーションを持つクラスへの変換 ▸ ResultSetExtractor 20
  • 21. (C) CASAREAL, Inc. All rights reserved. #jsug 派⽣種:Bootiful SQL Template ▸ @cero_tさん作 (Java Champon!) ▸ Spring JDBCに、SQLマッパー型のような外部SQLファイル機能を追加 21https://github.com/cero-t/sqltemplate
  • 22. (C) CASAREAL, Inc. All rights reserved. #jsug まとめ:Spring JDBC ▸ メリット ▸ ボイラープレートコードを削減できる ▸ 使い⽅が簡単 ▸ BeanPropertyRowMapperなど意外と便利 ▸ デメリット ▸ SQLは変わらずベタ書きする ▸ RowMapperの記述は⼿間がかかる 22
  • 23. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 23
  • 24. (C) CASAREAL, Inc. All rights reserved. #jsug Type 2. SQLマッパー型 ▸ SQLとクラスの詰替えに特化 ▸ SQLは別途テキストファイルに書くことが多い ▸ 例 ▸ MyBatis ←今回は主にコレを紹介 ▸ Doma ←コレも少し紹介 ▸ Mirage SQL、Jdbi、 24
  • 25. (C) CASAREAL, Inc. All rights reserved. #jsug MyBatis ▸ SQLをXMLに記述する ▸ 公式ドキュメントが多⾔語化されている ▸ 英語・⽇本語・スペイン語・ハングル語・中国語 ▸ Apacheプロジェクトの頃は「iBatis」だった ▸ Apacheからの独⽴時に「MyBatis」になった ▸ iBatis時代からの経験者も多い? 25
  • 26. (C) CASAREAL, Inc. All rights reserved. #jsug SQLを書くMapper XML 26 <mapper namespace="com.example.mapper.EmployeeMapper"> <select id="findById" resultType="Employee"> SELECT e.id AS id, e.name AS name, e.salary AS salary, e.joined_date AS joined_date, d.id AS department_id, d.name AS department_name FROM employee e JOIN department d ON e.department_id = d.id WHERE e.id = #{id} </select> </mapper>
  • 27. (C) CASAREAL, Inc. All rights reserved. #jsug 検索の実⾏ 27 public interface EmployeeMapper { public Employee findById(Integer id); } EmployeeMapper employeeMapper = ...; Employee employee = employeeMapper.findById(1); Mapper XMLと1対1の インタフェース
  • 28. (C) CASAREAL, Inc. All rights reserved. #jsug 条件分岐 28 <update id="update"> UPDATE employee e SET e.name = #{name} <if test="salary != null"> , e.salary = #{salary} </if> WHERE e.id = #{id} </update> public interface EmployeeMapper { public void update(String name, BigDecimal salary, Integer id); }
  • 29. (C) CASAREAL, Inc. All rights reserved. #jsug 不等号対策① ▸ CDATAセクションにする 29 <select id="findBySalaryUnder" resultType="Employee"> <![CDATA[ SELECT e.id AS id, e.name AS name, e.joined_date AS joined_date, e.salary AS salary, d.id AS department_id, d.name AS department_name FROM employee e JOIN department d ON e.department_id = d.id WHERE e.salary < #{salary} ORDER BY e.id ]]> </select> CDATAセクションにする
  • 30. (C) CASAREAL, Inc. All rights reserved. #jsug 不等号対策② ▸ CDATAセクションにする 30 <select id="findBySalaryUnder" resultType="Employee"> SELECT e.id AS id, e.name AS name, e.joined_date AS joined_date, e.salary AS salary, d.id AS department_id, d.name AS department_name FROM employee e JOIN department d ON e.department_id = d.id WHERE e.salary &lt; #{salary} ORDER BY e.id </select> エスケープする
  • 31. (C) CASAREAL, Inc. All rights reserved. #jsug <if>タグと不等号が混じったSQLを書くと ▸ <if>とCDATAの舞い踊り😱 31
  • 32. (C) CASAREAL, Inc. All rights reserved. #jsug まとめ:MyBatis ▸ メリット ▸ SQLが⾃由に記述できる ▸ デメリット ▸ XML内なので不等号の扱いが⾯倒 32
  • 33. (C) CASAREAL, Inc. All rights reserved. #jsug Doma ▸ 2-way SQLが書ける ▸ SQL単体でも実⾏可能(後述) ▸ ドキュメントやメッセージが⽇本語
 → 英語化が進⾏中 ▸ ⽇本語版ドキュメントは過去バージョンへ 33 ※URLに「/en」と⼊っていますが、2.20.0までは全て⽇本語です。
  2.21.0以降は段階的に英語化されています。
  • 34. (C) CASAREAL, Inc. All rights reserved. #jsug 2-way SQL 34 SELECT e.id AS id, e.name AS name, e.salary AS salary, e.joined_date AS joined_date, e.department_id AS department_id, d.name AS department_name FROM employee e JOIN department d ON e.department_id = d.id WHERE e.id = /*id*/101 パラメーターや条件分岐は コメントで書く コメント直後の値は Domaに無視される ▸ SQL単体でも、プログラムからでも実⾏可能
  • 35. (C) CASAREAL, Inc. All rights reserved. #jsug まとめ:Doma ▸ メリット ▸ 2-way SQL! ▸ デメリット ▸ アノテーションプロセッサーが他ライブラリのものと
 競合する可能性 ▸ ほぼ個⼈のプロジェクト 35 ぜひ開発に 参加しましょう!
  • 36. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 36
  • 37. (C) CASAREAL, Inc. All rights reserved. #jsug Type 3. クエリビルダー型 ▸ SQLをクラスやメソッドで記述する ▸ 記述を間違えるとコンパイルエラーになる ▸ これらのクラスは⾃動⽣成することが多い ▸ 例 ▸ jOOQ ← 今回はコレを主に紹介 ▸ DBFlute ←コレも少し紹介 ▸ その他にもいろいろ(Reladomo、Querydsl、Ebean、Speedment、 Jinq、requery、Cayenne、Torque) 37
  • 38. (C) CASAREAL, Inc. All rights reserved. #jsug 先にお詫び ▸ このタイプは個⼈的に利⽤経験があまりなく、
 内容薄めです ▸ 不正確な部分があればお知らせください 38 🙇
  • 39. (C) CASAREAL, Inc. All rights reserved. #jsug jOOQ ▸ スイスのData Geekery GmbH社が開発 ▸ 無償版・有償版などプランがいろいろある 39
  • 40. (C) CASAREAL, Inc. All rights reserved. #jsug 検索の例 40 create.select(EMPLOYEE.ID, EMPLOYEE.NAME) .from(EMPLOYEE) .orderBy(EMPLOYEE.ID.asc()) .fetch();
  • 41. (C) CASAREAL, Inc. All rights reserved. #jsug まとめ:jOOQ ▸ メリット ▸ SQLタイプミスの⼼配がない! ▸ デメリット ▸ 複雑なSQLを完全に再現できるのか? ▸ いざとなったら⽂字列でSQLを書けるクエリビルダー型ORマッパー もあるっぽい ▸ やや記述は冗⻑な気がする 41
  • 42. (C) CASAREAL, Inc. All rights reserved. #jsug 変わり種:DBFlute ▸ @jfluteさん作 ▸ タイプセーフ記述 + 2-waySQL ▸ ドキュメント⽣成機能が充実 ▸ DBスキーマからDB定義書(HTML)を⽣成 ▸ 旧DBスキーマとの差分からDB変更履歴書(HTML)を ⽣成 42 http://dbflute.seasar.org
  • 43. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 43
  • 44. (C) CASAREAL, Inc. All rights reserved. #jsug JPA ▸ Java EEで標準化されたデータアクセスの仕様 ▸ もともとはHibernateをモデルとしている ▸ JPA仕様に準拠したORマッパーの例 ▸ EclipseLink ▸ Hibernate 44
  • 45. (C) CASAREAL, Inc. All rights reserved. #jsug 基本的なCRUD処理 45 // 主キー検索。SELECT⽂は⾃動発⾏される Employee employee = entityManager.find(Employee.class, 1); // 追加。INSERT⽂は⾃動発⾏される entityManager.persist(new Employee(...)); // 更新。コミット時にUPDATE⽂が⾃動発⾏される Employee employee = entityManager.find(Employee.class, 1); employee.setName("Other Name"); // 削除。DELETE⽂が⾃動発⾏される Employee employee = entityManager.find(Employee.class, 1); entityManager.remove(employee);
  • 46. (C) CASAREAL, Inc. All rights reserved. #jsug JPQLによる検索 ▸ SQLに似ているが微妙に⽂法は違う ▸ 集合演算が出来ない、副問合せに制限あり、
 3つ以上のテーブルの結合に難あり、… 46 // 主キー検索 String jpql = "SELECT e FROM Employee e" + " WHERE e.name LIKE :name"; List<Employee> employeeList = entityManager.createQuery(jpql, Employee.class) .setParameter("name", "%a%") .getResultList();
  • 47. (C) CASAREAL, Inc. All rights reserved. #jsug [超重要] エンティティの状態 47 永続化コンテキスト MANAGED 状態 REMOVED 状態 NEW 状態 DETACHED 状態 persist() detach()
 clear() merge() remove() flush() flush() refresh() find()
 JPQL detach()
 clear()
  • 48. (C) CASAREAL, Inc. All rights reserved. #jsug 実装依存な挙動 ▸ EclipseLinkとHibernateでは、
 同じコードでも挙動が違う部分が多々 ▸ Hibernateの情報は、EclipseLinkで役に⽴たない
 ことがある😱 48
  • 49. (C) CASAREAL, Inc. All rights reserved. #jsug N+1問題 ▸ 注⽂:明細などの1:Nリレーションが
 ある場合に発⽣しうるパフォーマンス問題 ▸ 注⽂の検索(1回)+ 各注⽂に紐づく明細(N回)
 のSELECT⽂が発⾏される ▸ 対策はあるが(JOIN FETCH⽂)、
 3つ以上のテーブル結合にはテクニックが必要 49 遅延読み込みが ⼤きな原因の1つ
  • 50. (C) CASAREAL, Inc. All rights reserved. #jsug ネイティブSQLの扱いにも難あり ▸ 複数の⽅法があるが、制限がある or 記述が⾯倒 50 @Entity @SqlResultSetMapping( name = "product_id_name", classes = { @ConstructorResult(targetClass = ProductDto.class, columns = { @ColumnResult(name = "id"), @ColumnResult(name = "name") } ) } ) public class Product { … } アノテーションの中に アノテーションの中に アノテーション
  • 51. (C) CASAREAL, Inc. All rights reserved. #jsug 学習コストは⾼い ▸ JPA仕様書はA4で600ページ以上 ▸ もちろん全て英語 ▸ 書籍「パーフェクトJava EE」でも
 相当のページ数を割いている ▸ 多⽥の過去スライドは50分枠で120枚 ▸ 削る前は160枚(それでも控えめにしてた) 51
  • 52. (C) CASAREAL, Inc. All rights reserved. #jsug [アンケート] なぜJPAを選びましたか? 52 その他 10% ベンダーサポート があるから 40% 標準技術だから 50% ※個⼈の感覚値です きちんとした技術検証なしに 選ばれているように感じる (個⼈の意⾒)
  • 53. (C) CASAREAL, Inc. All rights reserved. #jsug JPAを使ってもいい条件 53 ① DBを新規に設計できる ② 集合演算やFROM句での副問合せなど、
 複雑なSQLは要件的に少ない ③ 「パーフェクトJava EE」を読破した⼈が
 プロジェクトに1⼈以上いる 1つでも当てはまらない項⽬があれば、 他のORマッパーを使った⽅がいいかも😅 ※「向いている」とは⾔ってない
  • 54. (C) CASAREAL, Inc. All rights reserved. #jsug まとめ:JPA ▸ 難易度が⾼いため、なるべく避けたほうが懸命 ▸ 使うなら必死に勉強を 54
  • 55. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 55
  • 56. (C) CASAREAL, Inc. All rights reserved. #jsug Spring Data ▸ 多くのデータアクセス技術を抽象化して、
 共通のインタフェースを提供 56 Spring Data Spring Data JPA Spring Data Redis Spring Data MongoDB ・・・
  • 57. (C) CASAREAL, Inc. All rights reserved. #jsug CrudRepositoryインタフェース ▸ 基本的なCRUDメソッドを持つ ▸ これを継承したインタフェースを作成するだけ ▸ 実装クラスやそのインスタンスはSpringが実⾏時に作成 57 public interface EmployeeRepository extends CrudRepository<Employee, Integer> { // 空でOK。メソッドの追加も可能 }
  • 58. (C) CASAREAL, Inc. All rights reserved. #jsug エンティティクラス ▸ それぞれ付加するアノテーションが異なるが、
 それ以外はほぼ同じ 58 // JPA @Entity public class Employee { ... } // Spring Data Redis @RedisHash("employee") public class Employee { ... } データストアが違っても同じように アクセスできるのは本当にありがたい!
  • 59. (C) CASAREAL, Inc. All rights reserved. #jsug RDB向けはSpring Data JPAのみ ▸ 「Spring Dataを使いたいから」というだけで
 Spring Data JPAを使っている事も多いのでは? ▸ しかしJPAであることには変わりない ▸ JPAの複雑さを分かった上で採⽤してます? 59
  • 60. (C) CASAREAL, Inc. All rights reserved. #jsug [告知] このあと! ▸ しんどーさんによる
 Spring Data JDBCのセッションがあります ▸ Spring JDBCのSpring Data! ▸ JPAの複雑さなしでSpring Dataを使えるので期待 60
  • 61. (C) CASAREAL, Inc. All rights reserved. #jsug ⽬次 ① ORマッパーとその分類 ② Type 1. JDBCラッパー型 ③ Type 2. SQLマッパー型 ④ Type 3. クエリビルダー型 ⑤ Type 4. ORマッパー型 ⑥ Extra. Spring Data ⑦ まとめ 61
  • 62. (C) CASAREAL, Inc. All rights reserved. #jsug 正直、どれも⼀⻑⼀短あり。 62 ⭕ 2-way SQLが書ける ❌ アノテーションプロセッサー ⭕ SQLが書ける ❌ XMLにSQLを書く ⭕ 簡単 ❌ やや冗⻑、SQLベタ書き ⭕ タイプセーフ ❌ やや冗⻑ ⭕ ⾼機能 ❌ 複雑、SQLの扱いに難 享受するメリット・許容できるデメリットと、 プロジェクトの状況を鑑みて選定するしかない
  • 63. (C) CASAREAL, Inc. All rights reserved. #jsug ORマッパー選定フロー ※個⼈の意⾒です 63 どうしても
 JPAを使わなければならない
 事情がある ORマッパー型 タイプセーフに
 SQLを記述したい クエリ ビルダー型 SQL マッパー型 JDBC ラッパー型 SQLを外部ファイルに
 書きたい Yes No No No Yes Yes
  • 64. (C) CASAREAL, Inc. All rights reserved. #jsug 最後に伝えたいこと(建前) ▸ 「標準だから」だけの理由でJPAを選ばない🙅 ▸ もしJPAを使うなら必死で勉強してください ▸ 選択肢が多くあることを知り、
 プロジェクトに合わせて適切に選びましょう! ▸ ORマッパー名は挙げたので、
 気になったものをググってください 64
  • 65. (C) CASAREAL, Inc. All rights reserved. #jsug 最後に伝えたいこと(※個⼈の(ry) ▸ とにかく安牌ならSpring JDBC or MyBatis ▸ Doma、DBFlute、クエリビルダー型は、
 それらの知識がある⼈がいれば、良い選択と思います ▸ JPAを「積極的に採⽤したい」シチュエーションは、 特に思い浮かびません ▸ 個⼈プロジェクトが⼼配なら、
 ⾃社からコミッターを出しましょう 65
  • 66. (C) CASAREAL, Inc. All rights reserved. #jsug Enjoy Data Access!! ▸ ご清聴ありがとうございました! 66