hirooka

C# + MySQL + Dapper で軽量 O/R Mapper


エンジニアの廣岡です。

最近は仕事で C# を用いたサーバを書いていますが、C# で O/R Mapper (ORM) を使ったことがなくて「とりあえず動く軽量なものが欲しい」と思って見つけ出した Dapper という Micro-ORM を紹介していきます。

Dapper: https://github.com/StackExchange/dapper-dot-net

ところで Micro-ORM とは、ORM の機能のうちいくつかの機能が無いものを指すようですが、「SQL 文を作るクエリビルダの機能」がないものを指すことが多いようです。

C# + MySQL + Dapper

C# から MySQL に接続するときは、ADO.NET インターフェイスを持った MySQL 公式の Connector/Net を使うのが無難でしょう。
http://dev.mysql.com/downloads/connector/net/
これを使えば基本的な MySQL への接続・SQL 実行などはできるようになるのですが、IDataReader や DataSet といったややローレベルなインターフェイスなのでちょっと使いにくいです。
そこで ORM が登場するわけですが、Entity Framework のようなリッチな ORM の導入がちょっとめんどくさかった(というか勉強不足だった)ので、超軽量な ORM は無いのかな〜と思って探していたら Dapper という Micro-ORM を見つけました。
これがどう軽量なのかというと

  • ライブラリは SqlMapper.cs ファイルだけ(数千行ありますが)
  • 基本的には ADO.NET の IDBConnection に拡張メソッドを追加しているだけ

というもので、基本は ADO.NET として使えばよくて、SQL クエリの結果をクラスや構造体にマッピングしたい時に Dapper による拡張メソッドを呼び出すというものです。
クエリビルダは無くデータマッピングしかしないのですが、今すぐ欲しい物としては十分な機能だったので採用しました。

サンプルコード

Dapper の IDbConnection.Query を使って DB 上の Users テーブルから User クラスの一覧を取得するコード

class User
{
    public int Age { get; set; }
    public string Name { get; set; }
}

using (var connection = new MySQLConnection("設定"))
{
    connection.Open();
    var users = connection.Query<User>("SELECT * FROM Users"); // この行だけ Dapper
    foreach (var user in users)
    {
        Console.WriteLine(user.Name);
    }
}

Dapper の IDbConnection.Execute を使って DB 上の Users テーブルにレコードを挿入するコード
(あまり ORM の恩恵がないケース)

using (var connection = new MySQLConnection("設定"))
{
    connection.Open();
    var numOfAffected = connection.Execute("INSERT INTO Users (Age, Name) VALUES (23, Alice)");
}

Dapper で満足?

Dapper は急ぎで欲しかった機能を提供してくれました。ただその後、クエリビルダがないことによって恥ずかしながらテーブル名をタイポしてしまい、気づきにくいバグを作ってしまいました。
この種のバグを二度と作らないためにも Dapper 用にクエリビルダを導入するか、Linq to Entities のようなフル ORM に乗り換えるか、検討をはじめています。

Dapper は ADO.NET をもう少し便利に使いたいなーというシーンには使いどころもありますが、ゲームのサーバ側の MySQL 用に使うには機能不足感があると思います。

Unity 上で SQLite を扱うときなんかにはこの軽量さが発揮されそうですね。


hirooka

技術書をたくさん購入しました


こんにちは、エンジニアの廣岡です。

この年末に、Aiming のエンジニアが欲しい技術書をまとめて購入しました。

たくさんの書籍がアップで写った写真
たくさんの書籍が引きで写った写真

なんと、東京大阪で買った本の総数は約230冊!
それぞれに届いた本は100冊を超えました!
冬休みに読める本がこんなに届いたと同僚も大喜びです。

今回は特別に一括で購入をしましたが、Aiming ではエンジニアの知識のベースアップやスキルアップのために普段から技術書は惜しまず購入しています。

以上、Aiming の取り組みの一部の紹介でした。


hirooka

Jenkins Gerrit Trigger Plugin の使い方


はじめまして。Aiming で C# を書いてるウェブっ子エンジニアの廣岡 (hirooka) です。

弊社ではすべての開発ラインでコードレビューに Android 開発で有名な Gerrit という Google 製のツールを使っています。
今回は、この Gerrit と CI ツールである Jenkins を組み合わせて使う需要が社内で発生したので、公開社内向けドキュメントにしました。

続きを読む