_net平台性能很不错的轻型ORM类Dapper_heoo442的博客-程序员宝宝

技术标签: 网站与服务  性能  ORM  Dapper  

dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快。 使用ORM的好处是增、删、改很快,不用自己写sql,因为这都是重复技术含量低的工作,还有就是程序中大量的从数据库中读数据然后创建model,并为model字段赋值。这些ORM都可以轻松给你搞定。ORM给我们开发带来便利时,性能也是一个让我们不得不考虑的问题。一般的ORM性能和直接写原生的sql比都差不少,但是Dapper性能还很错,甚至和DbHelperSQL方式性能高出很多。

下载地址:https://github.com/StackExchange/dapper-dot-net

假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM。

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.dll,并把引用添加到项目中。

 

下面介绍Dapper如何使用,来进行高效开发,以下操作dapper是编译后在Net4.0下操作的例子。

1、定义一个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; }
}

2、定义连接数据库字符串

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

3、获取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的好处。

4、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的命令。可以看出这样简洁多了。

5、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 [email protected]", new { username = 2 });
        conn.Close();
        return r > 0;
    }
}

6、dapper删除数据

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

7、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 [email protected]", new { id = 3 }, trans, null, null);
       row += conn.Execute("delete from Person where [email protected]", new { id = 5 }, trans, null, null);
       trans.Commit();
}

8、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这些自动给我们生成sl语句的这种机制不爽的同学就有福利了,我个人觉得这个Dapper和iBatis.Net机制都差不多,都是sql语句都是完全由程序员自己写,框架自身只负责数据转换成我们需要的Model相关的对象,这样程序性能得到了保证,但是也有一个不好的地方的所有的sql语句都要自己写,比如增、删、查、改,如果一个项目有上百个表,工作量也不小,还好有代码生成器把我们解放出来,例如:Codesmith。Dapper和iBatis.Net是大的区别是,Dapper更加简单和轻量,不用像iBatis.Net配置xml文件。

自从我认识了这个Dapper,项目如果性能要求比较好的情况下我就会首先Dapper,Dapper简单和轻量让我感觉相见恨晚。

本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
转载请注明:文章转载自:蓝狐软件工作室 » .net平台性能很不错的轻型ORM类Dapper
本文标题:.net平台性能很不错的轻型ORM类Dapper
本文地址:http://www.lanhusoft.com/Article/26.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/heoo442/article/details/48445441

智能推荐

svn的批量update操作_zpjing~.~的博客-程序员宝宝

开发时,svn的项目目录太多,commit前需要update所有目录,正常情况下,可以一次选中多个目录,右键选择“SVN UPDATE”,但是很多时候并不想去打开项目目录,于是想了写了一个bat脚本,放在了桌面,可以批量一次更新自己想要更新的svn目录。文件内容为:TortoiseProc.exe /command:update /path:"d:/work/php/ats/*d:

Oracle 的关联子查询(correlated subquery) 简介._yiwuxia23的博客-程序员宝宝

这是一篇别人的博客摘录过来,供大家参考1. 什么是子查询这个很简单, 子查询就是嵌套在主查询里的查询了.例如, 在scott 模式下我想查找所有比Allen 工资高的员工我们可以写成这样:[sql] view plain copyselect a.* from emp a, emp b where a.sal > b.sal and b.ename = 'ALLEN' 当然上面

java mysql to dbf_MysqlToDbf_老男瓜的博客-程序员宝宝

iefans为用户提供的 这是一款DBF导入mysql工具。可以将mysql导入DBF数据库。另外,还采用了图形接口。操作简单方便。可以节省很多操作时间。另外,每天都有这样的操作的话,也可以设定好时间来执行。更多英文免安装版数据转换工具就在iefans查看下载!这里还可以找到MysqlToDbf,欢迎来下载。MysqlToDbf下载使用真的非常简单方便。MysqlToDbf功能介绍1、将mysql...

知网下载pdf论文_qq_28888837的博客-程序员宝宝

