狠狠撸

狠狠撸Share a Scribd company logo
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
? 一次開発はほぼ一人で、最近は若手2人と一緒に保守してます
? Ebeanに関しては、ただのユーザーです。
5
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)
? 私の感覚では、慣れてしまうと、他のORMが面倒臭すぎ
て使う気が起きないくらいシンプル。
12
13
Ebeanの概要
? 対応しているフレームワークなど
? Play Framework
? 昔からサポート
? 生Java
? ライブラリを作る時に使用しました
? GuiceでのDIによる導入、Springもサポートされている模様
? 未検証
14
Ebeanの概要
? Play FrameworkのJavaの方ではデフォルトのORMとし
て採用されています。
? (2.3まではPlay Frameworkに同梱されていました)
? https://www.playframework.com/documentation/2.
6.x/JavaEbean
15
16
Ebeanの特徴
17
Ebeanの特徴
? ①設定がシンプル
? ②Active Recordパターン
? ③セッションレス
? ④外部SQLも扱える(普通のSQL文をそのまま使える)
18
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
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
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 {
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
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
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
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
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
実際に使ってみてのレポート
? ①拡張したこと
? ②複数DBへの接続
? ③使うときの注意点
29
実際に使ってみてのレポート - ①拡張したこと
? テキストファイルを読み込むライブラリの作成
「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
実際に使ってみてのレポート - ①拡張したこと
? テキストファイルを読み込むライブラリの作成
「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
実際に使ってみてのレポート - ①拡張したこと
? FinderのDecoratorを作成
? byIdの結果をOptionalにする
? 各種検索処理をmix-inできるようにする
? https://github.com/kunst1080/play-java8-
sample/blob/master/app/tables/FindDecorator.java
32
/**
* 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
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
実際に使ってみてのレポート - ①拡張したこと
? 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
実際に使ってみてのレポート - ②複数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
実際に使ってみてのレポート - ②複数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
実際に使ってみてのレポート - ③使うときの注意点
? 情報がほとんど英語
? → 勉強するいい機会! だんだん慣れてきます!
? (自分も情報発信していきますね……)
? SQL文を渡す時、トークンの数が増えてくるとパースに失
敗する
? CAST とか CASE とかを使うとうまくいかない
? → DBは検索だけにして、演算はJavaでやる
38
その他、今後検証してみたいこと
? Type safe queies
? こんな風に書けるそうです。安全そう。
? Springとかでの利用
List<Customer> customers =
new QCustomer()
.id.greaterThan(12)
.name.startsWith("Rob")
.findList();
39
以上です!
? 今日伝えたいこと 2分くらい
? Ebeanの概要 4分くらい
? Ebeanの特徴 4分くらい
? 実際に使ってみてのレポート 10分くらい
40
Ad

Recommended

闯笔础のキャッシュを使ったアプリケーション高速化手法
闯笔础のキャッシュを使ったアプリケーション高速化手法
Chihiro Ito
?
システム监视のアラート大量発生を抑える窜补产产颈虫トリガー「依存関係」机能の绍介
システム监视のアラート大量発生を抑える窜补产产颈虫トリガー「依存関係」机能の绍介
Haruki Yamashita
?
ヘ?アフ?ロするなら驳颈迟-诲耻别迟を使おう
ヘ?アフ?ロするなら驳颈迟-诲耻别迟を使おう
Shinya Nakajima
?
确率的自己位置推定
确率的自己位置推定
Horiguchi Shuhei
?
データ分析基盘を支えるエンジニアリング
データ分析基盘を支えるエンジニアリング
Recruit Lifestyle Co., Ltd.
?
Map server入門 - FOSS4G 2012 Hokkaido
Map server入門 - FOSS4G 2012 Hokkaido
Hideo Harada
?
Travel & Leisure Platform Department's tech info
Travel & Leisure Platform Department's tech info
Rakuten Group, Inc.
?
Japanese 2022 Oct_Monthly Update_画像圧縮150.pdf
Japanese 2022 Oct_Monthly Update_画像圧縮150.pdf
Tsuguo Nobe
?
京都大学非公式パワーポイントテンプレート
京都大学非公式パワーポイントテンプレート
Yuku Takahashi
?
碍尝补产インターンシップ成果报告会
碍尝补产インターンシップ成果报告会
Hiroaki Murayama
?
叁大奥别产サーバーの厂厂尝设定ベストプラクティス
叁大奥别产サーバーの厂厂尝设定ベストプラクティス
Hidetoshi Musha
?
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
Masahito Zembutsu
?
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
VirtualTech Japan Inc.
?
Outlook アドイン開発入門
Outlook アドイン開発入門
Hiroaki Oikawa
?
C34 ニッチだけど、社会インフラを支えるデータベース、HiRDB ~HiRDBを選ぶ人、選ばない人、その選択基準とは~ by Taichi Ishikawa
C34 ニッチだけど、社会インフラを支えるデータベース、HiRDB ~HiRDBを選ぶ人、選ばない人、その選択基準とは~ by Taichi Ishikawa
Insight Technology, Inc.
?
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
Insight Technology, Inc.
?
Interspeech2022 参加報告
Interspeech2022 参加報告
Yuki Saito
?
トランクベース开発を活用して爆速に开発した话
トランクベース开発を活用して爆速に开発した话
Tier_IV
?
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
LINE Corporation
?
クララオンラインが狈别迟蝉办辞辫别を选んだ理由
クララオンラインが狈别迟蝉办辞辫别を选んだ理由
Kyohei Komatsu
?
まじめに!できる!尝罢
まじめに!できる!尝罢
Akabane Hiroyuki
?
认証/认可が実现する安全で高速分析可能な分析処理基盘
认証/认可が実现する安全で高速分析可能な分析処理基盘
Masahiro Kiura
?
Apex Test Plusの紹介
Apex Test Plusの紹介
Yuichiro Ebihara
?
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
?
Sql database でも使えるほにゃらら
Sql database でも使えるほにゃらら
Oda Shinsuke
?
じっくりコトコト煮込んだ闯补惫补スープ
じっくりコトコト煮込んだ闯补惫补スープ
Kazuhiro Serizawa
?
非エンジニアの厂蚕尝活用が加速させる事业成长
非エンジニアの厂蚕尝活用が加速させる事业成长
Keiko Inagaki
?
LINQ の概要とかもろもろ
LINQ の概要とかもろもろ
ShinichiAoyagi
?
Gorinphp0729
Gorinphp0729
akitsukada
?

More Related Content

What's hot (14)

京都大学非公式パワーポイントテンプレート
京都大学非公式パワーポイントテンプレート
Yuku Takahashi
?
碍尝补产インターンシップ成果报告会
碍尝补产インターンシップ成果报告会
Hiroaki Murayama
?
叁大奥别产サーバーの厂厂尝设定ベストプラクティス
叁大奥别产サーバーの厂厂尝设定ベストプラクティス
Hidetoshi Musha
?
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
Masahito Zembutsu
?
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
VirtualTech Japan Inc.
?
Outlook アドイン開発入門
Outlook アドイン開発入門
Hiroaki Oikawa
?
C34 ニッチだけど、社会インフラを支えるデータベース、HiRDB ~HiRDBを選ぶ人、選ばない人、その選択基準とは~ by Taichi Ishikawa
C34 ニッチだけど、社会インフラを支えるデータベース、HiRDB ~HiRDBを選ぶ人、選ばない人、その選択基準とは~ by Taichi Ishikawa
Insight Technology, Inc.
?
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
Insight Technology, Inc.
?
Interspeech2022 参加報告
Interspeech2022 参加報告
Yuki Saito
?
トランクベース开発を活用して爆速に开発した话
トランクベース开発を活用して爆速に开発した话
Tier_IV
?
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
LINE Corporation
?
クララオンラインが狈别迟蝉办辞辫别を选んだ理由
クララオンラインが狈别迟蝉办辞辫别を选んだ理由
Kyohei Komatsu
?
まじめに!できる!尝罢
まじめに!できる!尝罢
Akabane Hiroyuki
?
认証/认可が実现する安全で高速分析可能な分析処理基盘
认証/认可が実现する安全で高速分析可能な分析処理基盘
Masahiro Kiura
?
京都大学非公式パワーポイントテンプレート
京都大学非公式パワーポイントテンプレート
Yuku Takahashi
?
碍尝补产インターンシップ成果报告会
碍尝补产インターンシップ成果报告会
Hiroaki Murayama
?
叁大奥别产サーバーの厂厂尝设定ベストプラクティス
叁大奥别产サーバーの厂厂尝设定ベストプラクティス
Hidetoshi Musha
?
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
Masahito Zembutsu
?
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
アプリケーション性能管理(APM)ツールの新世代 「AppDynamics」のご紹介 – OpenStack最新情報セミナー 2015年7月
VirtualTech Japan Inc.
?
Outlook アドイン開発入門
Outlook アドイン開発入門
Hiroaki Oikawa
?
C34 ニッチだけど、社会インフラを支えるデータベース、HiRDB ~HiRDBを選ぶ人、選ばない人、その選択基準とは~ by Taichi Ishikawa
C34 ニッチだけど、社会インフラを支えるデータベース、HiRDB ~HiRDBを選ぶ人、選ばない人、その選択基準とは~ by Taichi Ishikawa
Insight Technology, Inc.
?
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
Insight Technology, Inc.
?
Interspeech2022 参加報告
Interspeech2022 参加報告
Yuki Saito
?
トランクベース开発を活用して爆速に开発した话
トランクベース开発を活用して爆速に开発した话
Tier_IV
?
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
LINE Corporation
?
クララオンラインが狈别迟蝉办辞辫别を选んだ理由
クララオンラインが狈别迟蝉办辞辫别を选んだ理由
Kyohei Komatsu
?
まじめに!できる!尝罢
まじめに!できる!尝罢
Akabane Hiroyuki
?
认証/认可が実现する安全で高速分析可能な分析処理基盘
认証/认可が実现する安全で高速分析可能な分析処理基盘
Masahiro Kiura
?

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

Apex Test Plusの紹介
Apex Test Plusの紹介
Yuichiro Ebihara
?
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
?
Sql database でも使えるほにゃらら
Sql database でも使えるほにゃらら
Oda Shinsuke
?
じっくりコトコト煮込んだ闯补惫补スープ
じっくりコトコト煮込んだ闯补惫补スープ
Kazuhiro Serizawa
?
非エンジニアの厂蚕尝活用が加速させる事业成长
非エンジニアの厂蚕尝活用が加速させる事业成长
Keiko Inagaki
?
LINQ の概要とかもろもろ
LINQ の概要とかもろもろ
ShinichiAoyagi
?
Gorinphp0729
Gorinphp0729
akitsukada
?
奥辞谤诲2惫别肠の并列実行时の学习速度の改善
奥辞谤诲2惫别肠の并列実行时の学习速度の改善
Naoaki Okazaki
?
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Masayuki Ozawa
?
Filesystem via MySQL
Filesystem via MySQL
Tomoya Kabe
?
YAPC::Asia Tokyo 2013 ランチセッション
YAPC::Asia Tokyo 2013 ランチセッション
Kuninobu SaSaki
?
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
Takahiro Iwase
?
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
IIJ
?
はじめての闯笔础
はじめての闯笔础
kawaba
?
JJUG CCC 2017 Spring LT about JPA
JJUG CCC 2017 Spring LT about JPA
Naoya Kojima
?
『アジャイルデータサイエンス』2章 データ
『アジャイルデータサイエンス』2章 データ
Hisao Soyama
?
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
Kentaro Ohkouchi
?
20120405 setsunaセミナー
20120405 setsunaセミナー
Takahiro Iwase
?
running-elixir-in-production
running-elixir-in-production
Tsunenori Oohara
?
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
?
Sql database でも使えるほにゃらら
Sql database でも使えるほにゃらら
Oda Shinsuke
?
じっくりコトコト煮込んだ闯补惫补スープ
じっくりコトコト煮込んだ闯补惫补スープ
Kazuhiro Serizawa
?
非エンジニアの厂蚕尝活用が加速させる事业成长
非エンジニアの厂蚕尝活用が加速させる事业成长
Keiko Inagaki
?
LINQ の概要とかもろもろ
LINQ の概要とかもろもろ
ShinichiAoyagi
?
奥辞谤诲2惫别肠の并列実行时の学习速度の改善
奥辞谤诲2惫别肠の并列実行时の学习速度の改善
Naoaki Okazaki
?
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Sql serverデータアクセスの基本動作。荒ぶった方法で確認してみよう
Masayuki Ozawa
?
Filesystem via MySQL
Filesystem via MySQL
Tomoya Kabe
?
YAPC::Asia Tokyo 2013 ランチセッション
YAPC::Asia Tokyo 2013 ランチセッション
Kuninobu SaSaki
?
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
Takahiro Iwase
?
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
IIJ
?
はじめての闯笔础
はじめての闯笔础
kawaba
?
JJUG CCC 2017 Spring LT about JPA
JJUG CCC 2017 Spring LT about JPA
Naoya Kojima
?
『アジャイルデータサイエンス』2章 データ
『アジャイルデータサイエンス』2章 データ
Hisao Soyama
?
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
EC-CUBE3系より新しい EC-CUBE2系の開発事例紹介
Kentaro Ohkouchi
?
20120405 setsunaセミナー
20120405 setsunaセミナー
Takahiro Iwase
?
Ad

More from kunst1080 (13)

顿辞肠办别谤を使ったクライアントハイパーバイザー
顿辞肠办别谤を使ったクライアントハイパーバイザー
kunst1080
?
20171223 2017年のふりかえり
20171223 2017年のふりかえり
kunst1080
?
20171223 シェル芸勉強会in大都会
20171223 シェル芸勉強会in大都会
kunst1080
?
第31回シェル芸勉強会LT rmコマンドチキンレース!
第31回シェル芸勉強会LT rmコマンドチキンレース!
kunst1080
?
第30回シェル芸勉強会LT シェル芸思考
第30回シェル芸勉強会LT シェル芸思考
kunst1080
?
贬测辫别谤でエキサイティングなシェル芸ライフ
贬测辫别谤でエキサイティングなシェル芸ライフ
kunst1080
?
第8回大阪jenkins勉強会LT Jenkinsでやってみてよかったこと?やめておいたほうが良かったこと
第8回大阪jenkins勉強会LT Jenkinsでやってみてよかったこと?やめておいたほうが良かったこと
kunst1080
?
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
kunst1080
?
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
kunst1080
?
贵谤别别叠厂顿のススメ
贵谤别别叠厂顿のススメ
kunst1080
?
ワンライナーで贵谤别别叠厂顿をインストールする
ワンライナーで贵谤别别叠厂顿をインストールする
kunst1080
?
【Kof2014】Jail-deploy, 若しくはjailhub, あるいは Jail as a Service
【Kof2014】Jail-deploy, 若しくはjailhub, あるいは Jail as a Service
kunst1080
?
固定长レコード形式行顺ファイルでも础飞办がしたい!
固定长レコード形式行顺ファイルでも础飞办がしたい!
kunst1080
?
顿辞肠办别谤を使ったクライアントハイパーバイザー
顿辞肠办别谤を使ったクライアントハイパーバイザー
kunst1080
?
20171223 2017年のふりかえり
20171223 2017年のふりかえり
kunst1080
?
20171223 シェル芸勉強会in大都会
20171223 シェル芸勉強会in大都会
kunst1080
?
第31回シェル芸勉強会LT rmコマンドチキンレース!
第31回シェル芸勉強会LT rmコマンドチキンレース!
kunst1080
?
第30回シェル芸勉強会LT シェル芸思考
第30回シェル芸勉強会LT シェル芸思考
kunst1080
?
贬测辫别谤でエキサイティングなシェル芸ライフ
贬测辫别谤でエキサイティングなシェル芸ライフ
kunst1080
?
第8回大阪jenkins勉強会LT Jenkinsでやってみてよかったこと?やめておいたほうが良かったこと
第8回大阪jenkins勉強会LT Jenkinsでやってみてよかったこと?やめておいたほうが良かったこと
kunst1080
?
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
20160827 第24回シェル芸勉強会LT Bash on Windows環境非破壊ハンズオン
kunst1080
?
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
20160618 第23回シェル芸勉強会LT コマンドプロンプト芸
kunst1080
?
贵谤别别叠厂顿のススメ
贵谤别别叠厂顿のススメ
kunst1080
?
ワンライナーで贵谤别别叠厂顿をインストールする
ワンライナーで贵谤别别叠厂顿をインストールする
kunst1080
?
【Kof2014】Jail-deploy, 若しくはjailhub, あるいは Jail as a Service
【Kof2014】Jail-deploy, 若しくはjailhub, あるいは Jail as a Service
kunst1080
?
固定长レコード形式行顺ファイルでも础飞办がしたい!
固定长レコード形式行顺ファイルでも础飞办がしたい!
kunst1080
?
Ad

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

  • 1. 2 0 1 7 - 0 7 - 0 8 O / R マ ッ パ ー 勉 強 会 I N 大 都 会 中 村 壮 一 ( @ K U N S T 1 0 8 0 ) Ebeanのご紹介 1
  • 3. 自己紹介 ? 名前: 中村壮一 = くんすと (@kunst1080) ? 普段は #シェル芸 界隈の住人 3
  • 4. 4
  • 5. 自己紹介 ? 名前: 中村壮一 = くんすと (@kunst1080) ? 普段は #シェル芸 界隈の住人 ? 仕事: 受託で小規模なWEBサービスを作ってます ? 2014年~ ? Java + Playframework ? 一次開発はほぼ一人で、最近は若手2人と一緒に保守してます ? Ebeanに関しては、ただのユーザーです。 5
  • 6. 6
  • 7. 目次 ? 今日伝えたいこと 1分くらい ? Ebeanの概要 4分くらい ? Ebeanの特徴 5分くらい ? 実際に使ってみてのレポート 7分くらい 7
  • 9. 今日 伝えたいこと ? 知らない方も結構いらっしゃるかと思いますが 「Ebean」という、シンプルなORMがあります。 ? 結構使いやすいので、検討の選択肢に入れてみてはい かがでしょう? ? (下心: ユーザーが増えて情報が増えてほしい) 9
  • 12. Ebeanの概要 ? 公式サイト: http://ebean-orm.github.io/ ? Javaで書かれた、早くてシンプルなORM ? JPAやJDOよりシンプルで理解しやすいように設計され ています(by Wikipedia) ? 私の感覚では、慣れてしまうと、他のORMが面倒臭すぎ て使う気が起きないくらいシンプル。 12
  • 13. 13
  • 14. Ebeanの概要 ? 対応しているフレームワークなど ? Play Framework ? 昔からサポート ? 生Java ? ライブラリを作る時に使用しました ? GuiceでのDIによる導入、Springもサポートされている模様 ? 未検証 14
  • 15. Ebeanの概要 ? Play FrameworkのJavaの方ではデフォルトのORMとし て採用されています。 ? (2.3まではPlay Frameworkに同梱されていました) ? https://www.playframework.com/documentation/2. 6.x/JavaEbean 15
  • 16. 16
  • 18. Ebeanの特徴 ? ①設定がシンプル ? ②Active Recordパターン ? ③セッションレス ? ④外部SQLも扱える(普通のSQL文をそのまま使える) 18
  • 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. 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. Ebeanの特徴 – ①設定がシンプル ? 基本機能だけを使う場合、設定はこれだけです。 ? 設定用のXMLを書いたりJavaクラスを書いたりは不要。 21
  • 22. Ebeanの特徴 – ②Active Recordパターン ? Ruby on RailsのActive Recordのような書き方で DBアクセスできます。 ? 1つのインスタンスがDBの1レコードに対応する 22
  • 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. 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. 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. 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. 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
  • 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. 実際に使ってみてのレポート - ①拡張したこと ? テキストファイルを読み込むライブラリの作成 「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. 実際に使ってみてのレポート - ①拡張したこと ? FinderのDecoratorを作成 ? byIdの結果をOptionalにする ? 各種検索処理をmix-inできるようにする ? https://github.com/kunst1080/play-java8- sample/blob/master/app/tables/FindDecorator.java 32
  • 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. 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. 実際に使ってみてのレポート - ①拡張したこと ? 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. 実際に使ってみてのレポート - ②複数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. 実際に使ってみてのレポート - ②複数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. 実際に使ってみてのレポート - ③使うときの注意点 ? 情報がほとんど英語 ? → 勉強するいい機会! だんだん慣れてきます! ? (自分も情報発信していきますね……) ? SQL文を渡す時、トークンの数が増えてくるとパースに失 敗する ? CAST とか CASE とかを使うとうまくいかない ? → DBは検索だけにして、演算はJavaでやる 38
  • 39. その他、今後検証してみたいこと ? Type safe queies ? こんな風に書けるそうです。安全そう。 ? Springとかでの利用 List<Customer> customers = new QCustomer() .id.greaterThan(12) .name.startsWith("Rob") .findList(); 39
  • 40. 以上です! ? 今日伝えたいこと 2分くらい ? Ebeanの概要 4分くらい ? Ebeanの特徴 4分くらい ? 実際に使ってみてのレポート 10分くらい 40