ゆるふわエンジニアのブログ

行ったこと、調べたこと等をつらつらと書いていくかもしれません。

PetaPocoを触ってみた(導入、簡単な操作編)(Micro-ORM)

Micro-ORMのPetaPocoを触ってみたので、記事として残しておきます。
サンプルコードはすべてC#で書いています。

お品書き

PetaPocoについて

PetaPoco - Topten Software

インストール

以下のコマンドをパッケージマネージャコンソールで実行するだけです。

Install-Package PetaPoco -Version 5.1.244

バージョンを指定しないと古いバージョンのものが
インストールされてしまいますので、注意してください。
最新バージョンは以下URL先で確認することができます。
www.nuget.org

簡単な操作方法

コネクション作って、App.configの情報を元に接続して、
トランザクション開始して、各操作を行い、
最後に接続を切断しています。
Insert、Update、Deleteは、上記以外にコミット、ロールバックを行っていますね。
例外が発生しなければコミット、
例外が発生したらロールバックという実装にしています。

使用しているEntityクラス

クラス名はテーブル名と同じ、プロパティ名は列名と同じにしてあります。

class USER_MASTER
{
    public string USER_ID { get; set; }
    public string DEPT_NO { get; set; }
    public string USER_NAME { get; set; }
    public DateTime? CREATED_ON { get; set; }
    public DateTime? MODIFIED_ON { get; set; }
}

Select

// 接続情報作成、接続
using(var db = new Database(connectionName))
{
    try
    {
        // トランザクション開始
        db.BeginTransaction();
        
        // Select
        var sql = @"SELECT * FROM USER_MASTER";
        var rows = db.Query<USER_MASTER>(sql);
        // Select(単一レコード)
        var sqlSingleRecord = @"SELECT * FROM USER_MASTER WHERE USER_ID = @USER_ID";
        var row = db.Query<USER_MASTER>(sqlSingleRecord, new { USER_ID = "0001" });
        // Select(特定列)
        var sqlFirstColumn = @"SELECT COUNT(1) FROM USER_MASTER";
        var count = db.ExecuteScalar<int>(sqlFirstColumn);
    }
    finally
    {
        // トランザクション終了(コミット)
        db.CompleteTransaction();
    }
}

Insert

// 接続情報作成、接続
using (var db = new Database(connectionName))
{
    try
    {
        // トランザクション開始
        db.BeginTransaction();

        // SQL文無しでInsert
        // テーブル名
        var tableName = "USER_MASTER";
        // Insert用インスタンス作成
        var insertObjNonSQL = new USER_MASTER() { USER_ID = "9999", DEPT_NO = "9999" };
        // Insert実行
        db.Insert(tableName, insertObjNonSQL);

        // SQL文有りでInsert
        // SQL文作成
        var sql = @"INSERT INTO USER_MASTER ( USER_ID, DEPT_NO ) VALUES ( @USER_ID, @DEPT_NO)";
        // Insert用インスタンス作成
        var insertObjSQL = new USER_MASTER() { USER_ID = "8888", DEPT_NO = "8888" };
        // Insert実行
        db.Execute(sql, insertObjSQL);

        // コミット
        db.CompleteTransaction();
    }
    catch
    {
        // ロールバック
        db.AbortTransaction();
        throw;
    }
}

Update

コネクションやトランザクション関係の処理はInsertと同じなため、省略しています。

// コネクションやトランザクション関係の前処理(省略)
// SQL文無しでUpdate
// テーブル名
var tableName = "USER_MASTER";
// Update用インスタンス作成
var updateObjNonSQL = new USER_MASTER() { USER_ID = "9999", USER_NAME = "HOGE" };
// Update実行
db.Update(tableName, nameof(updateObjNonSQL.USER_ID), updateObjNonSQL);

// SQL文有りでUpdate
// SQL文作成
var sql = @"UPDATE USER_MASTER SET USER_NAME = @USER_NAME WHERE USER_ID = @USER_ID";
// Update用インスタンス作成
var updateObjSQL = new USER_MASTER() { USER_ID = "8888", USER_NAME = "FUGA" };
db.Execute(sql, updateObjSQL);
// コネクションやトランザクション関係の後処理(省略)

Delete

// コネクションやトランザクション関係の前処理(省略)
// SQL文無しでDelete
// テーブル名
var tableName = "USER_MASTER";
// Delete用インスタンス作成
var deleteObjNonSQL = new USER_MASTER() { USER_ID = "9999" };
// Delete実行
db.Delete(tableName, nameof(deleteObjNonSQL.USER_ID), deleteObjNonSQL);

// SQL文有りでDelete
// SQL文作成
var sql = @"DELETE FROM USER_MASTER WHERE USER_ID = @USER_ID";
// DElete用インスタンス作成
var deleteObjSQL = new USER_MASTER() { USER_ID = "8888" };
// Delete実行
db.Execute(sql, deleteObjSQL);
// コネクションやトランザクション関係の後処理(省略)


いろいろと隠蔽されており、若干コードがスッキリしますね。
Attriubteを使っていないのでアレコレ書いていますが、
Attirbuteを使うとSQL文無しでのInsert、Update、Delete時に
テーブル名や主キー列を指定してやらなくてもよくなるので、
かなり楽にかつ短くコーディングできそうです。

あと、バインド変数の記号がすべて"@"っぽいんですけども、
もしかしてDBの種類に関係なく"@"...?