Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
2 0 1 7 - 0 7 - 0 8 O / R マ ッ パ ー 勉 強 会 I N 大 都 会
中 村 壮 一 ( @ K U N S T 1 0 8 0 )
Ebeanのご紹介
1
大阪の方から来ました。
大都会の皆様、はじめまして。
2
自己紹介
 名前: 中村壮一 = くんすと (@kunst1080)
 普段は #シェル芸 界隈の住人
3
4
自己紹介
 名前: 中村壮一 = くんすと (@kunst1080)
 普段は #シェル芸 界隈の住人
 仕事: 受託で小規模なWEBサービスを作ってます
 2014年~
 Java + Playframework
 一次開発はほぼ...
6
目次
 今日伝えたいこと 1分くらい
 Ebeanの概要 4分くらい
 Ebeanの特徴 5分くらい
 実際に使ってみてのレポート 7分くらい
7
今日、伝えたいこと
8
今日 伝えたいこと
 知らない方も結構いらっしゃるかと思いますが
「Ebean」という、シンプルなORMがあります。
 結構使いやすいので、検討の選択肢に入れてみてはい
かがでしょう?
 (下心: ユーザーが増えて情報が増えてほしい)
9
(特に日本語の)情報が少なすぎる……
※英語の情報はそこそこあります
10
Ebeanの概要
11
Ebeanの概要
 公式サイト: http://ebean-orm.github.io/
 Javaで書かれた、早くてシンプルなORM
 JPAやJDOよりシンプルで理解しやすいように設計され
ています(by Wikipedia)
 私...
13
Ebeanの概要
 対応しているフレームワークなど
 Play Framework
 昔からサポート
 生Java
 ライブラリを作る時に使用しました
 GuiceでのDIによる導入、Springもサポートされている模様
 未検証...
Ebeanの概要
 Play FrameworkのJavaの方ではデフォルトのORMとし
て採用されています。
 (2.3まではPlay Frameworkに同梱されていました)
 https://www.playframework.co...
16
Ebeanの特徴
17
Ebeanの特徴
 ①設定がシンプル
 ②Active Recordパターン
 ③セッションレス
 ④外部SQLも扱える(普通のSQL文をそのまま使える)
18
Ebeanの特徴 – ①設定がシンプル
 プレーンなJavaプロジェクトの場合、
