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

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

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

簡単にDBを操作できるライブラリを探している中で、
DapperをベースにしたDeclarativeSqlというライブラリを見つけ
触ってみたので、記事として残しておきます。
Dapperの時と同じく、サンプルコードはC#で書いています。

お品書き

DeclarativeSqlとは

以下URLでどうぞ。
GitHub - xin9le/DeclarativeSql: Attribute-based database access
blog.xin9le.net

更新情報はこちらからも。
blog.xin9le.net
DeclarativeSql v0.2.2 リリース - xin9le.net

インストール

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

Install-Package DeclarativeSql.Core
Install-Package DeclarativeSql.Dapper

簡単な操作方法

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

使用しているEntityクラス

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

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 connection = DbProvider.CreateConnection(DbKind.Oracle, ConfigurationManager.ConnectionStrings[connectionName].ConnectionString))
{
    try
    {
        // 接続開始
        connection.Open();
        // トランザクション開始
        using (var transaction = connection.BeginTransaction())
        {
            // SQL文無しでSelect
            var rowsNonSQL = transaction.Select<USER_MASTER>(col => col.USER_ID == "0001");
            // SQL文有りでSelect
            var sql = @"SELECT * FROM USER_MASTER WHERE USER_ID = :USER_ID";
            var bindObj = new USER_MASTER() { USER_ID = "0001" };
            var rowsSQL = transaction.Query<USER_MASTER>(sql, bindObj);
        }
    }
    finally
    {
        // 接続切断
        connection.Close();
    }
}

Insert

// 接続情報作成
using (var connection = DbProvider.CreateConnection(DbKind.Oracle, ConfigurationManager.ConnectionStrings[connectionName].ConnectionString))
{
    try
    {
        // 接続開始
        connection.Open();
        // トランザクション開始
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                // SQL文無しでInsert
                // Insert用インスタンス作成
                var insertObjNonSQL = new USER_MASTER() { USER_ID = "9999", DEPT_NO = "9999" };
                // Insert
                var resultNonSQL = transaction.Insert(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実行
                var resultSQL = transaction.Execute(sql, insertObjSQL);

                // コミット
                transaction.Commit();
            }
            catch
            {
                // ロールバック
                transaction.Rollback();
                throw;
            }
        }
    }
    finally
    {
        // 接続切断
        connection.Close();
    }
}

Update

// コネクションやトランザクション関係の前処理(省略)
// SQL文無しでUpdate
// Update用インスタンス作成
var updateObjNonSQL = new USER_MASTER() { USER_ID = "9999", USER_NAME = "HOGE" };
// Update
var resultNonSQL = transaction.Update(updateObjNonSQL, col => col.USER_ID == updateObjNonSQL.USER_ID);

// 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" };
// Update実行
var resultSQL = transaction.Execute(sql, updateObjSQL);
// コネクションやトランザクション関係の後処理(省略)

Delete

// コネクションやトランザクション関係の前処理(省略)
// SQL文無しでDelete
// Delete
var resultNonSQL = transaction.Delete<USER_MASTER>(col => col.USER_ID == "9999");

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


DeclarativeSqlもDapperと同じくコネクション作成やらトランザクション開始やらの
お決まりのコードをどうにかしてやりたい感じですね。
でも、コネクション作成の作業が簡略化されていたり、
簡単な操作ならSQL文を書かなくても良かったり、利便性は確実に上がっています!
これは業務でも使いたいですね。
(今はすべてSQLを書いている。)