什么是Dapper?


Dapper是一款轻量级的ORM框架,大名鼎鼎! 由谷歌Google 开发,在N款orm框架中 效率是最快的 最高的! 经过数据测试 比EF快 12-20 倍

国外最大的技术网站 stackoverflow 也是基于这个Orm框架开发的,并且非常简单。

为什么使用Dapper?


  1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
  2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
  3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  4. 可以映射一对一,一对多,多对多等多种关系。
  5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
  6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

正文


对Dapper做了简单介绍, 有关Dapper优点的文章网上一大堆, 这里小编就不再赘述啦!   进入正题 相信很多园友的公司都使用过微软的EF框架吧?

EF的优点太多了  “CodeFist代码优先”、" 不需要为数据访问编写所有需要的ADO.NET管道代码"、"使用C#代码来编写所有的数据访问逻辑而不是编写SQL查询和存储过程"等等....

但是最大的缺点就是过于臃肿 庞大  性能不咋地!很多公司都放弃采用这个框架选择使用自己封装的SqlHelper类或其它第三方orm框架

但是由于被EF惯坏了 让小弟觉得其它的ORM框架都没EF便捷 快速 于是小弟想能不能把现今最流行的Dapper改成类似EF的调用模式! 所以这篇博客出来了!

先看几个例子

操作数据表的数据

 --------------------------例子(一)------------------------

//Dapper原生 根据Id获取数据 string query = "SELECT * FROM Book WHERE id = @id"; book = conn.Query<Book>(query, new { id = id }).SingleOrDefault(); //经过小弟Dapper改装后 ;//根据Id查询数据 T_Example entity=_repExample.GetById(id);

--------------------------例子(二)----------------------------

//Dapper原生 获取数据表总项数 var count= conn.ExecuteScalar<int>("SELECT COUNT(*) FROM customers Where Type=A"); //经过小弟Dapper改装后 //获取数据表总数 var count01= _repExample.GetCount(); //不带条件 && item.CreateTime<,,));//带条件

-------------------------例子(三)-------------------------------------
//Dapper原生获取第一条数据 var entity= _Conn.QueryFirst<T_Example>("Select* from T_Example where Name==啊爆g");
//经过小弟Dapper改装后 var entity = _repExample.GetFist(item => item.Name == "啊爆g");//使用lambda式

-------------------------------例子(四)--------------------------------------- //Dapper原生检查数据是否存在 var count= conn.ExecuteScalar<int>("SELECT COUNT(*) FROM customers Where Type=A"); ; //通过判断count是否大于0 //经过小弟Dapper改装后 ");

数据的 增删改 操作

---------------------------例子(一)-------------------------------------------

//dapper原生Insert插入数据 Book book = new Book(); book.Name="C#本质论"; string query = "INSERT INTO Book(Name)VALUES(@name)"; //对对象进行操作 conn.Execute(query, book); //直接赋值操作 conn.Execute(query, new {name = "C#本质论"});

//经过小弟Dapper改装后
T_Example item= _repExample.Insert(entity);//单挑插入 bool succ= _repExample.Insert(entityList);//批量插入 内置事物操作 失败其中一条错误 全部回滚

--------------------------例子(二)-------------------------------------------
//daper原生Update更新数据 string query = "UPDATE Book SET Name=@name WHERE id =@id"; conn.Execute(query, book); //经过小弟Dapper改装后

var entity = new T_Example() ; T_Example item= _repExample.Update(entity);//单条模型更新 bool succ= _repExample.Update(entityList);//批量更新 内置事物操作 失败其中一条错误 全部回滚 });//部分字段更新
------------------------------例子(三)--------------------------------------------
//dapper原生Delete删除数据 string query = "DELETE FROM Book WHERE id = @id"; conn.Execute(query, book); conn.Execute(query, new { id = id }); //经过小弟Dapper改装后 var entity = new T_Example() ; T_Example item= _repExample.Delete(id);//删除数据 单条 bool succ= _repExample.Delete(IEnumerable<object> ids);//批量删除 内置事物操作 失败其中一条错误 全部回滚

数据查询操作实例

//dapper原生查询
string query = "SELECT * FROM Book Where Name Like %C#%";
//无参数查询,返回列表,带参数查询和之前的参数赋值法相同。
conn.Query<Book>(query).ToList();

//经过小弟改装后

_repExample.GetAll();//获取数据表所有数据 _repExample.GetAll(new { Name = true });//字段排序true 升序 false降序 //根据条件获取数据 _repExample.GetTableData(item => item.Age > && item.Name.Contains("C#%")); //开头模糊查询 _repExample.GetTableData(item => item.Age > && item.Name.Contains("%深入理解C#%"));//包含模糊查询 _repExample.GetTableData(item => item.Age > && item.Name.Contains("%Join Skeet"));//结尾模糊查询 //分页查询 long pageTotal;//输出当前表总项数 _repExample.GetPageData(, , out pageTotal); _repExample.GetPageData(, , );//根据条件分页 //获取视图数据 _repExample.QueryView<ExampleBusinessModel>("View_视图名称"); _repExample.QuerySql<T_Example>("select Name,Age,Phone from T_Example");//执行原生Sql

多表事物操作实例