resources ディレクトリに
「ebean.properties」ファイルを置きます。
 (テスト用の設定は「 test-ebean.propertie...
Ebeanの特徴 – ①設定がシンプル
 Play Frameworkで使う場合、
conf/application.conf に
以下のような記述を追加します。
db.default.username=“sa”
db.default.pas...
Ebeanの特徴 – ①設定がシンプル
 基本機能だけを使う場合、設定はこれだけです。
 設定用のXMLを書いたりJavaクラスを書いたりは不要。
21
Ebeanの特徴 – ②Active Recordパターン
 Ruby on RailsのActive Recordのような書き方で
DBアクセスできます。
 1つのインスタンスがDBの1レコードに対応する
22
Ebeanの特徴 – ②Active Recordパターン
 例えば、こんなModelクラスがあった場合……
@Entity
@Table(name = "user")
public class User extends Model {
pu...
Ebeanの特徴 – ②Active Recordパターン
 CRUDはこんな感じでとてもシンプルです。
// Create
User user = new User();
user.name = “hogehoge”;
user.save(...
Ebeanの特徴 – ②Active Recordパターン
 CRUDはこんな感じでとてもシンプルです。
// Update
User user = new User();
user.id = 1L;
user.update():
// De...
Ebeanの特徴 – ③セッションレス
 Ebeanにはセッションがありません
 ※トランザクションはあります
 単純に、IDの情報でデータを操作します。
 このように、検索しなくても登録が可能です。
 公式サイトには、REST向きの...
Ebeanの特徴 – ④外部SQLも扱える
 SQL文の文字列を渡して検索することもできます。
 そのままでは使いにくいのでライブラリ化しました(後述)
String sql = "select id, name, birth_day fr...
実際に使ってみてのレポート
28
実際に使ってみてのレポート
 ①拡張したこと
 ②複数DBへの接続
 ③使うときの注意点
29
実際に使ってみてのレポート - ①拡張したこと
 テキストファイルを読み込むライブラリの作成
「ebean-query-text」
 https://github.com/nkmrs/ebean-query-text
 conf/quer...
実際に使ってみてのレポート - ①拡張したこと
 テキストファイルを読み込むライブラリの作成
「ebean-query-text」
 https://github.com/nkmrs/ebean-query-text
 conf/quer...
実際に使ってみてのレポート - ①拡張したこと
 FinderのDecoratorを作成
 byIdの結果をOptionalにする
 各種検索処理をmix-inできるようにする
 https://github.com/kunst1080...
/**
* Finderの拡張
*/
public class FindDecorator<ID, TABLE extends BaseTable>
implements Where<TABLE> {
private Model.Finder<...
public interface Where<TABLE> {
ExpressionList<TABLE> where();
}
public interface Fuzzy<TABLE> extends Where<TABLE> {
defa...
実際に使ってみてのレポート - ①拡張したこと
 FinderのDecoratorを作成
 byIdの結果をOptionalにする
 各種検索処理をmix-inできるようにする
// 拡張したFinderのサブクラスを自分用に作成
// ...
実際に使ってみてのレポート - ②複数DBへの接続
 こんな感じに定義してあげると複数DBへ接続できました
 設定ファイル
# デフォルトのDB
db.default.username=“sa”
db.default.password=“h...
実際に使ってみてのレポート - ②複数DBへの接続
 こんな感じに定義してあげると複数DBへ接続できました
 検索処理
// 以下の書き方で、指定した設定のEbeanServerを取得できます
Ebean.getServer(サーバ名)
/...
実際に使ってみてのレポート - ③使うときの注意点
 情報がほとんど英語
 → 勉強するいい機会! だんだん慣れてきます!
 (自分も情報発信していきますね……)
 SQL文を渡す時、トークンの数が増えてくるとパースに失
敗する
 C...
その他、今後検証してみたいこと
 Type safe queies
 こんな風に書けるそうです。安全そう。
 Springとかでの利用
List<Customer> customers =
new QCustomer()
.id.grea...
以上です!
 今日伝えたいこと 2分くらい
 Ebeanの概要 4分くらい
 Ebeanの特徴 4分くらい
 実際に使ってみてのレポート 10分くらい
40
Upcoming SlideShare
Loading in …5
×

20170708 Ebeanのご紹介(O/Rマッパー勉強会 in 大都会)

2,468 views

Published on

シンプルなORM「Ebean」のご紹介

Published in: Technology
  • Be the first to comment

  • Be the first to like this

20170708 Ebeanのご紹介(O/Rマッパー勉強会 in 大都会)

  1. 1. 2 0 1 7 - 0 7 - 0 8 O / R マ ッ パ ー 勉 強 会 I N 大 都 会 中 村 壮 一 ( @ K U N S T 1 0 8 0 ) Ebeanのご紹介 1
  2. 2. 大阪の方から来ました。 大都会の皆様、はじめまして。 2
  3. 3. 自己紹介  名前: 中村壮一 = くんすと (@kunst1080)  普段は #シェル芸 界隈の住人 3
  4. 4. 4
  5. 5. 自己紹介  名前: 中村壮一 = くんすと (@kunst1080)  普段は #シェル芸 界隈の住人  仕事: 受託で小規模なWEBサービスを作ってます  2014年~  Java + Playframework  一次開発はほぼ一人で、最近は若手2人と一緒に保守してます  Ebeanに関しては、ただのユーザーです。 5
  6. 6. 6
  7. 7. 目次  今日伝えたいこと 1分くらい  Ebeanの概要 4分くらい  Ebeanの特徴 5分くらい  実際に使ってみてのレポート 7分くらい 7
  8. 8. 今日、伝えたいこと 8
  9. 9. 今日 伝えたいこと  知らない方も結構いらっしゃるかと思いますが 「Ebean」という、シンプルなORMがあります。  結構使いやすいので、検討の選択肢に入れてみてはい かがでしょう?  (下心: ユーザーが増えて情報が増えてほしい) 9
  10. 10. (特に日本語の)情報が少なすぎる…… ※英語の情報はそこそこあります 10
  11. 11. Ebeanの概要 11
  12. 12. Ebeanの概要  公式サイト: http://ebean-orm.github.io/  Javaで書かれた、早くてシンプルなORM  JPAやJDOよりシンプルで理解しやすいように設計され ています(by Wikipedia)  私の感覚では、慣れてしまうと、他のORMが面倒臭すぎ て使う気が起きないくらいシンプル。 12
  13. 13. 13
  14. 14. Ebeanの概要  対応しているフレームワークなど  Play Framework  昔からサポート  生Java  ライブラリを作る時に使用しました  GuiceでのDIによる導入、Springもサポートされている模様  未検証 14
  15. 15. Ebeanの概要  Play FrameworkのJavaの方ではデフォルトのORMとし て採用されています。  (2.3まではPlay Frameworkに同梱されていました)  https://www.playframework.com/documentation/2. 6.x/JavaEbean 15
  16. 16. 16
  17. 17. Ebeanの特徴 17
  18. 18. Ebeanの特徴  ①設定がシンプル  ②Active Recordパターン  ③セッションレス  ④外部SQLも扱える(普通のSQL文をそのまま使える) 18
  19. 19. Ebeanの特徴 – ①設定がシンプル  プレーンなJavaプロジェクトの場合、 resources ディレクトリに 「ebean.properties」ファイルを置きます。  (テスト用の設定は「 test-ebean.properties 」) datasource.default=db datasource.db.username=sa datasource.db.password=hogehoge datasource.db.databaseUrl=jdbc:h2:mem:tests datasource.db.databaseDriver=org.h2.Driver # ebean.default=“models.*“ ← ここはお好みで # ebean.default=“ models.*, tables.*" 19
  20. 20. Ebeanの特徴 – ①設定がシンプル  Play Frameworkで使う場合、 conf/application.conf に 以下のような記述を追加します。 db.default.username=“sa” db.default.password=“hogehoge” db.default.url=“jdbc:h2:mem:tests” db.default.driver=“org.h2.Driver” # ebean.default=“models.*” ← ここはお好みで # ebean.default=“models.*, tables.*” 20
  21. 21. Ebeanの特徴 – ①設定がシンプル  基本機能だけを使う場合、設定はこれだけです。  設定用のXMLを書いたりJavaクラスを書いたりは不要。 21
  22. 22. Ebeanの特徴 – ②Active Recordパターン  Ruby on RailsのActive Recordのような書き方で DBアクセスできます。  1つのインスタンスがDBの1レコードに対応する 22
  23. 23. Ebeanの特徴 – ②Active Recordパターン  例えば、こんなModelクラスがあった場合…… @Entity @Table(name = "user") public class User extends Model { public static Model.Finder<Long, User> finder = new Model.Finder<>(User.class); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; @Constraints.Required public String name; public Date birthDay; } 23
  24. 24. Ebeanの特徴 – ②Active Recordパターン  CRUDはこんな感じでとてもシンプルです。 // Create User user = new User(); user.name = “hogehoge”; user.save(): // Read User user = User.find.byId(1L); List<User> list = User.find.where() .eq(“name”, “hogehoge”) .findList(); 24
  25. 25. Ebeanの特徴 – ②Active Recordパターン  CRUDはこんな感じでとてもシンプルです。 // Update User user = new User(); user.id = 1L; user.update(): // Delete User user = new User(); user.id = 1L; user.delete(); 25
  26. 26. Ebeanの特徴 – ③セッションレス  Ebeanにはセッションがありません  ※トランザクションはあります  単純に、IDの情報でデータを操作します。  このように、検索しなくても登録が可能です。  公式サイトには、REST向きの仕様だと書いてありました。 // Update User user = new User(); user.id = 1L; user.update(): // Delete User user = new User(); user.id = 1L; user.delete(); 26
  27. 27. Ebeanの特徴 – ④外部SQLも扱える  SQL文の文字列を渡して検索することもできます。  そのままでは使いにくいのでライブラリ化しました(後述) String sql = "select id, name, birth_day from user"; List<User> list2 = Ebean.find(User.class) .setRawSql(RawSqlBuilder.parse(sql).create()) .findList(); 27
  28. 28. 実際に使ってみてのレポート 28
  29. 29. 実際に使ってみてのレポート  ①拡張したこと  ②複数DBへの接続  ③使うときの注意点 29
  30. 30. 実際に使ってみてのレポート - ①拡張したこと  テキストファイルを読み込むライブラリの作成 「ebean-query-text」  https://github.com/nkmrs/ebean-query-text  conf/queries/ 以下に置いたSQL文を利用できる ● conf/queries/sample.sql select t1.id, t1.name, t2.age from user_name t1, user_age t2 where t1.id = t2.id 30
  31. 31. 実際に使ってみてのレポート - ①拡張したこと  テキストファイルを読み込むライブラリの作成 「ebean-query-text」  https://github.com/nkmrs/ebean-query-text  conf/queries/ 以下に置いたSQL文を利用できる Query<Example1> q = QueryText.getDefault() .getQuery("example1", Example1.class); List<Example1> list = q.findList(); 31
  32. 32. 実際に使ってみてのレポート - ①拡張したこと  FinderのDecoratorを作成  byIdの結果をOptionalにする  各種検索処理をmix-inできるようにする  https://github.com/kunst1080/play-java8- sample/blob/master/app/tables/FindDecorator.java 32
  33. 33. /** * Finderの拡張 */ public class FindDecorator<ID, TABLE extends BaseTable> implements Where<TABLE> { private Model.Finder<ID, TABLE> finder = new Model.Finder<>(getTableClass()); @SuppressWarnings("unchecked") private Class<TABLE> getTableClass() { return (Class<TABLE>) ClassUtil.getSecondArgumentType(getClass()); } @Override public ExpressionList<TABLE> where() { return finder.where(); } public Optional<TABLE> byId(ID id) { return Optional.ofNullable(finder.byId(id)); } } 33
  34. 34. public interface Where<TABLE> { ExpressionList<TABLE> where(); } public interface Fuzzy<TABLE> extends Where<TABLE> { default List<TABLE> fuzzy(String value, String... columnNames) { ExpressionList<TABLE> ex = where(); for (String c : columnNames) { ex = ex.like(c, "%" + value + "%"); } return ex.findList(); } } public interface All<TABLE> extends Where<TABLE> { default List<TABLE> all() { return where().findList(); } } 34
  35. 35. 実際に使ってみてのレポート - ①拡張したこと  FinderのDecoratorを作成  byIdの結果をOptionalにする  各種検索処理をmix-inできるようにする // 拡張したFinderのサブクラスを自分用に作成 // 使いたい検索処理をimplementsする public static class Find extends FindDecorator<Long, T_User> implements All<T_User>, Fuzzy<T_User> {} public static Find find = new Find(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; 35
  36. 36. 実際に使ってみてのレポート - ②複数DBへの接続  こんな感じに定義してあげると複数DBへ接続できました  設定ファイル # デフォルトのDB db.default.username=“sa” db.default.password=“hogehoge” db.default.url=“jdbc:h2:mem:app” db.default.driver=“org.h2.Driver” # 2つめのDB db.another.username=“sa” db.another.password=“hogehoge” db.another.url=“jdbc:h2:mem:another” db.another.driver=“org.h2.Driver” ebean.another = "models.*" 36
  37. 37. 実際に使ってみてのレポート - ②複数DBへの接続  こんな感じに定義してあげると複数DBへ接続できました  検索処理 // 以下の書き方で、指定した設定のEbeanServerを取得できます Ebean.getServer(サーバ名) // ebean-query-textを使う場合 QueryText.get(“default”).getQuery(“example", User.class) .findList(); QueryText.get(“another”).getQuery(“example", User.class) .findList(); 37
  38. 38. 実際に使ってみてのレポート - ③使うときの注意点  情報がほとんど英語  → 勉強するいい機会! だんだん慣れてきます!  (自分も情報発信していきますね……)  SQL文を渡す時、トークンの数が増えてくるとパースに失 敗する  CAST とか CASE とかを使うとうまくいかない  → DBは検索だけにして、演算はJavaでやる 38
  39. 39. その他、今後検証してみたいこと  Type safe queies  こんな風に書けるそうです。安全そう。  Springとかでの利用 List<Customer> customers = new QCustomer() .id.greaterThan(12) .name.startsWith("Rob") .findList(); 39
  40. 40. 以上です!  今日伝えたいこと 2分くらい  Ebeanの概要 4分くらい  Ebeanの特徴 4分くらい  実際に使ってみてのレポート 10分くらい 40

×