C#のDapper入門!初心者でもわかる軽量ORMの使い方とメリットを徹底解説
生徒
「C#でデータベースを操作したいのですが、Entity Frameworkは少し難しそうで。もっとシンプルで動きが速い方法はありますか?」
先生
「それならDapperという軽量ORMがおすすめです。SQL文を直接書けるので直感的ですし、動作も非常に高速ですよ。」
生徒
「Dapperって何だかかっこいい名前ですね!初心者でも使いこなせますか?」
先生
「もちろんです。基本的な仕組みを理解すれば、驚くほど簡単にデータを扱えるようになります。一緒に学んでいきましょう!」
1. Dapperとは?軽量ORMの基本を学ぼう
C#でプログラムを書いていると、保存したデータを取り出したり、新しい情報を登録したりするためにデータベースという保管場所を使いたくなる場面が出てきます。しかし、プログラムの世界の言葉と、データベースの世界の言葉(SQL)は少し種類が違います。
この二つの橋渡しをしてくれるのがORM(オブジェクト関係マッピング)という仕組みです。Dapper(ダッパー)は、数あるORMの中でも「軽量」と呼ばれ、余計な機能を削ぎ落として「速さ」と「シンプルさ」に特化したライブラリです。
Stack Overflowという世界的に有名なプログラミング質問サイトの開発チームが、自分たちのサイトを高速に動かすために開発したという経緯があります。そのため、信頼性は抜群で、世界中の多くのエンジニアに愛用されています。パソコンを触り始めたばかりの方でも、まずは「便利な翻訳機のようなもの」とイメージしてください。
2. Dapperを使う最大のメリット
Dapperがなぜこれほどまでに支持されているのか、その理由は主に三つあります。
一つ目は圧倒的な実行速度です。他の多機能なORM(例えばEntity Frameworkなど)は、裏側で複雑な処理を自動で行ってくれる反面、動作が少し重くなることがあります。Dapperは極限まで無駄を省いているため、素のC#の機能を使ってデータベースを操作するのとほぼ変わらない速さを実現しています。
二つ目はSQL文がそのまま使えることです。プログラミングの学習を進めると、データベースを操作するための専用言語「SQL」を学ぶことになります。Dapperは、このSQLを直接プログラムの中に書き込んで実行できるため、学習した知識をそのまま活かすことができます。
三つ目は導入の簡単さです。ライブラリを一つ追加するだけで、既存のデータベース接続機能がパワーアップします。複雑な設定ファイルを書く必要がなく、すぐに使い始められるのが魅力です。
3. データの受け皿を作る「クラス」の考え方
データベースから値を取り出したとき、それをC#側で受け止めるための「箱」が必要になります。これをプログラミング用語でクラスと呼びます。例えば、ユーザー情報を管理したい場合、名前や年齢を入れるための項目を準備します。
ここで重要なのは、データベースの項目の名前と、C#のクラスの項目の名前を一致させることです。そうすることで、Dapperが自動的に「このデータはこの箱に入れておこう」と判断してくれます。
まずは、一番シンプルなデータの受け皿となるクラスの書き方を見てみましょう。
public class User
{
// ユーザーのIDを保存する番号の箱
public int Id { get; set; }
// ユーザーの名前を保存する文字の箱
public string Name { get; set; }
// ユーザーの年齢を保存する番号の箱
public int Age { get; set; }
}
このように、データ構造を定義することを「モデリング」と言ったりしますが、まずは「データの種類を決める作業」だと考えてください。
4. データを取得する基本的な方法
それでは、実際にデータベースから情報を取得してみましょう。Dapperを使うときは、Queryという命令を使います。これは「データベースに問い合わせる」という意味です。接続を確立した後に、一行書くだけでデータが魔法のように取得できます。
以下のコードは、全てのユーザー情報を取得する例です。
using System.Data.SqlClient;
using Dapper;
using System.Linq;
// データベースへの接続情報を準備
string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using (var connection = new SqlConnection(connectionString))
{
// SQL文を準備(全てのユーザーを選びなさいという命令)
string sql = "SELECT * FROM Users";
// Dapperを使ってデータを取得し、Userクラスのリストに変換
var users = connection.Query<User>(sql).ToList();
// 取得した名前を画面に表示
foreach (var user in users)
{
Console.WriteLine(user.Name);
}
}
「using」というのは、使い終わったら片付けるという合図です。データベースへの扉を開けたら、最後はきちんと閉めるのがプログラミングの礼儀です。
5. 条件を指定して特定のデータを検索する
全てのデータを取得するだけでなく、「特定のIDの人だけ探したい」といった場合には、パラメーターという仕組みを使います。これは、SQL文の中に穴あき部分を作っておき、後から安全に値を当てはめる方法です。
セキュリティの観点からも、このパラメーターを利用することは非常に大切です。悪い人がプログラムを攻撃しようとするのを防ぐ効果があります(これをSQLインジェクション対策と呼びます)。
using (var connection = new SqlConnection(connectionString))
{
// IDが1の人だけを探すSQL文
string sql = "SELECT * FROM Users WHERE Id = @Id";
// @Id の部分に 1 を入れて実行
var user = connection.QuerySingleOrDefault<User>(sql, new { Id = 1 });
if (user != null)
{
Console.WriteLine("見つかったユーザー: " + user.Name);
}
}
QuerySingleOrDefaultは「一つだけ取ってくる、なければ空っぽを返す」という便利な命令です。一人だけを特定したいときによく使います。
6. 新しいデータを追加・更新・削除する
データの読み取りだけでなく、登録(追加)、変更(更新)、削除も重要です。これらを行うときはExecuteという命令を使います。これは「実行する」という意味そのままですね。
例えば、新しいユーザーを登録する場合の書き方を見てみましょう。値を直接書き込むのではなく、クラスのオブジェクトをそのまま渡すことができるので、非常にスッキリとしたコードになります。
using (var connection = new SqlConnection(connectionString))
{
// 新しいユーザーのデータを作成
var newUser = new User { Name = "田中太郎", Age = 25 };
// データを追加するためのSQL文
string sql = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)";
// 実行して、何件処理されたかを受け取る
int rowsAffected = connection.Execute(sql, newUser);
Console.WriteLine(rowsAffected + "件のデータを追加しました。");
}
このように、C#で作ったデータの塊を、そのままデータベースに流し込めるのがDapperの強みです。難しい変換処理を人間が書く必要はありません。
7. リレーション(関連性)のある複雑なデータ
実際の開発では、一つのデータだけでなく「ユーザー」と「その人が投稿した記事」のように、複数の表が関連し合っているデータを扱うことがよくあります。これをリレーションと呼びます。Dapperはこのような複雑なデータも、少し工夫するだけで上手に扱うことができます。
「マルチマッピング」という機能を使うと、複数の表から取得したデータを、それぞれのクラスに自動で振り分けてくれます。初心者のうちは少し難しく感じるかもしれませんが、「複数の箱を同時に満たせる機能があるんだな」くらいに思っておけば大丈夫です。
データベース操作に慣れてくると、この柔軟性が非常に役立つことに気づくでしょう。型安全(データ型が正しいことを保証する仕組み)を保ちつつ、直感的にデータを組み合わせて取得できるのは、Dapperならではの使い勝手の良さです。
8. Entity Frameworkとの使い分けのコツ
C#の世界には、Dapperの他にEntity Framework(EF)という非常に強力なORMが存在します。よく「どちらを使えばいいの?」という議論になりますが、実は両方を組み合わせて使うことも多いです。
Entity Frameworkは、SQLを全く書かなくてもデータベース操作ができるほど多機能ですが、その分学習コストが高く、動作もDapperに比べると少しゆっくりです。一方で、Dapperはシンプルで速いですが、SQLを書く必要があります。そのため、大規模な開発で「ここは絶対にスピードが大事だ!」という部分にだけDapperを採用する、という使い分けが一般的です。
初心者の皆さんは、まずはDapperでSQLの書き方とデータの流れを学ぶことをおすすめします。基礎がしっかり身につけば、どんなツールも使いこなせるようになります。
9. 学習を進めるための最初の一歩
これからDapperを使いこなすために、まずは簡単なコンソールアプリケーションを作ってみるのが一番の近道です。パソコンの黒い画面(ターミナルやコマンドプロンプト)に文字を出すだけのプログラムでも、実際にデータベースとつながってデータが表示された瞬間の感動はひとしおです。
まずは「NuGet(ニューゲット)」という、C#の便利な部品をダウンロードするツールを使って、Dapperをプロジェクトに追加してみましょう。それだけで、あなたの書くプログラムがデータベースを自在に操る力を持つようになります。
プログラミングは、一つ一つの積み重ねです。最初は意味がわからない単語が多くても、実際に指を動かしてコードを書いていくうちに、「あ、そういうことか!」とパズルのピースがはまる瞬間が必ずやってきます。まずは気楽に、楽しみながらコードを書いてみてくださいね。