//dapper的事物处理就不贴出代码了
//只贴小弟Dapper改装过后的代码
  var succ=_repExample.Submit(tran =>
            {
                //在这里执行你具体的事物操作
                _repExample.InsertTran(new T_Example(),tran);//A表插入一条数据
                _repLog.DeleteTran(id, tran);   //再删除B表的数据

            });

还有很多封装方法 小弟还来没有时间扩展 现在小弟把代码开源 你可以根据自己的需求进行扩展

虽然小弟只有3年半 编程经验 但是自认为代码还是写的规范  源码都有注释 很容易懂 有什么意见欢迎质询小弟 小弟QQ407015811

让你的Dapper像EF一样调用 开源~!的更多相关文章

  1. C# EF框架调用数据库的函数

    1.在数据库中创建一个自定义函数: REATE FUNCTION [dbo].[f_IsOriginsDisabled] ( ), @needPPTV bit ) RETURNS bit AS BEG ...

  2. 第七节:EF Core调用SQL语句和存储过程

    一. 查询类(FromSql) 1.说明 A. SQL查询必须返回实体的所有属性字段. B. 结果集中的列名必须与属性映射到的列名相匹配. C. SQL查询不能包含关联数据 D. 除Select以为的 ...

  3. .net core 基于Dapper 的分库分表开源框架(core-data)

    一.前言 感觉很久没写文章了,最近也比较忙,写的相对比较少,抽空分享基于Dapper 的分库分表开源框架core-data的强大功能,更好的提高开发过程中的效率: 在数据库的数据日积月累的积累下,业务 ...

  4. 在使用EF时调用DBFUNCTION扩展方法时,发生ENTITYCOMMANDEXECUTIONEXCEPTION 异常的解决办法

    System.Data.Entity.Core.EntityCommandExecutionException : An error occurred while executing the comm ...

  5. .net core EF Core 调用存储过程

    在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...

  6. .NET(C#)有哪些主流的ORM框架,SqlSugar,Dapper,EF还是...

    前言 在以前的一篇文章中,为大家分享了<什么是ORM?为什么用ORM?浅析ORM的使用及利弊>.那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper, ...

  7. SqlFunctions 可以在EF种调用sqlserver的函数

    在EF5环境下,首先添加EF环境,在引用中添加Syste.Data.Entity,再添加命名空间 using System.Data.Objects.SqlClient; 然后写一个控制器测试 pub ...

  8. EF 6 调用存储过程时返回多结果集和OUTPUT参数问题

    原文地址:http://q.cnblogs.com/q/56836/ 各位大侠,提问一个关于EF6调用存储过程时返回多结果集和OUTPUT参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...

  9. MVC+EF+PagedList+调用通用存储封装+多表联合信息展示分页+存储过程分页

    主要的技术点不在这里一一阐述,相关存储也是引用别人的,主要技术点就是通过最优性能方式处理需求,PagedList.包需要在线安装就可以 直接上干货 1.存储代码之第一种: 参数相对多点 /**//* ...

随机推荐

  1. 【原创】Kafka Consumer多线程实例续篇

    在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...

  2. 基于 HTML5 WebGL 的 3D 网络拓扑图

    在数据量很大的2D 场景下,要找到具体的模型比较困难,并且只能显示出模型的的某一部分,显示也不够直观,这种时候能快速搭建出 3D 场景就有很大需求了.但是搭建 3D 应用场景又依赖于通过 3ds Ma ...

  3. Disruptor的应用示例——大文件拆分

    结合最近Disruptor的学习,和之前一直思考解决的大文件拆分问题,想到是否可以使用Disruptor作为生产者/消费者传递数据的通道呢?借助其高效的传递,理论上应当可以提升性能.此文便是此想法的落 ...

  4. Object-C知识点 (一) 常用知识点

    Object-C常用的知识点,以下为我在实际开发中用到的知识点,但是又想不起来,需要百度一下的知识点 #pragma mark -- isKindOfClass与isMemberOfClass isK ...

  5. CentOS6.4虚拟机设置固定IP、安装JDK、Tomcat、Redis并部署web项目

    一.CentOS设置固定IP 1.直接修改配置文件的方式,原文地址:http://www.cnblogs.com/zhja/p/3964159.html (1)首先获取你的GATEWAY 方便后面在c ...

  6. LRU算法总结

    LRU算法总结 无论是哪一层次的缓存都面临一个同样的问题:当容量有限的缓存的空闲空间全部用完后,又有新的内容需要添加进缓存时,如何挑选并舍弃原有的部分内容,从而腾出空间放入这些新的内容.解决这个问题的 ...

  7. requireJS 源码(二) data-main 的加载实现

    (一)requireJs 的整体结构: requireJS 源码 前192行,是一些 变量的声明,工具函数的实现 以及 对 三个全局变量(requirejs,require,define)若被占用后的 ...

  8. Servlet Filter 中init和destroy问题

    测试源码如下: package com.FilterTest.Filter; import java.io.IOException; import javax.servlet.Filter; impo ...

  9. PHP ORM笔记

    1.ORM是什么? 经常听到程序员的面试中会问到对ORM的了解,但是一直不知道ORM是个什么鬼东西,知道有一天在百度上顺带看到才发现ORM就是我们平时在框架中一直使用的数据库对象操作.ORM(Obje ...

  10. Django学习(七)---添加新文章页面

    在template中添加add_article.html页面 (form  input)请求方法使用post 这个页面涉及到了两个响应函数 1)显示页面的响应函数  2)表单提交的响应函数 add_a ...