轻量型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框架,需要的拿去!

时间: 11-09

轻量型ORM框架Dapper的使用的相关文章

.NET轻量级ORM框架Dapper修炼手册

一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需,一旦当手头遇到与Dapper修炼手册中相似用法的地方和场景,可以直接拿来进行翻阅并灵活的运用到项目中.最后阿笨建议您可以根据自己在工作中碰到的不同的使用场景,不断的完善此本修炼手册. 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工. 四.涉及覆盖的知识点 1.C# Linq To Xml技术.

微型orm框架--dapper的简单使用

1.安装 首先使用nuget安装dapper,因为这里的示例是使用mysql,所以还要安装mysql的驱动.如下图: 2 数据库表 脚本 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for class -- ---------------------------- DROP TABLE IF EXISTS `class`; CREATE TABLE `class` ( `id` int(

C#轻型ORM框架PetaPoco试水

近端时间从推酷app上了解到C#轻微型的ORM框架--PetaPoco.从github Dapper 开源项目可以看到PetaPoco排第四 以下是网友根据官方介绍翻译,这里贴出来. PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项--单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的Poco类,和几乎全部加了特性的Poco类 Insert/Delete/Update/Save and IsNew

.NET轻量级ORM组件Dapper葵花宝典

一.摘要 为什么取名叫<葵花宝典>? 从行走江湖的世界角度来讲您可以理解为一本"武功秘籍",站在我们IT编程的世界角度应该叫"开发宝典". 如果您在工作中主要接触的是操作MySQL数据库,但您又想学习和了解.NET轻量级ORM框架Dapper,那么就请跟着阿笨一起学习本次的分享课<.NET轻量级ORM框架Dapper葵花宝典>.Let's Go,Do It ,Dapper For MySQL! 废话不多说,直接上干货,我们不生产干货,我们只是

Dapper.NET——轻量ORM

Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一对一映射 3.2 一对多映射 3.3 插入实体 3.4 执行存储过程 Dapper是一款轻量级ORM工具(Github).如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省力,这时Dapper 将是你不

Dapper.NET——轻量ORM(转载)

Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一对一映射 3.2 一对多映射 3.3 插入实体 3.4 执行存储过程 Dapper是一款轻量级ORM工具(Github).如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省力,这时Dapper 将是你不

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库表 (1)For MSSQL CREATE TABLE [dbo].[Posts] ( [Id] INT NOT NULL PRIMARY KEY IDENTITY, [CategoryId] INT NOT NULL, [Slug] VARCHAR(120) NOT NULL, [Title] N

基于netty轻量的高性能分布式RPC服务框架forest&lt;下篇&gt;

基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开发的RPC框架,除了常规的点对点调用外,Motan还提供服务治理功能,包括服务节点的自动发现.摘除.高可用和负载均衡等. 架构概述 Forest中分为服务提供方(RPC Server),服务调用方(RPC Client)和服务注册中心(Registry)三个角色. Server提供服务,向Registry注册

Android轻量缓存框架--ASimpleCache

[转] 大神真面目 稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 编辑推荐: 做Android应用开发的同学们相信对“缓存”这个词不陌生,缓存可能有多方面的概念,这里大概列举下程序开发的缓存大概有哪些: 1.服务端控制缓存 如volley请求库,便是通过服务端的“Cache-Control”和“max-age”来告诉客户端有没有缓存以及缓存的时间,也是推荐的使用