千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Dapper框架用法介绍

Dapper框架用法介绍

来源:千锋教育
发布人:xqq
时间: 2023-11-22 07:25:56 1700609156

一、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的品牌选取符合人性化的特点,能够使人产生好感。同时,品牌选取与框架作者的偏好也是有关系的。

tags: c#时间差
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT