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を書いている。)