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の種類に関係なく"@"...?