[.Net]輕量ORM——Dapper

      Dapper只有一個代碼文件,徹底開源,你能夠放在項目裏的任何位置,來實現數據到對象的ORM操做,體積小速度快。 使用ORM的好處是增、刪、改很快,不用本身寫sql,由於這都是重複技術含量低的工做,還有就是程序中大量的從數據庫中讀數據而後建立model,併爲model字段賦值。這些ORM均可以輕鬆給你搞定。ORM給咱們開發帶來便利時,性能也是一個讓咱們不得不考慮的問題。通常的ORM性能和直接寫原生的sql比都差很多,可是Dapper性能還很錯,甚至和DbHelperSQL方式性能高出不少。html

下載地址:https://github.com/StackExchange/dapper-dot-netgit

假如你喜歡原生的Sql語句,又喜歡ORM的簡單,那你必定會喜歡上Dapper這款ROM。github

Dapper的優點:

  1. Dapper是一個輕型的ORM類。代碼就一個SqlMapper.cs文件,編譯後就40K的一個很小的Dll.
  2. Dapper很快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。
  3. Dapper支持什麼數據庫。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的數據庫,固然若是你知道原理也可讓它支持Mongo db
  4. Dapper的r支持多表並聯的對象。支持一對多 多對多的關係。而且沒侵入性,想用就用,不想用就不用。無XML無屬性。代碼之前怎麼寫如今還怎麼寫。
  5. Dapper原理經過Emit反射IDataReader的序列隊列,來快速的獲得和產生對象。性能實在高高。
  6. Dapper支持net2.0,3.0,3.5,4.0。【若是想在Net2.0下使用,能夠去網上找一下Net2.0下如何配置運行Net3.5便可。】
  7. Dapper語法十分簡單。而且無須遷就數據庫的設計。

Dapper的安裝

    在nuget裏面搜索Dapper
Dapper
點擊」安裝「,會下載Dapper.dll,並把引用 添加到項目中。

Dapper的使用

下面介紹Dapper如何使用,來進行高效開發,如下操做dapper是編譯後在Net4.0下操做的例子。

一、定義一個Person類對應數據庫的Person表

CREATE TABLE [Person](
	[id] [int] IDENTITY(5,1) NOT NULL primary key nonclustered,
	[username] [nvarchar](100) NULL,
	[password] [nvarchar](100) NULL,
	[age] [int] NULL,
	[registerDate] [datetime] NULL,
	[address] [nvarchar](150) NULL
)

public class Person
{
        public int id { get; set; }
        public string username { get; set; }
        public string password { get; set; }
        public int age { get; set; }
        public DateTime registerDate { get; set; }
        public string address { set; get; }
}

二、定義鏈接數據庫字符串

public static string ConnString = "Server=.;Database=Test1;uid=sa;pwd=sa;";

三、獲取id大於2的全部Person,Dapper返回類型是List類型

public static List<Person> GetPersonList()
 {
        using (var conn = new System.Data.SqlClient.SqlConnection(ConnString))
        {
             conn.Open();
             var a = conn.Query<Person>("select * from Person where id>@id", new { id = 2 });
             conn.Close();
             return a.ToList();
        }
 }

這樣返回的是List類型,能夠充分利用linq的好處。

四、Dapper批量插入數據

public static void Execute()
{
	using (var conn = new SqlConnection(ConnString))
	{
		conn.Open();
		var r=conn.Execute(@"insert Person(username, password,age,registerDate,address) values (@a, @b,@c,@d,@e)",
		[] { 
			new { a = 1, b = 1, c = 1, d = DateTime.Now, e = 1 }
			, new { a = 2, b = 2, c = 2, d = DateTime.Now, e = 2 }
			, new { a = 3, b = 3, c = 3, d = DateTime.Now, e = 3 } 
		}
                conn.Close();
         }
 );

執行上面方法會插入3條記錄,這樣sql能夠靈活的控制,參數不用像ADO.Net那樣聲明每一個參數,
最後還要把參數集合賦值給ADO的命令。能夠看出這樣簡潔多了。

五、Dapper修改數據,update

public static bool Update()
{
    using (var conn = new SqlConnection(ConnString))
    {
        conn.Open();
        var r = conn.Execute(@"update Person set password='www.lanhuseo.com' where username=@username", new { username = 2 });
        conn.Close();
        return r > 0;
    }
}

六、Dapper刪除數據

public static bool Delete()
{
	using (var conn = new SqlConnection(ConnString))
	{
		conn.Open();
		var r = conn.Execute(@"delete from Person where id=@id", new { id = 2 });
		conn.Close();
		return r > 0;
	}
}

七、Dapper使用事務

using (var conn = new SqlConnection(ConnString))
{
	conn.Open();
	IDbTransaction trans = conn.BeginTransaction();
	int row = conn.Execute(@"update Person set password='www.lanhuseo.com' where id=@id", new { id = 3 }, trans, null, null);
	row += conn.Execute("delete from Person where id=@id", new { id = 5 }, trans, null, null);
	trans.Commit();
}

八、Dapper集合批量插入

public static int InsertMultiple<T>(string sql, IEnumerable<T> entities, string connectionName = null) where T : class, new()
{
    using (SqlConnection cnn = GetOpenConnection(connectionName))
    {
        int records = 0;
        using (var trans = cnn.BeginTransaction())
        {
            try
            {
                cnn.Execute(sql, entities, trans, 30, CommandType.Text);
            }
            catch (DataException ex)
            {
                trans.Rollback();
                throw ex;
            }
            trans.Commit();
        }
        //foreach (T entity in entities)
        //{
        //    records += cnn.Execute(sql, entity);
        //}
        return records;
    }
}
Dapper支持集合的插入,集合提交是一句直接的插入命令,因此速度會快不少。

經過上面的實例能夠看到sql語句徹底是咱們本身控制,對於對EF和NHibernate這些自動給咱們生成sql語句的
這種機制不爽的同窗就有福利了,我我的以爲這個Dapper和iBatis.Net機制都差很少,都是sql語句都是徹底由程
序員本身寫,框架自身只負責數據轉換成咱們須要的Model相關的對象,這樣程序性能獲得了保證,可是也有一
個很差的地方的全部的sql語句都要本身寫,好比增、刪、查、改,若是一個項目有上百個表,工做量也不小,還
好有代碼生成器把咱們解放出來,例如:Codesmith。Dapper和iBatis.Net是大的區別是,Dapper更加簡單和輕量,
不用像iBatis.Net配置xml文件。

疑問:

     看了上面對 Dapper 的簡單介紹,相信你必定躍躍欲試了 。不過筆者初識 Dapper 的時候,腦海裏產生了兩個疑問:第一,Dapper 查詢數據庫時傳參使用的是一個對象,文章例子中是將這個對象看成匿名對象進行處理的,這樣很方便。可是如果查詢條件是可變的呢?根據不一樣的查詢參數去查詢不一樣的結果集,怎麼作到傳參可變呢?第二,增刪改查 Dapper 提供的很全,可是現實業務中在插入數據時有不少地方須要獲得(返回)插入數據的數據庫標識,這個又該如何實現呢?筆者將在後續的博客中進行探討。

參考資料:
相關文章
相關標籤/搜索