轻量型ORM框架Dapper的使用
在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射。其实对于EF吧,我说下我个人的见解,EF是相对来说比较重的ORM框架,它是讲究通用性的框架,而非单纯的实现某种需求的框架,不得不否认的说,EF的开发效率要比用单纯的ADO.NET写sql语句的效率高的不是一点半点,可能很多人会说EF的性能低等等,针对这种问题有时候是需要折中的来讲,从另一个方面来讲,你用了ADO.NET写sql语句是性能好了,但是你得到的是弱类型的DataTable或者DataSet,常规在MVC的开发中,其实你难道不转换成集合或者单个对象吗?总不会拿着DataTable用吧,当你把弱类型的Datatable转换成List<T>的时候,一般来讲分两种转换,一种是利用反射,这其实也就成了关系对象映射了,跟ORM框架没什么区别了,第二种无非是循环赋值了,但是这种的开箱装箱的损耗也是很大的,最终你得到你想要的数据类型的时候其实折中算下来相比较EF直接得到,中间你又走了很多的弯路了,我在开发中一般EF打头阵,轻量的Dapper做辅助,因为有时候开发效率很重要,性能的问题我不会过多在SQL优化上下功夫,我一般会在中间缓存上做处理。下面是我简单的对Dapper的小包装,代码如下:
public class LiunianContext:IDisposable
{
private static readonly string _dbConnectionStr = ConfigurationManager.ConnectionStrings["XXXContext"].ConnectionString; private IDbConnection dbConnection; private IDbConnection DbConnection
{
get
{
if (_dbConnectionStr.IsNotNullOrEmpty())
dbConnection = new SqlConnection(_dbConnectionStr);
else
throw new ArgumentNullException("dbConnectionStr"); bool isClosed = dbConnection.State == ConnectionState.Closed;
if (isClosed) dbConnection.Open();
return dbConnection;
}
} /// <summary>
/// 执行增删改操作(包括批量操作)
/// </summary>
/// <param name="sql">sql语句(有参数参数化)</param>
/// <param name="param">参数化值</param>
/// <returns></returns>
public bool Execute(string sql, object param)
{
bool isSuccess = false;
if (sql.IsNotNullOrEmpty())
{
try
{
int result = DbConnection.Execute(sql, param);
isSuccess = result > 0 ? true : false;
}
catch
{
isSuccess = false;
}
}
return isSuccess;
} /// <summary>
/// 执行存储过程操作
/// </summary>
/// <param name="sql">存储过程名称</param>
/// <param name="param">参数化值</param>
/// <returns>返回存储过程是否执行成功</returns>
public bool ExecuteStored(string storedName, object param)
{
bool isSuccess = false;
if (storedName.IsNotNullOrEmpty())
{
try
{
int result = DbConnection.Execute(storedName, param, commandType: CommandType.StoredProcedure);
isSuccess = result > 0 ? true : false;
}
catch
{
isSuccess = false;
}
}
return isSuccess;
} /// <summary>
/// 执行存储过程操作
/// </summary>
/// <param name="storedName">存储过程名称</param>
/// <param name="param">存储过程参数</param>
/// <returns>返回存储过程要返回的值</returns>
public DynamicParameters ExecuteStored(string storedName, DynamicParameters param)
{
if (storedName.IsNotNullOrEmpty())
{
try
{
DbConnection.Execute(storedName, param, commandType: CommandType.StoredProcedure);
}
catch { }
}
return param;
} /// <summary>
/// 查询操作
/// </summary>
/// <typeparam name="T">返回集合的类型</typeparam>
/// <param name="sql">sql语句</param>
/// <param name="param">参数化值</param>
/// <returns></returns>
public IEnumerable<T> Query<T>(string sql, object param)
{
IEnumerable<T> _list = default(IEnumerable<T>);
if (!string.IsNullOrEmpty(sql))
{
try
{
_list = DbConnection.Query<T>(sql, param);
}
catch { }
}
return _list;
} /// <summary>
/// 执行存储过程查询操作
/// </summary>
/// <typeparam name="T">返回集合的类型</typeparam>
/// <param name="storedName">存储过程</param>
/// <param name="param">参数化值</param>
/// <returns></returns>
public IEnumerable<T> QueryStored<T>(string storedName, object param)
{
IEnumerable<T> _list = default(IEnumerable<T>);
if (!string.IsNullOrEmpty(storedName))
{
try
{
_list = DbConnection.Query<T>(storedName,commandType: CommandType.StoredProcedure);
}
catch { }
}
return _list;
} /// <summary>
/// 查询操作返回默认第一条数据(如返回null则创建默认类型)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public T FirstOrDefault<T>(string sql, object param)
{
var model = default(T);
if (!string.IsNullOrEmpty(sql))
{
try
{
model = DbConnection.Query<T>(sql, param).FirstOrDefault();
}
catch { }
}
return model == null ? Activator.CreateInstance<T>() : model;
} /// <summary>
/// 查询一组SQL语句并返回值
/// </summary>
/// <typeparam name="T1">第一条语句返回集合类型</typeparam>
/// <typeparam name="T2">第二条语句返回集合类型</typeparam>
/// <param name="sql">sql语句</param>
/// <param name="param">参数化值</param>
/// <returns></returns>
public Tuple<IEnumerable<T1>, IEnumerable<T2>> Query<T1, T2>(string sql, object param)
{
IEnumerable<T1> _item1 = null; IEnumerable<T2> _item2 = null;
if (!string.IsNullOrEmpty(sql))
{
try
{
using (var multi = DbConnection.QueryMultiple(sql, param))
{
_item1 = multi.Read<T1>();
_item2 = multi.Read<T2>();
}
}
catch { }
}
return Tuple.Create<IEnumerable<T1>, IEnumerable<T2>>(_item1, _item2);
} /// <summary>
/// 查询一组SQL语句并返回值
/// </summary>
/// <typeparam name="T1">第一条语句返回集合类型</typeparam>
/// <typeparam name="T2">第二条语句返回集合类型</typeparam>
/// <typeparam name="T3">第三条语句返回集合类型</typeparam>
/// <param name="sql">sql语句</param>
/// <param name="param">参数化值</param>
/// <returns></returns>
public Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>> Query<T1, T2, T3>(string sql, object param)
{
IEnumerable<T1> _item1 = null; IEnumerable<T2> _item2 = null; IEnumerable<T3> _item3 = null;
if (!string.IsNullOrEmpty(sql))
{
try
{
using (var multi = DbConnection.QueryMultiple(sql, param))
{
_item1 = multi.Read<T1>();
_item2 = multi.Read<T2>();
_item3 = multi.Read<T3>();
}
}
catch { }
}
return Tuple.Create<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>>(_item1, _item2, _item3);
} public void Dispose()
{
if (dbConnection != null)
{
try
{
bool isClosed = dbConnection.State == ConnectionState.Closed;
if (!isClosed) dbConnection.Close();
//dbConnection.Dispose();
}
catch { }
}
}
}
调用示例如下:
public abstract class BaseProvide
{
public Lazy<LiunianContext> lazyContext; protected LiunianContextDb
{
get
{
return lazyContext.Value;
}
} } public class EmployeeProvide : BaseProvide
{
/// <summary>
/// 获取数据
/// </summary>
/// <returns></returns>
public List<Employee> ListEmployeeByParam(int[] param)
{
string sql = "select * from Employee where ID in @Ids";
return Db.Query<Employee>(sql, new { Ids = param }).ToList();
} /// <summary>
/// 获取全部数据
/// </summary>
/// <returns></returns>
public List<Employee> ListEmployee()
{
string sql = "select * from Employee";
return Db.Query<Employee>(sql,null).ToList();
} /// <summary>
/// 查询单个实体
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public Employee loadEmployee(int Id)
{
string sql = "select * from Employee where ID= @Id";
return Db.FirstOrDefault<Employee>(sql, new { Id = Id });
} /// <summary>
/// 插入操作
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public bool InsertEmployee(Employee model)
{
StringBuilder sql = new StringBuilder();
sql.Append("insert into Employee values (@UpdateTime,@CreateTime,@State,@LoginName,@UserName,");
sql.Append("@RoleId,@IsUse)");
return Db.Execute(sql.ToString(), model);
} /// <summary>
/// 更新操作
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public bool UpdateEmployee(Employee model)
{
StringBuilder sql = new StringBuilder();
sql.Append("update Employee set UpdateTime = @UpdateTime where ID = @ID");
return Db.Execute(sql.ToString(), model);
} /// <summary>
/// 删除操作
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public bool DeleteEmployeeById(int Id)
{
string sql = "delete from Employee where ID = @Id";
return Db.Execute(sql.ToString(), new { Id = Id });
} /// <summary>
/// 执行多个语句返回多个结果
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public Tuple<int,IEnumerable<Employee>> ListGroupEmployee()
{
string sql = "select Count(*) from Employee select * from Employee";
Tuple<IEnumerable<int>, IEnumerable<Employee>> queryGroup = Db.Query<int, Employee>(sql, null);
return Tuple.Create<int, IEnumerable<Employee>>(queryGroup.Item1.FirstOrDefault(),queryGroup.Item2);
} }
除了没把事务加上之外其他的增删改查都有了,同时在传对象的时候Dapper也解决了sql注入的问题,在性能上也是比较好的ORM框架,需要的拿去!
轻量型ORM框架Dapper的使用的更多相关文章
- .Net Core3.0 WebApi 项目框架搭建 五: 轻量型ORM+异步泛型仓储
.Net Core3.0 WebApi 项目框架搭建:目录 SqlSugar介绍 SqlSugar是国人开发者开发的一款基于.NET的ORM框架,是可以运行在.NET 4.+ & .NET C ...
- Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器
最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- 实战ELK(4)Metricbeat 轻量型指标采集器
一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采 ...
- Metricbeat 轻量型指标采集器
一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采 ...
- 五款轻量型bug管理工具横向测评
五款轻量型bug管理工具横向测评 最近正在使用的本地bug管理软件又出问题了,已经记不清这是第几次了,每次出现问题都要耗费大量的时间精力去网上寻找解决方案,劳心劳力.为了避免再次出现这样的情况,我决定 ...
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- 轻量级ORM框架Dapper应用一:Dapper安装
一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...
- 轻量的web框架Bottle
简洁的web框架Bottle 简介 Bottle是一个非常简洁,轻量web框架,与django形成鲜明的对比,它只由一个单文件组成,文件总共只有3700多行代码,依赖只有python标准库.但是麻雀虽 ...
随机推荐
- 解决 Android Studio 乱码问题
http://www.eoeandroid.com/thread-275485-1-1.html 很多同学都安装了Android Studio,但是发现中文是乱码,其实这个很好解决的.在IDE里点击F ...
- Bitbucket Repository size limits
Repository size limits By Justen Stepka, Product Manager on May 30, 2014 In order to improve and mai ...
- Reservoir Sampling 蓄水池抽样算法,经典抽样
随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...
- nginx+php部署
(1) 下载并安装nginx mkdir nginx-src && cd nginx-src wget http://nginx.org/download/nginx-1.7.3.ta ...
- 使用6to5,让今天就来写ES6的模块化开发!
http://es6rocks.com/2014/10/es6-modules-today-with-6to5/?utm_source=javascriptweekly&utm_medium= ...
- 翻译--Blazing fast node.js: 10 performance tips from LinkedIn Mobile
1.避免使用同步代码: // Good: write files asynchronously fs.writeFile('message.txt', 'Hello Node', function ( ...
- ASP.NET弹出显示ex.Message异常信息 存在换行符和回车符处理办法。
1.把ex.Message换成任意字符串,检验在catch语句块中可以用Response.Write方法显示对话框.结果显示成功,说明问题就出在ex.Message上. 2.在程序中下断点,可以看到e ...
- ecshop 全站内页 显示最新文章
一.打开根目录下index.php,找到代码 $smarty->assign('new_articles', index_get_new_articles()); // 最新文章 进行 ...
- 使用 jsErrLog 分析 js 报错
1. github 地址: https://github.com/Offbeatmammal/jsErrLog/tree/master/src 2. 在所有页面引入 jsErrLog,配置出错时打日志 ...
- 《objective-c基础教程》学习笔记(十一)—— 类别
在编写面向对象程序的时候,我们经常想为现有的类添加一些新的行为.有些时候,我们可以创建这个类的子类.但是,如果我们用到工具集或者类库的时候,无法处理新建的子类.这时,Objective-C就给我们提供 ...