Dapper的基本使用


Dapper是.NET下一個micro的ORM,它和Entity Framework或Nhibnate不同,屬於輕量級的,並且是半自動的。也就是說實體類都要自己寫。它沒有復雜的配置文件,一個單文件就可以了。給出官方地址。

http://code.google.com/p/dapper-dot-net/

個人覺得他非常好用,現在已經取代了原來的SqlHelper。優點:

  1. 使用Dapper可以自動進行對象映射!
  2. 輕量級,單文件。
  3. 支持多數據庫。
  4. Dapper原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象。

網上還有對Dapper的擴展類,這里就不贅述了。下面只講下簡單的增刪改查、數據庫表間的對應關系和事務的應用。

先給出實體類的關系:

 書和書評是1---n的關系。(沿用Entity Framework的實體類,virtual表示延遲加載,此處忽略)

//
public class Book
    {
        public Book()
        {
            Reviews = new List<BookReview>();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual List<BookReview> Reviews { get; set; }
        public override string ToString()
        {
            return string.Format("[{0}]------《{1}》", Id, Name);
        }
    }

//書評
 public class BookReview
    {
        public int Id { get; set; }
        public int BookId { get; set; }
        public virtual string Content { get; set; }
        public virtual Book AssoicationWithBook { get; set; }
        public override string ToString()
        {
            return string.Format("{0})--[{1}]\t\"{3}\"", Id, BookId, Content);
        }
    }
  • 基本的增刪改查操作

  由於Dapper ORM的操作實際上是對IDbConnection類的擴展,所有的方法都是該類的擴展方法。所以在使用前先實例化一個IDBConnection對象。

IDbConnection conn = new SqlConnection(connString);

Insert

 Book book = new Book();
 book.Name="C#本質論";
 string query = "INSERT INTO Book(Name)VALUES(@name)";
//對對象進行操作
 conn.Execute(query, book);
//直接賦值操作
 conn.Execute(query, new {name = "C#本質論"});

update

string query = "UPDATE Book SET  Name=@name WHERE id =@id";
 conn.Execute(query, book);

delete

string query = "DELETE FROM Book WHERE id = @id";
conn.Execute(query, book);
conn.Execute(query, new { id = id });

query

 string query = "SELECT * FROM Book";
//無參數查詢,返回列表,帶參數查詢和之前的參數賦值法相同。
 conn.Query<Book>(query).ToList();

 //返回單條信息
 string query = "SELECT * FROM Book WHERE id = @id";
 book = conn.Query<Book>(query, new { id = id }).SingleOrDefault();     
  • 數據庫表對應關系操作
//查詢圖書時,同時查找對應的書評,並存在List中。實現1--n的查詢操作
string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id";
Book lookup = null;
//Query<TFirst, TSecond, TReturn>
 var b = conn.Query<Book, BookReview, Book>(query,
  (book, bookReview) =>
  {
     //掃描第一條記錄,判斷非空和非重復
    if (lookup == null || lookup.Id != book.Id)
      lookup = book;
    //書對應的書評非空,加入當前書的書評List中,最后把重復的書去掉。
    if (bookReview != null)
      lookup.Reviews.Add(bookReview);
     return lookup;
  }, new { id = id }).Distinct().SingleOrDefault();
return b;
//1--1操作 
BookReview br;
string query = "SELECT * FROM BookReview WHERE id = @id";
using (conn)
{
   br = conn.Query<BookReview, Book, BookReview>(query,
  (bookReview, book) =>
   {
    bookReview.AssoicationWithBook = book;
    return bookReview;
   }, new { id = id }).SingleOrDefault();
  return br;
}
  • 事務操作
using (conn)
{
//開始事務
IDbTransaction transaction = conn.BeginTransaction();
  try
  {
    string query = "DELETE FROM Book WHERE id = @id";
    string query2 = "DELETE FROM BookReview WHERE BookId = @BookId";
    conn.Execute(query2, new { BookId = id }, transaction, null, null);
    conn.Execute(query, new { id = id }, transaction, null, null);
    //提交事務
    transaction.Commit();
  }
  catch (Exception ex)
  {
    //出現異常,事務Rollback
    transaction.Rollback();
    throw new Exception(ex.Message);
  }
}

后續文章

  1. 利用Dapper ORM搭建三層架構
  2. Stackoverflow/dapper的Dapper-Extensions用法(一)

由於自己的畢設也是用它來寫的,所以放出來,可以作為一個實例來參考一下。

sql server2012 + dapper + asp.net mvc4 + easyUI的葯庫管理系統,有興趣的可以star一下哦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM