[.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 提供的很全,可是现实业务中在插入数据时有不少地方须要获得(返回)插入数据的数据库标识,这个又该如何实现呢?笔者将在后续的博客中进行探讨。

参考资料:
相关文章
相关标签/搜索