Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dapperのかるーい話し

 Dapperのかるーい話し

2014/08/10に行われたCode 2014で発表したDapperについてのかるい話です。

Takuya Shibata

August 10, 2014
Tweet

More Decks by Takuya Shibata

Other Decks in Technology

Transcript

  1. 自己紹介  H/N  素敵なおひげ  Twitter - @stknohg 

    Blog - http://d.hatena.ne.jp/stknohg  何者?  CLR/Hの裏方。  札幌でSIerやってます。  インフラ構築からアプリ製造、運用まで色々やってま す。
  2. はじめに  こちらの資料を見れば私の話は不要です。  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
  3. 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
  4. Dapperで何が嬉しいか  クエリ実行のめんどうくさい部分が解消される  いちいちIDbCommandを生成しないで良い。  生SQLが使える  一般的なORMの様にSQLの隠蔽まではしない。 

    すべての処理においてSQLを書く必要がある。  SELECTした結果(IDataReader)を指定の型のプロパティ にマッピングするだけなのでどんなクエリでも使える。  パフォーマンスが良い  私はORMを常用しないのでよくわかりませんがパフォー マンスは良いそうです。
  5. 使用方法  公式のサンプルを見れば十分わかります。  https://code.google.com/p/dapper-dot-net/  https://github.com/StackExchange/dapper-dot-net  とりあえず使うには 1.

    NugetでDapperを検索して参照する。 2. ソースに using Dapper; する。  拡張メソッドなのでインポート必須 3. IDbConnectionを使う。 4. 完。
  6. デモ  Queryメソッド  QueryAsync  MultipleQuery  IN句 

    ExecuteReader  Executeメソッド  UPDATE/DELETE/その他DML・DDLの実行  ストアドプロシージャの実行  トランザクション
  7. ちょっとした内部動作の説明  バージョンについて  Ver.1.29→2014/11/02現在はVer.1.38が最新  2つのキャッシュ  SQLとパラメータ指定メソッドのキャッシュ 

    IDataReader→指定の型Tへのマップメソッドのキャッシュ  ILを動的に生成してメソッド生成+キャッシュすること でパフォーマスを出している  実体 static readonly ConcurrentDictionary<Identity, CacheInfo> _queryCache = new ConcurrentDictionary<Identity, CacheInfo>();
  8. ちょっとした内部動作の説明  SqlMapper.Identityクラス  クエリの実体でありキャッシュ情報のキーとなるクラス。  SQL本文やCommandTypeはこのクラスに格納されている。  SqlMapper.CacheInfoクラス 

    キャッシュの実体。  Deserializerプロパティ  内部にFunc<IDataReader, object> を持つ。  IDataReaderから型Tへの変換メソッドの実体  ParamReaderプロパティ  Action<IDbCommand, object> 型のプロパティ。  パラメータ指定部分のメソッドの実体。
  9. ちょっとした内部動作の説明  マッピングの方法  DapperではSQLの結果を3パターンのマッピングをして返 す  IEnumerable<IDictionary<string, object>>を返す 

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

     ITypeMap  CustomPropertyTypeMapをカスタマイズする  SqlMapper.AddTypeMap()  SQLパラメータに指定する型とDbTypeの関係をカスタマイズす る  Datetime型→DbType.Datetime2にしたりするらしい..  RDBMS固有のDbType(OracleDbTypeなど)は使用できない  SqlMapper.PurgeQueryCache()  キャッシュのクリアを行う。多分IIS用。  PurgeQueryCachedイベントもある。