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.
よろしい、ならばMicro-ORMだ
きよくら ならみ
第二回 中国地方DB勉強会
2013/10/05
自己紹介
• きよくら ならみ
– @kiyokura / id:kiyokura
• 岡山生まれ岡山育ちのプログラマー
– 現在は県内の某製造業で社内SE
• NET系の開発やWebアプリ開発
– Microsoft MVP for ASP....
ORMとSQLと
ORM派 vs SQL派(?)
• よく論争になってる(?)
• でも今日はそんな話はしません
• (そもそも個人的には対立軸ではないと思って
ます)
先に私の個人的結論を言うと
• ORM使えばいい
• むしろどんどん使うべき
ただし銀の弾丸じゃない
• コンテキスト次第
– 「デメリットが勝つ」というべきか、
「メリットが有効に働かない」というべきか
– そういうことはある
でも面倒なのは避けたいです
• ORMが使えなくても
– なるべくならば
今日のお話の流れ
• ORMについて
• ORMがあんまり有効でないケース
• Micro-ORMについて
ORMとは
ORMの代表的な機能
• クエリの自動生成
• データ(値)のマッピング
• DB操作のラッピング
• ソースコード自動生成
• もちろん実装によっては無い機能もある
"面倒くさい"ところを便利に
• SQL
• エンティティになるクラス
• DB操作をいちいち書かなくていい
• 単体テストが必要な個所が削れる
• 実装によって異なる場合があります
便利なのでどんどん使えばいいよ
• そう思います
ORMが有効じゃないケースとは
ORMが有効でないケースもある
• 往々にして"銀の弾丸"は無いです
• 幾つかあると思いますが、もっとも根本
的なお話をしたいと思います
DB設計がORMに適さないケース
• 例えばデータが単一のアプリケーション
内に閉じないケース
こんな感じとか
販売データ
労務データ
製造データ
研究開発
データ
顧客データ
販売管理システム 生産管理システム
賞与計算システム 製造品質管理
システム
データベース ">" アプリケーション
• 何が「>」?
– 利用範囲や権限、寿命等
• データが横断的に利用される
– 例えば基幹系システムでは良くありますよね
• キーワード:
データ中心アプローチ(DOA)
その他ORMが使いにくいと思われるケース
• DB設計がイケてない!
– パフォーマンスが出ない
– 適切にリレーションが貼られていない
– もちろん私にそれを変更する権限は(
• ドライバ・プロバイダが使いたいORMに
対応してない
– たま...
ORMが使えないならどうするか
• もちろん、使わずに書くしかない
• SQL組み立てて...
• DBの接続情報を読み込んで...
• DBに接続して...
• おっと、例外時の処理もしっかりしとか
ないと
• パラメータをバインドして…
• クエリを実行!
そして…
• レコードの値を変数にセット、
• レコードの値を変数にセット、
• レコードの値を変数にセット、
• レコードの値を変数にセット、
• レコードの値を変数にセット、
• レコードの値を変数にセット、
• レコードの値を変数にセット...
決まりきったことは書きたくない
• 生産効率云々...
• Lazinessはプログラマの三大美徳の一つ
• どうにかズル出来ないものか
真面目な話、
• 自力でコードを書く量が少ないに越した
ことはない
– 仮に実装にかかる時間が同じとしても
– バグを積み込む可能性は減る
• テストするべき個所が減る
そこで、今日の本題です
Micro-ORMってなに??
大体こんなもの
• 軽量で
• 高速な
• プチORM…とでも言うもの
"プチ”故に...
クエリの
自動生成
データ
(値)の
マッピング
DB操作の
ラッピング
ソース
コード自
動生成
☆物によってはある程度するものも
このあたりを面倒見てくれる
• DB操作のラッピング
– クエリ実行は面倒見てくれる
– 接続やトランザクション制御は
"ある程度"は自動でやってくれる
• 値のマッピング
– クエリの結果セットの取得とマッピング
– クエリのパラメータへのマ...
軽量で早い
• ソースコード1~2ファイルとかの実装が
多い
• あんまり複雑なことしない分早い
• クエリの実行速度は
"あなたが組んだSQLに依存する"
Micro-ORMの実装例の紹介
実装例
• 代表的な実装例
– dappar dot net
– Massive
– PetaPoco
• あれ?なんか.NETの実装ばっかりだ:p
• dapper dot netを例に少しだけ紹介
おことわり
• .NETの実装ですのでコードも.NETです
• 今日はざっくりとさらっと
• 詳しいコード例やデモ、他のORMとの比
較などは…
来週(10/12)のヒーロー島で!
• 「ヒーロー島 秋の収穫祭 2013」
• こちらでは、よりコード例や機能の紹介など
を行いたいと思います
• 10/12(日)、八丁堀のMS中四国支店
– 八丁堀電停から徒歩3分
• 詳細とお申し込みはこ...
dapper dot net
• .NET向けのMicro-ORM
– Dapper.NETとも書かれる
• オープンソース
– ApachとMITのデュアルライセンス
• サイトはこの辺
– https://code.google.com/p...
dapper dot net
• 対象データベース
– たいがい行ける気がします
• ADO.NETに準拠したプロバイダがあれば
• SQL Server / Oracle / MySQL / PostgreSQL
• 最悪ODBCあれば行ける...
導入は簡単
• NuGetで一発インストール
実際の使用例
• 実際にdapperを使った例をお見せします
...とその前に
• dapperやORMを使わずに書いた
DBアクセスの例
public IList<EmployeeEntity> FindAll()
{
using (var cn = new SqlCeConnection(connectionString))
{
cn.Open();
var sql = "se...
var cmd = new SqlCeCommand(sql , cn);
var result = new List<EmployeeEntity>();
using (var dr = cmd.ExecuteReader())
{
whil...
dapperを使うとどうなるか
public IList<EmployeeEntity> FindAll()
{
using (var cn = new SqlCeConnection(connectionString))
{
cn.Open();
var sql = "se...
return cn.Query<EmployeeEntity>(sql).ToList();
この一行で、実行結果のマッピングまですべて完了!
ポイントはQuery拡張メソッド
• コネクションオブジェクトの拡張メソッ
ドとして実装
• Query拡張メソッドの各種オーバーロード
デモ
もう一つ、例
• パラメータをバインドしてみます
こちらも非dapperから
public EmployeeEntity FindByID(int id)
{
using (var cn = new SqlCeConnection(connectionString))
{
cn.Open();
var sql = "se...
var sql =
"select ID, Name , Age , Email From Employee where ID = @ID;"
var cmd = new SqlCeCommand(sql, cn);
var param = c...
これがdapperだと…
public EmployeeEntity FindByID(int id)
{
using (var cn = new SqlCeConnection(connectionString))
{
cn.Open();
var sql = "se...
return cn.Query<EmployeeEntity>( sql ,
new { ID = id })
.SingleOrDefault();
Queryメソッドの第二引数に、
パラメータと名前の一致するプロパティを持ったオ
ブジェクト...
もっといろいろな機能があります
• 詳細は公式のGithub等にあるサンプルを
見てみてください
– 私もblogで書こうとしてるけど下書きだけ溜
まっててまだ公開出来てません...
想定FAQ:1
• Q:実績あるの?
• A:結構いろいろあるらしい
– IT技術者的には「Stack Overflowで使われて
いる」といえば納得できるかな?
– そもそも作者がStack Overflowの中の人
– Stack Over...
想定FAQ:2
• Q:実際、パフォーマンスどうなの?
• A:相当早いよ
– 詳しくは公式サイトにベンチマークあるので
参照
想定FAQ:3
• Q:PHPで普通に書くのと一緒じゃね?
• A:静的型付けなのに同じってすごくね?
– コンパイラの恩恵
– IDEのサポート
• インテリセンス
• リアルタイムにコンパイルエラー
まとめ
ORMは便利な道具
• 有効に使えるところではどんどん使おう
• でも使えないケースもある
– 設計思想やスケールのアンマッチ
– 銀の弾丸は無い
Micro-ORMという選択肢
• 軽量高速、省力プログラミング
• ORMとSQLのいいところどりも可能
ご清聴ありがとうございました
and , Question?
Upcoming SlideShare
Loading in …5
×

よろしい、ならばMicro-ORMだ

5,520 views

Published on

第二回 中国地方DB勉強会の同名のセッションの資料です。

Published in: Technology
  • Be the first to comment

よろしい、ならばMicro-ORMだ

  1. 1. よろしい、ならばMicro-ORMだ きよくら ならみ 第二回 中国地方DB勉強会 2013/10/05
  2. 2. 自己紹介 • きよくら ならみ – @kiyokura / id:kiyokura • 岡山生まれ岡山育ちのプログラマー – 現在は県内の某製造業で社内SE • NET系の開発やWebアプリ開発 – Microsoft MVP for ASP.NET/IIS
  3. 3. ORMとSQLと
  4. 4. ORM派 vs SQL派(?) • よく論争になってる(?) • でも今日はそんな話はしません • (そもそも個人的には対立軸ではないと思って ます)
  5. 5. 先に私の個人的結論を言うと • ORM使えばいい • むしろどんどん使うべき
  6. 6. ただし銀の弾丸じゃない • コンテキスト次第 – 「デメリットが勝つ」というべきか、 「メリットが有効に働かない」というべきか – そういうことはある
  7. 7. でも面倒なのは避けたいです • ORMが使えなくても – なるべくならば
  8. 8. 今日のお話の流れ • ORMについて • ORMがあんまり有効でないケース • Micro-ORMについて
  9. 9. ORMとは
  10. 10. ORMの代表的な機能 • クエリの自動生成 • データ(値)のマッピング • DB操作のラッピング • ソースコード自動生成 • もちろん実装によっては無い機能もある
  11. 11. "面倒くさい"ところを便利に • SQL • エンティティになるクラス • DB操作をいちいち書かなくていい • 単体テストが必要な個所が削れる • 実装によって異なる場合があります
  12. 12. 便利なのでどんどん使えばいいよ • そう思います
  13. 13. ORMが有効じゃないケースとは
  14. 14. ORMが有効でないケースもある • 往々にして"銀の弾丸"は無いです • 幾つかあると思いますが、もっとも根本 的なお話をしたいと思います
  15. 15. DB設計がORMに適さないケース • 例えばデータが単一のアプリケーション 内に閉じないケース
  16. 16. こんな感じとか 販売データ 労務データ 製造データ 研究開発 データ 顧客データ 販売管理システム 生産管理システム 賞与計算システム 製造品質管理 システム
  17. 17. データベース ">" アプリケーション • 何が「>」? – 利用範囲や権限、寿命等 • データが横断的に利用される – 例えば基幹系システムでは良くありますよね • キーワード: データ中心アプローチ(DOA)
  18. 18. その他ORMが使いにくいと思われるケース • DB設計がイケてない! – パフォーマンスが出ない – 適切にリレーションが貼られていない – もちろん私にそれを変更する権限は( • ドライバ・プロバイダが使いたいORMに 対応してない – たまにある
  19. 19. ORMが使えないならどうするか • もちろん、使わずに書くしかない
  20. 20. • SQL組み立てて... • DBの接続情報を読み込んで... • DBに接続して... • おっと、例外時の処理もしっかりしとか ないと • パラメータをバインドして… • クエリを実行!
  21. 21. そして… • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット、 • レコードの値を変数にセット
  22. 22. 決まりきったことは書きたくない • 生産効率云々... • Lazinessはプログラマの三大美徳の一つ • どうにかズル出来ないものか
  23. 23. 真面目な話、 • 自力でコードを書く量が少ないに越した ことはない – 仮に実装にかかる時間が同じとしても – バグを積み込む可能性は減る • テストするべき個所が減る
  24. 24. そこで、今日の本題です
  25. 25. Micro-ORMってなに??
  26. 26. 大体こんなもの • 軽量で • 高速な • プチORM…とでも言うもの
  27. 27. "プチ”故に... クエリの 自動生成 データ (値)の マッピング DB操作の ラッピング ソース コード自 動生成 ☆物によってはある程度するものも
  28. 28. このあたりを面倒見てくれる • DB操作のラッピング – クエリ実行は面倒見てくれる – 接続やトランザクション制御は "ある程度"は自動でやってくれる • 値のマッピング – クエリの結果セットの取得とマッピング – クエリのパラメータへのマッピング
  29. 29. 軽量で早い • ソースコード1~2ファイルとかの実装が 多い • あんまり複雑なことしない分早い • クエリの実行速度は "あなたが組んだSQLに依存する"
  30. 30. Micro-ORMの実装例の紹介
  31. 31. 実装例 • 代表的な実装例 – dappar dot net – Massive – PetaPoco • あれ?なんか.NETの実装ばっかりだ:p • dapper dot netを例に少しだけ紹介
  32. 32. おことわり • .NETの実装ですのでコードも.NETです • 今日はざっくりとさらっと • 詳しいコード例やデモ、他のORMとの比 較などは…
  33. 33. 来週(10/12)のヒーロー島で! • 「ヒーロー島 秋の収穫祭 2013」 • こちらでは、よりコード例や機能の紹介など を行いたいと思います • 10/12(日)、八丁堀のMS中四国支店 – 八丁堀電停から徒歩3分 • 詳細とお申し込みはこちら – http://heroshima.jp/EventInfo/autumn2013
  34. 34. dapper dot net • .NET向けのMicro-ORM – Dapper.NETとも書かれる • オープンソース – ApachとMITのデュアルライセンス • サイトはこの辺 – https://code.google.com/p/dapper-dot-net/ – https://github.com/SamSaffron/dapper-dot- net
  35. 35. dapper dot net • 対象データベース – たいがい行ける気がします • ADO.NETに準拠したプロバイダがあれば • SQL Server / Oracle / MySQL / PostgreSQL • 最悪ODBCあれば行ける気がする
  36. 36. 導入は簡単 • NuGetで一発インストール
  37. 37. 実際の使用例 • 実際にdapperを使った例をお見せします
  38. 38. ...とその前に • dapperやORMを使わずに書いた DBアクセスの例
  39. 39. public IList<EmployeeEntity> FindAll() { using (var cn = new SqlCeConnection(connectionString)) { cn.Open(); var sql = "select ID, Name , Age , Email From Employee;" var cmd = new SqlCeCommand(sql , cn); var result = new List<EmployeeEntity>(); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) { result.Add(new EmployeeEntity() { ID = (int)dr["ID"], Name = (string)dr["Name"], Age = (int)dr["Age"], Email = (string)dr["Email"] }); } } return result; } }
  40. 40. var cmd = new SqlCeCommand(sql , cn); var result = new List<EmployeeEntity>(); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) { result.Add(new EmployeeEntity() { ID = (int)dr["ID"], Name = (string)dr["Name"], Age = (int)dr["Age"], Email = (string)dr["Email"] }); } } ①実行の下準備(コマンドオブジェクト作成) ②実行して ③型変換とかしながらクエリの結果をオブジェクトにマッピング カ ラ ム が 増 え る と も っ と 面 倒 に !
  41. 41. dapperを使うとどうなるか
  42. 42. public IList<EmployeeEntity> FindAll() { using (var cn = new SqlCeConnection(connectionString)) { cn.Open(); var sql = "select ID, Name , Age , Email From Employee;" return cn.Query<EmployeeEntity>(sql).ToList(); } }
  43. 43. return cn.Query<EmployeeEntity>(sql).ToList(); この一行で、実行結果のマッピングまですべて完了!
  44. 44. ポイントはQuery拡張メソッド • コネクションオブジェクトの拡張メソッ ドとして実装 • Query拡張メソッドの各種オーバーロード
  45. 45. デモ
  46. 46. もう一つ、例 • パラメータをバインドしてみます
  47. 47. こちらも非dapperから
  48. 48. public EmployeeEntity FindByID(int id) { using (var cn = new SqlCeConnection(connectionString)) { cn.Open(); var sql = "select ID, Name , Age , Email From Employee where ID = @ID;" var cmd = new SqlCeCommand(sql, cn); var param = cmd.CreateParameter(); param.ParameterName = "ID"; param.SqlDbType = System.Data.SqlDbType.Int; param.Direction = System.Data.ParameterDirection.Input; param.Value = id; cmd.Parameters.Add(param); var result = new List<EmployeeEntity>(); using (var dr = cmd.ExecuteReader()) { if (dr.Read()) { return new EmployeeEntity() { ID = (int)dr["ID"], Name = (string)dr["Name"], Age = (int)dr["Age"], Email = (string)dr["Email"] }; } else { return null; } } } }
  49. 49. var sql = "select ID, Name , Age , Email From Employee where ID = @ID;" var cmd = new SqlCeCommand(sql, cn); var param = cmd.CreateParameter(); param.ParameterName = "ID"; param.SqlDbType = System.Data.SqlDbType.Int; param.Direction = System.Data.ParameterDirection.Input; param.Value = id; cmd.Parameters.Add(param); ①Parameterオブジェクトを作成して ②Parameterオブジェクトに値その他を設定 ③Commandオブジェクトにパラメータをセット パラメータの数だけ、 これをやらないといけない!!!
  50. 50. これがdapperだと…
  51. 51. public EmployeeEntity FindByID(int id) { using (var cn = new SqlCeConnection(connectionString)) { cn.Open(); var sql = "select ID, Name , Age , Email From Employee where ID = @ID;" return cn.Query<EmployeeEntity>( sql , new { ID = id }).SingleOrDefault(); } }
  52. 52. return cn.Query<EmployeeEntity>( sql , new { ID = id }) .SingleOrDefault(); Queryメソッドの第二引数に、 パラメータと名前の一致するプロパティを持ったオ ブジェクトを渡してやるだけ (匿名クラスでもOK) パラメータが増えたら… new { ID = id, Name = "ほげほげ", Age = 17 }
  53. 53. もっといろいろな機能があります • 詳細は公式のGithub等にあるサンプルを 見てみてください – 私もblogで書こうとしてるけど下書きだけ溜 まっててまだ公開出来てません...
  54. 54. 想定FAQ:1 • Q:実績あるの? • A:結構いろいろあるらしい – IT技術者的には「Stack Overflowで使われて いる」といえば納得できるかな? – そもそも作者がStack Overflowの中の人 – Stack Overflowのパフォーマンス改善のため に作られたらしい
  55. 55. 想定FAQ:2 • Q:実際、パフォーマンスどうなの? • A:相当早いよ – 詳しくは公式サイトにベンチマークあるので 参照
  56. 56. 想定FAQ:3 • Q:PHPで普通に書くのと一緒じゃね? • A:静的型付けなのに同じってすごくね? – コンパイラの恩恵 – IDEのサポート • インテリセンス • リアルタイムにコンパイルエラー
  57. 57. まとめ
  58. 58. ORMは便利な道具 • 有効に使えるところではどんどん使おう • でも使えないケースもある – 設計思想やスケールのアンマッチ – 銀の弾丸は無い
  59. 59. Micro-ORMという選択肢 • 軽量高速、省力プログラミング • ORMとSQLのいいところどりも可能
  60. 60. ご清聴ありがとうございました and , Question?

×