.net平台性能很不错的轻型ORM类Dapper(转)

news/2024/9/15 21:34:59/

.net平台性能很不错的轻型ORM类Dapper

Posted By : 蓝狐
Updated On : 2016-04-22 23:16

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

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

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

 

相关dapper实际项目源码下载:

基于ASP.NET MVC5和dapper的SEO关键词按天计费系统源码

dapper ASP.NET MVC5 sql文章&博客网站源码

mvc5 dapper bootstrap2通用权限后台管理系统源码

 

 

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表

  1. CREATE TABLE [Person](
  2. [id] [int] IDENTITY(5,1) NOT NULL primary key nonclustered,
  3. [username] [nvarchar](100) NULL,
  4. [password] [nvarchar](100) NULL,
  5. [age] [int] NULL,
  6. [registerDate] [datetime] NULL,
  7. [address] [nvarchar](150) NULL
  8. )
  1. public class Person
  2. {
  3. public int id { get; set; }
  4. public string username { get; set; }
  5. public string password { get; set; }
  6. public int age { get; set; }
  7. public DateTime registerDate { get; set; }
  8. public string address { set; get; }
  9. }

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

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

3、获取id大于2的所有Person,dapper返回类型是List类型

  1. public static List<Person> GetPersonList()
  2. {
  3. using (var conn = new System.Data.SqlClient.SqlConnection(ConnString))
  4. {
  5. conn.Open();
  6. var a = conn.Query<Person>("select * from Person where id>@id", new { id = 2 });
  7. conn.Close();
  8. return a.ToList();
  9. }
  10. }

这样返回的是List类型,可以充分利用linq的好处。

