Java O/Rマッパーの種類と選定方法について調べたことのメモ

#O/Rマッパーとは#
「O/Rマッパー」って名前、なんか小学生の必殺技的な響きしてますよね。
最近業務で色々なO/Rマッパーに触れる機会があったので、ついでに調べたことをざっくりまとめました。

O/Rマッピングとは、オブジェクト指向プログラミング言語におけるオブジェクトとリレーショナルデータベース（RDB）の間でデータ形式の相互変換を行うこと。
[IT用語辞典 -O/Rマッパーとは](https://e-words.jp/w/O-R%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html#:~:text=O%2FR%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF,O%2FR%20mapper%EF%BC%89%E3%81%A8%E3%81%84%E3%81%86%E3%80%82)

簡単に言うとJavaなどのプログラミング言語とRDBの橋渡しをしてくれるものです。

もっと詳しく知りたい方
[オブジェクト関係マッピング](https://qiita.com/yk-nakamura/items/acd071f16cda844579b9)
[O/Rマッピングの役割とメリット](https://www.atmarkit.co.jp/ait/articles/0404/13/news075.html)

#先に結論#
それぞれメリット・デメリットがあるため、どのO/Rマッパーが良いかはプロジェクト次第。
色々調べるよりまずはこれ読んでください。[Java ORマッパー選定のポイント](https://www.slideshare.net/masatoshitada7/java-or-jsug)

#O/Rマッパーの分類#
要約するとこんな感じ。
JDBCラッパー型　　　初心者にとって理解しやすい。冗長的になりやすい。
SQLマッパー型　　　　　↑
クエリビルダー型　　　　↓
O／Rマッパー型　　　学習コストがかかる。自由度が高いが運用の難易度も極めて高い。
下記は代表的なO/Rマッパーをリストアップしました。

+ JDBCラッパー型 
 + Spring JDBC
 + DbOom
 + Apache Commons DbUtils
 + sql2o
+ SQLマッパー型
 + MyBatis
 + DOMA
 + Migrate SQL
 + jdbi
+ クエリビルダー型
 + jOOQ
 + DBFlute
 + Reladomo
 + Querydsi
 + Ebean
 + Speedment
 + Jinq
 + requery
 + Cayenne
 + Torque
+ O/Rマッパー型
 + JPA
 + EclipseLink
 + Hibernate

#各O/Rマッパーの特徴#
###Spring JDBC###
Spring Framework内で使用できるJDBCラッパー。
⭕️　Connection、PreparedStatementを開発者が意識しなくて良い。
⭕️　ResultSetから詰め替えるところを記述するだけで良い。
⭕️　Java EE環境など他の環境でも使える。
⭕️　初心者がプログラミング言語とRDBとの繋がりを理解しやすい。
❌　SQL部分をクラスファイルにベタ書きするため、同じようなデータを取得する際に使いまわすことができない。やや冗長。メンテナンス性が悪い。
❌　Javaのクラスファイルにベタ書きするため、コーディング中に文法等のエラーを検知しない。そのため、実行して初めて気づくことが多い。

###iciql###
JDBCのライブラリ集の一つ。
⭕️　単一のjarファイルで提供されている
⭕️　設定ファイル無しで使用可能（xmlで設定する必要なし）
⭕️　JDBCの記述を簡素化することができる。
❌　自動生成されるSQLの日付関連の処理に課題があるらしい？
[[Java]iciqlで簡単DBアクセス[ORマッパー]](https://dev.classmethod.jp/articles/iciql/)
[ICIQL導入をしてみる](https://qiita.com/nukomaru/items/8f04c6cb9f8352581b2a)
[O/Rマッパー iciqlについて](https://skill-up-engineering.com/2015/11/02/post-910/#i-3)

###DbOom###
JDBCのライブラリ集の一つ。
⭕️　単一のjarファイルで提供されている
⭕️　JDBCの記述を簡素化することができる。
❌　日本語の文献が少ない
[DbOom(公式)](https://jodd.org/db/)
以下下記サイトのコピペ[JavaのDBアクセスライブラリ比較](https://qiita.com/nisin/items/f818533d67f1f6f566f8#dboom-jodd)
> Joddは機能ごとに切出せて何かと使いやすそう。
実行されるSQLをパラメタ埋め込み状態で取得でき、デバッグに有利。
Modelをそのまま保存できるinsert()あり。updateにも補助スクリプトあり。
セッションとかの機能もついてるのはいいかも。
トランザクションは一通りのサポートあり。
Camel <-> snake 変換機能あり。
キャッシュもあるらしい。
初期設定は自分で細々積み上げる必要があるが、必要な道具は一通り揃ってる感じ。
余計なことしないのはいいけど、面倒かも。
JoddのJTXは他のライブラリ使うときも切り出して使えそう。

###Apache Commons DbUtils###
JDBCのライブラリ集の一つ。ライブラリ自体の記述量が少なく、高速に動かすことを目的としている。
⭕️　単一のjarファイルで提供されている
⭕️　JDBCの記述を簡素化することができる。
❌　あまり高度な機能はない。
[Apache Commons DbUtils(公式)](https://commons.apache.org/proper/commons-dbutils/)

###MyBatis###
SQLマッパー型。
SQLをXMLファイルに記述する。
⭕️　公式ドキュメントが超他言語対応しているため、オフショア開発や英語アレルギーの日本人にも優しい笑。（英語・日本語・中国語・スペイン語・・・）
⭕️　SQLの自由度が高い
❌　XMLのルールが面倒。不等号や条件分岐の記述の扱いをしっかり理解する必要がある。

###DOMA###
SQLマッパー型。
個人用のプロジェクトや複雑な処理がないシステムにピッタリのO/Rマッパー。エンティティ一つでCRUDできる処理が多い場合に用いられる。
⭕️　2WaySQL。
> 2WaySQLとは、簡単に言うと、SQLをそのまま貼り付けても実行できるし、アプリケーションでパラメータを可変にしても実行できるというSQLのことです。

引用元[【超初心者向け】MirageSQL超入門](https://qiita.com/tarosa0001/items/8b500ff605fe9246bd28#:~:text=2WaySQL%E3%81%A8%E3%81%AF%E3%80%81%E7%B0%A1%E5%8D%98%E3%81%AB,SQL%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
⭕️　DBの１つのエンティティに対してのDMLを自動で用意してくれる。
❌　テーブル結合を要するSQLの場合はカスタムクエリを作成する必要がある。
❌　一つのクラスファイルで二つのSQLを使用することはできない。一つ目のSQLだけしか実行されない。

###jOOQ###
クエリビルダー型。
⭕️　SQLが自動生成されるため、タイプミスの心配がない。
❌　複雑なSQLを表現するのに限界がありそう？

###JPA###
O/Rマッパー型。
JPAは「仕様」に過ぎないため、単体で使うのではなくeclipseLinkやHibernateで実装する必要がる。
JPAは高度なことができる分、学習コストが桁違い。安易に導入すべきではない？
やはりこのサイト、最強。。。
[Java ORマッパー選定のポイント(再掲)](https://www.slideshare.net/masatoshitada7/java-or-jsug)
> ①DBを新規に登録できる
② 集合演算やFROM句での副問合せなど、  複雑なSQLは要件的に少ない 
③ 「パーフェクトJava EE」を読破した⼈が  プロジェクトに1⼈以上いる
1つでも当てはまらない項⽬があれば、 他のORマッパーを使った⽅がいいかも

⭕️　ベンダーサポートがある。標準技術になっている。
❌　JPAの仕様書は英語で600ページ以上学習コストが高い！ムリ！ヨミタクナイ！

###eclipseLink###
O/Rマッパー型。
JPAを実装するために用いる。
フレームワーク内部の処理によってSQLを自動生成してくれる。
Hibernateとやりたいことは同じだが、生成されるSQLに微妙な違いがあったりする。

###Hibernate###
O/Rマッパー型。
JPAを実装するために用いる。
フレームワーク内部の処理によってSQLを自動生成してくれる。
eclipseLinkとやりたいことは同じだが、生成されるSQLに微妙な違いがあったりする。

###もっとマニアックなやつ（古いですが）###
[オープンソースJava O/Rマッピングソフト一覧（2014年1月版）](http://db2.jugem.cc/?eid=2598)

#O/Rマッパーの選定方法#
自分の手で書こうと思ったけど、やはりこの記事がとてもわかりやすかったので。もうこれみてください。てかここまで書いてきたけど最初からこの記事だけ見ればいいんじゃ、、、スライド62以降がもう答えなんじゃ(ry
[Java ORマッパー選定のポイント](https://www.slideshare.net/masatoshitada7/java-or-jsug)
#最後に#
間違った点があれば遠慮なくご指摘ください。また、補足等があればコメントくださると幸いです。

いや、むしろ補足してください。
てか、本件について詳しい人、自分に教えろください。
必殺・O/Rマッパー！！！

#参考文献#
[Java ORマッパー選定のポイント(再掲)](https://www.slideshare.net/masatoshitada7/java-or-jsug)
[オブジェクト関係マッピング](https://qiita.com/yk-nakamura/items/acd071f16cda844579b9)
[DOMA](http://doma.seasar.org/reference/sqlfile.html)
[DOMA バインド変数コメント](http://doma.seasar.org/reference/sqlfile.html#%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E5%A4%89%E6%95%B0%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88)
[mybatis](https://mybatis.org/mybatis-3/ja/index.html)
[DBFlute](http://dbflute.seasar.org/)
[外だしSQL(OutsideSql)について](http://dbflute.seasar.org/ja/manual/function/ormapper/outsidesql/about.html)
[jOOQ](https://www.jooq.org/)
[JavaのDBアクセスライブラリ比較](https://qiita.com/nisin/items/f818533d67f1f6f566f8)
[JPA、Hibernate、EclipseLinkの違い - Codeflow](https://www.codeflow.site/ja/article/jpa-hibernate-difference)
[JPAの基礎1（eclipseLinkについての記載有り）](https://qiita.com/amadablam/items/487e91c173a198cfe6be)
[【超初心者向け】MirageSQL超入門(再掲)](https://qiita.com/tarosa0001/items/8b500ff605fe9246bd28#:~:text=2WaySQL%E3%81%A8%E3%81%AF%E3%80%81%E7%B0%A1%E5%8D%98%E3%81%AB,SQL%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
[若手Javaエンジニア必見。知っておきたいフレームワーク・ツール23選](https://eh-career.com/engineerhub/entry/2017/07/14/110000)
[IT用語辞典 -O/Rマッパーとは（再掲）](https://e-words.jp/w/O-R%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html#:~:text=O%2FR%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF,O%2FR%20mapper%EF%BC%89%E3%81%A8%E3%81%84%E3%81%86%E3%80%82)
[[Java]iciqlで簡単DBアクセス[ORマッパー]](https://dev.classmethod.jp/articles/iciql/)
[ICIQL導入をしてみる](https://qiita.com/nukomaru/items/8f04c6cb9f8352581b2a)
[DbOom(公式)](https://jodd.org/db/)
[Apache Commons DbUtils(公式)](https://commons.apache.org/proper/commons-dbutils/)