Slide 1

Slide 1 text

Dapperのかるーい話 2014/08/10 Code 2014 CLR/H 素敵なおひげ

Slide 2

Slide 2 text

自己紹介  H/N  素敵なおひげ  Twitter - @stknohg  Blog - http://d.hatena.ne.jp/stknohg  何者?  CLR/Hの裏方。  札幌でSIerやってます。  インフラ構築からアプリ製造、運用まで色々やってま す。

Slide 3

Slide 3 text

はじめに  こちらの資料を見れば私の話は不要です。  ADO.NETとORMとMicro-ORM -dapper dot netを 使ってみた(きよくらさん)  http://www.slideshare.net/kiyokura/adonetormmicro- orm-dapper-dot-net  Micro-ORMとC#(とDapperカスタマイズ)(のいえさん)  http://neue.cc/2012/12/11_390.html

Slide 4

Slide 4 text

Dapperとは  公式サイト  https://code.google.com/p/dapper-dot-net/ → https://github.com/StackExchange/dapper-dot-net  .NET3.5以上対応  IDbConnectionインターフェイスに対する 拡張メソッドとして実装されている。 Query  QueryAsync (.NET4.5 Only)  QueryMultiple Execute  ExecuteAsync(.NET4.5Only)  ExecuteReader

Slide 5

Slide 5 text

Dapperで何が嬉しいか  クエリ実行のめんどうくさい部分が解消される  いちいちIDbCommandを生成しないで良い。  生SQLが使える  一般的なORMの様にSQLの隠蔽まではしない。  すべての処理においてSQLを書く必要がある。  SELECTした結果(IDataReader)を指定の型のプロパティ にマッピングするだけなのでどんなクエリでも使える。  パフォーマンスが良い  私はORMを常用しないのでよくわかりませんがパフォー マンスは良いそうです。

Slide 6

Slide 6 text

使用方法  公式のサンプルを見れば十分わかります。  https://code.google.com/p/dapper-dot-net/  https://github.com/StackExchange/dapper-dot-net  とりあえず使うには 1. NugetでDapperを検索して参照する。 2. ソースに using Dapper; する。  拡張メソッドなのでインポート必須 3. IDbConnectionを使う。 4. 完。

Slide 7

Slide 7 text

デモ  Queryメソッド  QueryAsync  MultipleQuery  IN句  ExecuteReader  Executeメソッド  UPDATE/DELETE/その他DML・DDLの実行  ストアドプロシージャの実行  トランザクション

Slide 8

Slide 8 text

ちょっとした内部動作の説明  バージョンについて  Ver.1.29→2014/11/02現在はVer.1.38が最新  2つのキャッシュ  SQLとパラメータ指定メソッドのキャッシュ  IDataReader→指定の型Tへのマップメソッドのキャッシュ  ILを動的に生成してメソッド生成+キャッシュすること でパフォーマスを出している  実体 static readonly ConcurrentDictionary _queryCache = new ConcurrentDictionary();

Slide 9

Slide 9 text

ちょっとした内部動作の説明  SqlMapper.Identityクラス  クエリの実体でありキャッシュ情報のキーとなるクラス。  SQL本文やCommandTypeはこのクラスに格納されている。  SqlMapper.CacheInfoクラス  キャッシュの実体。  Deserializerプロパティ  内部にFunc を持つ。  IDataReaderから型Tへの変換メソッドの実体  ParamReaderプロパティ  Action 型のプロパティ。  パラメータ指定部分のメソッドの実体。

Slide 10

Slide 10 text

ちょっとした内部動作の説明  マッピングの方法  DapperではSQLの結果を3パターンのマッピングをして返 す  IEnumerable>を返す  Dynamicの使えない.NET 3.5専用  SqlMapper. GetDictionaryDeserializer()  IEnumerableを返す  Dynamicの使える.NET4以降  内部形式はDapperRowクラス  SqlMapper. GetDapperRowDeserializer()  指定された型Tにマップして返す – IL動的生成  SELECT文のフィールド名→Tのプロパティ名orメンバ変数名に マップして結果の値を設定  内部ではIDataReader→Tへの値の受け渡しが行われている。  SqlMapper. GetTypeDeserializer() / GetStructDeserializer()

Slide 11

Slide 11 text

ちょっとした内部動作の説明  カスタマイズ  Dapperのマッピングルールなどをカスタマイズする部分がいく つか用意されている。  SqlMapper.SetTypeMap()  型Tへの変換ルールをカスタマイズ可能  ITypeMap  CustomPropertyTypeMapをカスタマイズする  SqlMapper.AddTypeMap()  SQLパラメータに指定する型とDbTypeの関係をカスタマイズす る  Datetime型→DbType.Datetime2にしたりするらしい..  RDBMS固有のDbType(OracleDbTypeなど)は使用できない  SqlMapper.PurgeQueryCache()  キャッシュのクリアを行う。多分IIS用。  PurgeQueryCachedイベントもある。