轻型的ORM类Dapper

简介:

Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll。官方站点http://code.google.com/p/dapper-dot-net/ ,也可以通过Nuget进行安装


25211657-dbfcec96da564952a4c391c14422c44

Dapper很快。Dapper的速度接近与IDataReader。
Dapper支持主流数据库 Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库
支持多表并联的对象。支持一对多 多对多的关系,并且没侵入性。
原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象
Dapper语法十分简单。并且无须迁就数据库的设计
Query()方法:
Query()是IDbConnection扩展方法并且重载了,从数据库里提取信息,并用来填充我们的业务对象模型。

var counters = new List<Tuple<int, PerformanceCounter>>(); 
                using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString)) 
                { 
                    conn.Open(); 
                    string sql = string.Format("select Id,ServiceName,CategoryName,CounterName,InstanceName from service_counters where MachineName='{0}'",machineName); 
                    foreach (var counter in conn.Query<ServiceCounter>(sql)) 
                    { 
                        logger.InfoFormat(@"Creating performance counter: {0}\{1}\{2}\{3}", counter.MachineName ?? ".", counter.CategoryName, 
                                            counter.CounterName, counter.InstanceName); 
                        var perfCounter = new PerformanceCounter(counter.CategoryName, counter.CounterName, counter.InstanceName, counter.MachineName ?? "."); 
                        counters.Add(new Tuple<int, PerformanceCounter>(counter.Id, perfCounter)); 
                        // first value doesn't matter so we should call the counter at least once 
                        try { perfCounter.NextValue(); } 
                        catch { } 
                    } 
                }

下面是ServiceCounter的定义

public class ServiceCounter 
{ 
    public int Id { get; set; }

    public String ServiceName { get; set; }

    public String MachineName { get; set; } 
    public String CategoryName { get; set; } 
    public String CounterName { get; set; } 
    public String InstanceName { get; set; }

    public String DisplayName { get; set; } 
    
    public String DisplayType { get; set; }

    public override String ToString() 
    { 
        return String.Format(@"{0}\{1}\{2}\{3}", MachineName ?? ".", CategoryName, CounterName, InstanceName); 
    } 
}

Dapper也可以加载填充嵌套对象,考虑这样一种情形,考虑到新闻的类别属性,返回类别对象。

1,在填充嵌套对象的时候,只好执行ToList<>方法,否则回报ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭,而单个对象不会报错,估计是using结束后关闭了连接,而嵌套对象在map的时候又执行了ExecuteReader,只好在using结束之前返回list集合。
2,嵌套对象的参数是比较多的,主要是前两个参数,其它参数没用可以设置为null。特别要注意的是splitOn,这个参数不能为空,否则会报对象为引用的错误。【splitOn参数的意思是读取第二个对象的的分割列,从哪个列起开始读取第二个对象,如果表里的自增长列都为Id,可以设置这个参数为”Id”】.

Execute方法:
正如Query方法是检索数据的,Execute方法不会检索数据,它与Query方法非常相似,但它总返回总数(受影响的行数),而不是一个对象集合【如:insert update和delete】.

private void SaveServiceSnapshots(IEnumerable<ServiceCounterSnapshot> snapshots) 
        { 
            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString)) 
            { 
                conn.Open(); 
                foreach (var snapshot in snapshots) 
                { 
                    // insert new snapshot to the database 
                   conn.Execute( 
    @"insert into service_counter_snapshots(ServiceCounterId,SnapshotMachineName,CreationTimeUtc,ServiceCounterValue) values ( 
        @ServiceCounterId,@SnapshotMachineName,@CreationTimeUtc,@ServiceCounterValue)", snapshot); 
                }

            } 
        }

ServiceCounterSnapshot的定义如下:

public class ServiceCounterSnapshot 
{ 
    public int Id { get; set; }

    public int ServiceCounterId { get; set; }

    /// <summary> 
    /// Machine on which the snapshot was taken. 
    /// </summary> 
    public String SnapshotMachineName { get; set; }

    public DateTime CreationTimeUtc { get; set; }

    public float? ServiceCounterValue { get; set; } 
}

A Look at Dapper.NET

关于Dapper的一些使用和扩展的例子

给力分享新的ORM => Dapper

本文来自云栖社区合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

目录
相关文章
|
5月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
76 2
|
7月前
|
SQL 开发框架 .NET
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
2092 0
|
10月前
|
SQL 存储 前端开发
Django框架ORM操作(一)
Django框架ORM操作(一)
125 0
Django框架ORM操作(一)
|
10月前
|
Oracle 关系型数据库 MySQL
Django框架ORM操作(二)
Django框架ORM操作(二)
119 0
|
SQL XML 缓存
认识 ORM 框架 Hibernate,为什么 2022 年了还在谈论它?
前言 Hibernate 作为一种全自动 ORM 框架,在几年前常与 Spring、Struts2 一起使用,并称 SSH,作为主流的企业级应用框架。伴随着 MyBatis 的诞生,以及 Hibernate 本身的一些缺陷,如今 Hibernate 已经慢慢淡出了大家的视野。
1016 0
认识 ORM 框架 Hibernate,为什么 2022 年了还在谈论它?
|
SQL 关系型数据库 MySQL
Django框架之ORM
Django框架之ORM
118 0
Django框架之ORM
|
SQL 关系型数据库 C#
.NET(C#)有哪些主流的ORM框架,SqlSugar,Dapper,EF还是...
前言 在以前的一篇文章中,为大家分享了《什么是ORM?为什么用ORM?浅析ORM的使用及利弊》。那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)还是ServiceStack.OrmLite?或者是你还有更好的ORM推荐呢? 如果有的话,不防也一起分享给大家。
15941 0
|
SQL NoSQL PHP
Thinkphp中模型的正确使用方式,ORM的思想概念
对象-关系映射(OBJECT-RELATIONAL MAPPING,简称ORM) 这是在面向对象编程发展过程中演变出来的一种思想、行为概念。 主要用途是:把对象模型表示的对象映射到基于sql的关系模型数据库结构中去。 当改变这个对象自身的属性或者调用该对象的方法时,相对应的是执行某些sql语句。 这样子编写代码的人员就可以更好地编写业务逻辑,而非重复地编写增删改查sql语句。
287 0
|
SQL 关系型数据库 MySQL
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
241 0
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
|
SQL 前端开发 .NET
Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
原文:Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货) 接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理。
1221 0