一、dapper框架优点

1、轻量级:dapper的核心代码只有带注释的500行左右,不依赖其他的扩展库,无需大量配置,非常轻量级。
2、高性能:相对于EF等ORM工具,dapper对于对象与关系库的映射采用的是动态反射的形式,所以能够用比其他ORM工具更少的时间,完成更多的数据操作。并且dapper在生成sql语句时采用了缓存池技术,能够大大减少创建对象的时间,且有很好的性能表现。
3、简单易用:dapper的API接口非常简单,不需要像NHibernate、EF等ORM工具那样有复杂的配置信息,学习成本低,能够快速上手。
二、dapper框架有必要吗
对于小型项目或者仅需进行基本的数据操作的项目来说,dapper是非常必要的,因为它轻量高效,不会给项目带来额外的负担,同时又能够快速完成数据操作。但是对于大型项目来说,需要考虑到维护的难度以及可扩展性等问题,需要慎重考虑是否使用dapper。
三、dapper框架底层实现
dapper的底层实现是采用了动态反射的形式,通过extractor来生成sql语句,并且采用了缓存技术进行优化。dapper支持多种类型的参数,应用了object-mapping技术,在应用程序和sql之间,对参数进行自动映射。
public static IEnumerable Query(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
{
        sql = SqlMapper.Patch(sql);
        var identity = new Identity(sql, commandType, cnn, typeof(T), param == null ? null : param.GetType(), null);
        var info = GetCacheInfo(identity);
        IDbCommand cmd = null;
        IDataReader reader = null;
        bool wasClosed = cnn.State == ConnectionState.Closed;
        try
        {
            cmd = SetupCommand(cnn, transaction, sql, info.ParamReader, param, commandTimeout, commandType);
            if (wasClosed) cnn.Open();
            reader = cmd.ExecuteReader(wasClosed ? CommandBehavior.CloseConnection : CommandBehavior.Default);
            var tuple = info.Deserializer;
            
            int hash = GetColumnHash(reader);
            if(tuple.Func == null || tuple.Hash != hash)
            {
                if (reader.FieldCount == 0) yield break;
                tuple =( IDataReader deserializer, int hash) SqlMapper.GetDeserializer(typeof(T), reader, 0, -1, false);
                if(info != null) SetQueryCache(identity, info.CloneWithDeserialized(tuple));
            }
            var func = tuple.Func;
            while (reader.Read())
            {
                yield return (T)func(reader);
            }
            while (reader.NextResult()) { }
            // happy path; close the reader cleanly - no
            reader.Dispose();
            reader = null;
            commandCount++;
            if(timeout) stopwatch.Stop(); // timeout / command timeout
            RecordExecution(identity, commandCount, stopwatch.ElapsedMilliseconds / 1000.0);
        }
        finally
        {
            if (reader != null)
            {
                if (!reader.IsClosed) try { cmd.Cancel(); }
                    catch { /* don't spoil the existing exception */ }
                reader.Dispose();
            }
            else if (cmd != null)
            {
                cmd.Dispose();
            }
            if (wasClosed) cnn.Close();
        }
}
  
四、dapper框架使用
使用dapper进行数据操作,首先需要创建一个IDbConnection连接对象,然后调用Execute、Query等方法来执行sql语句。具体使用方式如下所示:
string connectionString = "Data Source=.;Initial Catalog=TestDB;User ID=test;Password=test";
using (IDbConnection db = new SqlConnection(connectionString))
{
    db.Open();
    //执行Query操作
    var customers = db.Query("select * from Customers where CustomerID = @CustomerID", 
        new { CustomerID = "ALFKI" });
    
    //执行Execute操作
    db.Execute("insert into Customers(CustomerID, CompanyName) values(@CustomerID, @CompanyName)", 
        new { CustomerID = "Test", CompanyName = "Test Company" });
    db.Close();
}
 
五、dapper框架是什么意思
dapper的含义是慢跑的意思,因为框架的作者Sam Saffron对慢跑很着迷,所以取名为dapper。
六、dapper框架SQL注入
dapper框架可以防止sql注入,因为dapper会在执行sql语句时,自动对特殊字符进行转义,保证sql语句的安全性。示例代码如下:
string customerID = "ALFKI; Drop Table Customers";
var customer = connection.QuerySingleOrDefault("select * from Customers where CustomerID = @CustomerID", 
    new { CustomerID = customerID });
 
七、dapper是什么意思
dapper的含义是慢跑的意思,因为框架的作者Sam Saffron对慢跑很着迷,所以取名为dapper。
八、dapper官网
dapper的官方网站是:https://github.com/StackExchange/dapper-dot-net。
九、dapper品牌选取
dapper的品牌选取符合人性化的特点,能够使人产生好感。同时,品牌选取与框架作者的偏好也是有关系的。
            
            
      
      
                  
                  
                  
                  
                  
                    
                    
                    
                    
                    
                    
                    
                    
      
        
京公网安备 11010802030320号