知网下载pdf论文现在又到了写大论文的时候,所以需要下载一些参考文献。知网是国内比较常用的论文数据库,但是其下载的格式是CAJ的,需要用CAJ阅读器阅读,但我发现这个阅读器一方面不够兼容(好像现在是全平台了,以前不可以),并且在windows端有一点卡顿,整体而言,体验没有pdf好,所以想要直接下载pdf格式的来阅读。这里给出几种方案。插件法chrome插件直接在chrome商店搜索cnki 科研助手下载即可,如果你无法访问商店,则可以通过一些国内的镜像,下载crx,然后导入即可。这里可以去http

关于被调函数形参:SqList L、SqList &L、SqList *L 的区别_Uncertainty!!的博客-程序员宝宝

C语言中没有引用,只有取地址&amp;C++语言中有引用&amp;,也有取地址&amp;(引用就是给变量起别名,对别名的操作就是对原变量的操作)首先要明白的两点:对顺序表的取值、查找操作,不需要对表内数据元素进行修改对顺序表的初始化、插入、删除操作,需要对表内数据元素进行修改1.某函数不需要对表内数据元素进行修改时,形参就使用SqList L对顺序表的取值操作Status GetElem(SqList L,int i,ElemType *e) //此函数没有对L作出改动,使用普通类型

【星球知识卡片】图像和视频超分辨都有哪些核心技术,如何对其长期深入学习..._言有三的博客-程序员宝宝

大家好,欢迎来到我们的星球知识小卡片专栏,本期给大家分享图像和视频超分辨相关的资源。作者&amp;编辑 | 言有三 1 基本的超分辨模型基本的超分辨模型根据上采样(upsampling)...

随便推点

pro7 plus android8,魅族PRO7 Plus是什么系统_魅族PRO7 Plus统更新-太平洋IT百科_weixin_39682511的博客-程序员宝宝

8月5号魅族将发布了pro7以及pro7 plus两款新机,那么魅族PRO7 Plus是什么系统?接下来为大家解答:魅族PRO7 Plus是什么系统?魅族PRO7 Plus的手机系统是基于Android 7.0,Flyme 6系统。魅族pro7 plus配备5.7寸2K分辨率主屏幕,以及一个1.9 英寸,分辨率240 × 536的副屏。Helio X30 处理器处理器,6GB运存。后置1200 万...

pwn-chanllege1-IO_file-XMAN_Peanuts_CTF的博客-程序员宝宝

##xman-个人排位赛###pwn-chanllege1-IO_file链接:https://pan.baidu.com/s/1vSrgF4iQ-2X6gQSciEPi9Q 密码:g2hc#####这是一道简单的io_file的题,通过这个题大概可以知道io_file的机制,总的来说其实就是控制fd指针导致最后指针指向我们需要控制的函数######先拖入ida:    __int6...

使用SqlSrv调用sqlserver的存储过程_kylin__z的博客-程序员宝宝

使用SqlSrv调用sqlserver的存储过程因为工作需要,我使用的环境是PHP5.6+Apache+Sqlserver2008 ,php用的框架CI ,这次需要执行一个存储过程,然后我在CI中没找到可以使用的方法. 后来我找到mssql .但是mssql只能在5.3以下的版本上使用, 之后我又找到了sqlsrv 可以在5.3以上的版本使用,下面给出用法: $serverName = "

Vue中全局变量Global_lxy123456780的博客-程序员宝宝_vue.global.js

src目录下创建一个api文件夹,api文件夹下创建global.jsglobal.js中:let color = { 'bgColor':'', 'xColor':'#4F5E94', 'fontC':'', 'barC':'#89C04B', }export default {color}在main.js中引入import Global from...

Activity的setContentView源码分析_小小葡萄干的博客-程序员宝宝

Activity的setContentView分析1.setContentView的简单的介绍我们知道Activity的setContentView方法实际上就是调用的是Window的setContentView方法,而Window是一个抽象类,Window的具体实现类时PhoneWindow。在PhoneWindow的setContentView方法中具体操作如下:public void setC

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 ,编程确定比赛的名次。_Angus_lxy的博客-程序员宝宝

问题描述:5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。问题分析:每人说对了一半可以表述如下:A说:(B == 2) + (A == 3) == 1B说:(B...

推荐文章

热门文章

相关标签