Dapperは、.NETプラットフォーム向けの軽量なオブジェクト関係マッピング(ORM)ツールです。本記事では、Dapperを使用してOceanBaseデータベースのMySQLモードに接続する方法について説明します。
前提条件
- .NET SDK 6.0以降のバージョンがインストール済みであること。
- Visual StudioまたはVS Codeがインストールされていること。
- OceanBaseデータベースがデプロイ済みで、MySQLモードのテナントが作成されていること。
手順
- 新しいプロジェクトを作成します。
- 必要なNuGetパッケージをインストールします。
- データベース接続を設定します。
- データモデルを作成します。
- データアクセス層を実装します。
- サンプルプログラムを実行します。
ステップ1:新しいプロジェクトを作成する
ターミナルを開き、以下のコマンドを実行して新しいコンソールアプリケーションを作成します。
dotnet new console -n DapperOceanBaseDemo cd DapperOceanBaseDemo
ステップ2:必要なNuGetパッケージをインストールする
Dapper、MySQL Connectorおよび関連依存パッケージをインストールします。
# コアパッケージ dotnet add package Dapper dotnet add package MySql.Data # 関連設定 dotnet add package Microsoft.Extensions.Configuration --version 8.0.0 dotnet add package Microsoft.Extensions.Configuration.FileExtensions --version 8.0.0 dotnet add package Microsoft.Extensions.Configuration.Json --version 8.0.0 # パスワード暗号化 dotnet add package BCrypt.Net-Next --version 4.0.3
ステップ3:データベース接続を設定する
appsettings.jsonファイルを作成し、データベース接続文字列を追加します。{ "ConnectionStrings": { "DefaultConnection": "Server=your_server;Port=2881;Database=your_database;Uid=your_username;Pwd=your_password;" } }プロジェクトファイル(
.csproj)を修正し、appsettings.jsonが出力ディレクトリにコピーされていることを確認します。<ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
ステップ4:データモデルを作成する
Modelsフォルダを作成し、User.csクラスを追加します。namespace DapperOceanBaseDemo.Models; public class User { public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } public string PasswordHash { get; set; } public DateTime CreatedAt { get; set; } public DateTime? UpdatedAt { get; set; } }
ステップ5:データアクセス層の実装
Repositoriesフォルダを作成し、UserRepository.csクラスを追加します。using System.Data; using Dapper; using DapperOceanBaseDemo.Models; using Microsoft.Extensions.Configuration; using MySql.Data.MySqlClient; namespace DapperOceanBaseDemo.Repositories; public class UserRepository { private readonly string _connectionString; public UserRepository(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public async Task<User> GetUserByIdAsync(int id) { using IDbConnection db = new MySqlConnection(_connectionString); return await db.QueryFirstOrDefaultAsync<User>( "SELECT * FROM users WHERE Id = @Id LIMIT 1", new { Id = id }); } public async Task<int> CreateUserAsync(User user) { const string sql = @" INSERT INTO users (Username, Email, PasswordHash, CreatedAt, UpdatedAt) VALUES (@Username, @Email, @PasswordHash, @CreatedAt, @UpdatedAt); SELECT LAST_INSERT_ID();"; using IDbConnection db = new MySqlConnection(_connectionString); return await db.ExecuteScalarAsync<int>(sql, new { user.Username, user.Email, user.PasswordHash, CreatedAt = DateTime.UtcNow, UpdatedAt = (DateTime?)null }); } }
ステップ6:メインプログラムの実装
Program.cs ファイルを修正します:
using DapperOceanBaseDemo.Models;
using DapperOceanBaseDemo.Repositories;
using Microsoft.Extensions.Configuration;
using System.Text;
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var userRepository = new UserRepository(configuration);
// Create a new user
var newUser = new User
{
Username = "testuser",
Email = "test@example.com",
PasswordHash = BCrypt.Net.BCrypt.HashPassword("your_secure_password")
};
try
{
var userId = await userRepository.CreateUserAsync(newUser);
Console.WriteLine($"User created with ID: {userId}");
// Query the user
var user = await userRepository.GetUserByIdAsync(userId);
if (user != null)
{
Console.WriteLine($"Retrieved user: {user.Username}, Email: {user.Email}");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
データベーステーブルの作成
プログラムを実行する前に、OceanBaseデータベースに対応するテーブルが作成されていることを確認してください。
CREATE TABLE IF NOT EXISTS users (
Id INT AUTO_INCREMENT PRIMARY KEY,
Username VARCHAR(50) NOT NULL,
Email VARCHAR(100) NOT NULL UNIQUE,
PasswordHash VARCHAR(255) NOT NULL,
CreatedAt DATETIME NOT NULL,
UpdatedAt DATETIME NULL,
INDEX idx_email (Email)
);
プログラムの実行
appsettings.jsonのデータベース接続文字列が更新されていることを確認します。ターミナルで次のコマンドを実行します:
dotnet run