4、dapper批量插入数据

  1. public static void Execute()
  2. {
  3. using (var conn = new SqlConnection(ConnString))
  4. {
  5. conn.Open();
  6. var r=conn.Execute(@"insert Person(username, password,age,registerDate,address) values (@a, @b,@c,@d,@e)",
  7. new [] {
  8. new { a = 1, b = 1, c = 1, d = DateTime.Now, e = 1 }
  9. , new { a = 2, b = 2, c = 2, d = DateTime.Now, e = 2 }
  10. , new { a = 3, b = 3, c = 3, d = DateTime.Now, e = 3 }
  11. }
  12.                 conn.Close();
  13.          }
  14.  );

执行上面方法会插入3条记录,这样sql可以灵活的控制,参数不用像ADO.Net那样声明每个参数,最后还要把参数集合赋值给ADO的命令。可以看出这样简洁多了。

5、dapper修改数据,update

  1. public static bool Update()
  2. {
  3.     using (var conn = new SqlConnection(ConnString))
  4.     {
  5.         conn.Open();
  6.         var r = conn.Execute(@"update Person set password='www.lanhuseo.com' where username=@username", new { username = 2 });
  7.         conn.Close();
  8.         return r > 0;
  9.     }
  10. }

6、dapper删除数据

  1. public static bool Delete()
  2. {
  3. using (var conn = new SqlConnection(ConnString))
  4. {
  5. conn.Open();
  6. var r = conn.Execute(@"delete from Person where id=@id", new { id = 2 });
  7. conn.Close();
  8. return r > 0;
  9. }
  10. }

7、dapper使用事务

  1. using (var conn = new SqlConnection(ConnString))
  2. {
  3. conn.Open();
  4. IDbTransaction trans = conn.BeginTransaction();
  5. int row = conn.Execute(@"update Person set password='www.lanhuseo.com' where id=@id", new { id = 3 }, trans, null, null);
  6. row += conn.Execute("delete from Person where id=@id", new { id = 5 }, trans, null, null);
  7. trans.Commit();
  8. }

8、dapper集合批量插入

  1. public static int InsertMultiple<T>(string sql, IEnumerable<T> entities, string connectionName = null) where T : class, new()
  2. {
  3. using (SqlConnection cnn = GetOpenConnection(connectionName))
  4. {
  5. int records = 0;
  6. using (var trans = cnn.BeginTransaction())
  7. {
  8. try
  9. {
  10. cnn.Execute(sql, entities, trans, 30, CommandType.Text);
  11. }
  12. catch (DataException ex)
  13. {
  14. trans.Rollback();
  15. throw ex;
  16. }
  17. trans.Commit();
  18. }
  19. //foreach (T entity in entities)
  20. //{
  21. // records += cnn.Execute(sql, entity);
  22. //}
  23. return records;
  24. }
  25. }

Dapper支持集合的插入,集合提交是一句直接的插入命令,所以速度会快很多。

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

我自从认识了Dapper,如果项目性能要求比较高的情况下,我会首先考虑用Dapper,Dapper简单、轻量以以对sql语句的完全控制的特性,让我感觉相见恨晚。

转载于:https://www.cnblogs.com/LiZhongZhongY/p/10864132.html


http://www.ppmy.cn/news/610576.html

相关文章

vim的简单介绍与使用

1、vi的基本概念   基本上vi可以分为三种状态&#xff0c;分别是命令模式&#xff08;command mode&#xff09;、插入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08;last line mode&#xff09;&#xff0c;各模式的功能区分如下&#xff1a; 1) 命令行模式…

Expected a string but was BEGIN_OBJECT at line 1 column 2 path $

刚才使用Retrofit 写请求的时候发现了这行错误 看英文我解析String 但是却是Object 这个处理方法就是把String 该为JSONObject 即可 如下。。 //请求传递参数Call<JSONObject> data netApi.getNews("top","b3aecf831dae022145e308abe1af773a");/…

在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理

在NVIDIA&#xff08;CUDA&#xff0c;CUBLAS&#xff09;和Intel MKL上快速实现BERT推理 直接在NVIDIA&#xff08;CUDA&#xff0c;CUBLAS&#xff09;或Intel MKL上进行高度定制和优化的BERT推理&#xff0c;而无需tensorflow及其框架开销。 仅支持BERT&#xff08;转换器&a…

PHP-Trie树应用

一、Trie树简介 什么是Trie树&#xff1f; Trie树&#xff0c;即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计和排序大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常…

【计算机网络】物理层

0.概念 1.物理层下面的传输媒体 2.传输方式 3.编码与调制 常用编码 题目 基本调制方法 4.信道的极限容量 题目

mysql索引空间太大_MySQL优化索引

1. MySQL如何使用索引索引用于快速查找具有特定列值的行。如果没有索引&#xff0c;MySQL必须从第一行开始&#xff0c;然后遍历整个表以找到相关的行。表越大&#xff0c;花费越多。如果表中有相关列的索引&#xff0c;MySQL可以快速确定要在数据文件中间查找的位置&#xff…

Retrofit 找不到ScalarsConverterFactory

这个是因为引入库少了 implementation com.squareup.retrofit2:converter-scalars:2.3.0 把库引入就好了

php laravel 环境搭建

最近上一个新项目,时间比较紧,为了满足业务需求,没有办法,只有上我大 php 了,找了一个带些基础的数据结构,用的是 laravel 搭建的,然后寻坑就开始了,先是构建 docker 镜像就坑了,然后再是 composer 网上找的全量的,慢得要死,后面在同事的的推荐下 https://packagist.laravel-ch…

适用于AMD ROC GPU的Numba概述

适用于AMD ROC GPU的Numba概述 Numba通过按照HSA执行模型将Python代码的受限子集直接编译到HSA内核和设备功能中&#xff0c;从而支持AMD ROC GPU编程。用Numba编写的内核似乎可以直接访问NumPy数组。 术语 以下列出了HSA编程主题中的几个重要术语&#xff1a; 内核&#x…

VMware14安装CentOS7的详细教程

本篇文章主要介绍了VMware安装Centos7超详细过程&#xff08;图文&#xff09;&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件&#xff1a;推荐使用VMwear&#xff0c;我用的是VMwear 12 镜像&#xff1a;CentOS7 ,如果没有镜像…

Retrofit 找不到 GsonConverterFactory

这个是因为少引入了库 implementation com.squareup.retrofit2:converter-gson:2.4.0 把库引入就可以了

Spring拦截器实现鉴权

什么是拦截器&#xff1f; 拦截器&#xff08;Interceptor&#xff09;类似于Servlet中的过滤器&#xff0c;主要用于拦截用户请求并做出相应的处理&#xff0c;例如拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。拦截器允许自定义预处理(Pre-Processing)…

批量新建文件夹并命名_dos命令实现批量新建文件夹

1、批量新建文件夹&#xff08;使用命令&#xff1a;MD&#xff09;实现案例&#xff1a;假如我们要新建10个文件夹&#xff0c;这10个文件夹的名称分别是数字1-10来命名。以下详细步骤&#xff1a;1&#xff09;在excel表里面把需要批量新建的文件夹名字放到一列&#xff08;假…

图分析Rapids cuGraph

图分析Rapids cuGraph 英伟达&#xff08;Nvidia&#xff09;建立的新的开源库可能是推进分析和使图形数据库更快的秘密要素。 在Nvidia GPU上进行并行处理。 Nvidia很久以前就不再只是“仅仅”一家硬件公司。由于其硬件是支持AI火爆的大部分计算运行的要素&#xff0c;因此Nvi…

Retrofit 网络请求参数注解@Path @Field @Query 等使用

请求参数呢大致如下&#xff0c;到个别人的图&#xff0c; 下面就说下这些内容使用 其中 Path、Query、QueryMap 使用 Get 请求 &#xff0c; 加入使用了Post 请求注解使用Path 一般都会是项目崩溃的&#xff0c; 所以这里我总结了一下自己使用的经验 1 Path 会是url 中带有…

wamp的mysql单独使用_Windows 7+8.1+10 单独安装配置 PHP+Apache+MySQL(不使用 WAMP)

Windows 8.1 单独安装配置 PHPApacheMySQL(不使用 WAMP)本文同样适用于Windows7和100x00 PHP【下载】http://www.doczj.com/doc/b3aef488f18583d048645937.html/downloads.php注&#xff1a;选择线程安全的版本&#xff0c;留意 VC 支持库的版本&#xff0c;9、11、14 分别对应…

Word文档以两列的格式打开,类似于书本那样

按住Ctrl&#xff0c;向上滚动鼠标滚轮 转载于:https://www.cnblogs.com/bravesunforever/p/10877213.html

CentOS7环境搭建使用PhpStorm上传代码

一、虚拟机介绍 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。 虚拟系统通过生成现有操作系统的全新虚拟镜像&#xff0c;它具有真实windows系统完全一样的功能&#xff0c;进入虚拟系…

知识图:从图和数据库中获取知识

知识图&#xff1a;从图和数据库中获取知识 知识图到底是什么&#xff0c;以及关于它们的所有炒作是什么&#xff1f;如果想成为世界各地的Airbnbs&#xff0c;Amazon&#xff0c;Google和LinkedIn&#xff0c;那么学会区分真实的炒作&#xff0c;定义不同类型的图以及为用例选…

【复杂网络建模】——使用fsove求解非线性方程和导数

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…