Dapper.NET——轻量ORM

Dapper.NET使用

本文目录

Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

1、为什么选择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

2、以Dapper(4.0)为例。

2.1 在数据库中建立几张表。

CREATE TABLE [dbo].[CICUser]
(
    [UserId]                [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
    [Username]              [nvarchar](256) NOT NULL,
    [PasswordHash]          [nvarchar](500) NULL,
    [Email]                 [nvarchar](256) NULL,
    [PhoneNumber]           [nvarchar](30) NULL,
    [IsFirstTimeLogin]      [bit] DEFAULT(1) NOT NULL,
    [AccessFailedCount]     [int] DEFAULT(0) NOT NULL,
    [CreationDate]          [datetime] DEFAULT(GETDATE()) NOT NULL,
    [IsActive]              [bit] DEFAULT(1) NOT NULL
)

CREATE TABLE [dbo].[CICRole]
(
    [RoleId]       [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
    [RoleName]     [nvarchar](256) NOT NULL,
)

CREATE TABLE [dbo].[CICUserRole]
(
     [Id]   [int] IDENTITY(1, 1) PRIMARY KEY NOT NULL,
     [UserId]  [int] FOREIGN KEY REFERENCES [dbo].[CICUser] ([UserId]) NOT NULL,
     [RoleId]  [int] FOREIGN KEY REFERENCES [dbo].[CICRole] ([RoleId]) NOT NULL
)

2.2实体类。

在创建实体类时,属性名称一定要与数据库字段一一对应。

 实体类

3.使用方法

3.1  一对一映射

 private static void OneToOne(string sqlConnectionString)
        {
            List<Customer> userList = new List<Customer>();
            using (IDbConnection conn = GetSqlConnection(sqlConnectionString))
            {
                string sqlCommandText = @"SELECT c.UserId,c.Username AS UserName,
c.PasswordHash AS [Password],c.Email,c.PhoneNumber,c.IsFirstTimeLogin,c.AccessFailedCount,
c.CreationDate,c.IsActive,r.RoleId,r.RoleName
    FROM dbo.CICUser c WITH(NOLOCK)
INNER JOIN CICUserRole cr ON cr.UserId = c.UserId
INNER JOIN CICRole r ON r.RoleId = cr.RoleId";
                userList = conn.Query<Customer, Role, Customer>(sqlCommandText,
                                                                (user, role) => { user.Role = role; return user; },
                                                                null,
                                                                null,
                                                                true,
                                                                "RoleId",
                                                                null,
                                                                null).ToList();
            }

            if (userList.Count > 0)
            {
                userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +
                                                             "----Password:" + item.Password +
                                                             "-----Role:" + item.Role.RoleName +
                                                             "\n"));

                Console.ReadLine();
            }
        }

3.2 一对多映射

private static void OneToMany(string sqlConnectionString)
        {
            Console.WriteLine("One To Many");
            List<User> userList = new List<User>();

            using (IDbConnection connection = GetSqlConnection(sqlConnectionString))
            {

                string sqlCommandText3 = @"SELECT c.UserId,
       c.Username      AS UserName,
       c.PasswordHash  AS [Password],
       c.Email,
       c.PhoneNumber,
       c.IsFirstTimeLogin,
       c.AccessFailedCount,
       c.CreationDate,
       c.IsActive,
       r.RoleId,
       r.RoleName
FROM   dbo.CICUser c WITH(NOLOCK)
       LEFT JOIN CICUserRole cr
            ON  cr.UserId = c.UserId
       LEFT JOIN CICRole r
            ON  r.RoleId = cr.RoleId";

                var lookUp = new Dictionary<int, User>();
                userList = connection.Query<User, Role, User>(sqlCommandText3,
                    (user, role) =>
                    {
                        User u;
                        if (!lookUp.TryGetValue(user.UserId, out u))
                        {
                            lookUp.Add(user.UserId, u = user);
                        }
                        u.Role.Add(role);
                        return user;
                    }, null, null, true, "RoleId", null, null).ToList();
                var result = lookUp.Values;
            }

            if (userList.Count > 0)
            {
                userList.ForEach((item) => Console.WriteLine("UserName:" + item.UserName +
                                             "----Password:" + item.Password +
                                             "-----Role:" + item.Role.First().RoleName +
                                             "\n"));

                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("No Data In UserList!");
            }
        }

3.3 插入实体

 public static void InsertObject(string sqlConnectionString)
        {
            string sqlCommandText = @"INSERT INTO CICUser(Username,PasswordHash,Email,PhoneNumber)VALUES(
    @UserName,
    @Password,
    @Email,
    @PhoneNumber
)";
            using (IDbConnection conn = GetSqlConnection(sqlConnectionString))
            {
                User user = new User();
                user.UserName = "Dapper";
                user.Password = "654321";
                user.Email = "[email protected]";
                user.PhoneNumber = "13795666243";
                int result = conn.Execute(sqlCommandText, user);
                if (result > 0)
                {
                    Console.WriteLine("Data have already inserted into DB!");
                }
                else
                {
                    Console.WriteLine("Insert Failed!");
                }

                Console.ReadLine();
            }
        }

3.4 执行存储过程

         /// <summary>
        /// Execute StoredProcedure and map result to POCO
        /// </summary>
        /// <param name="sqlConnnectionString"></param>
        public static void ExecuteStoredProcedure(string sqlConnnectionString)
        {
            List<User> users = new List<User>();
            using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString))
            {
                users = cnn.Query<User>("dbo.p_getUsers",
                                        new { UserId = 2 },
                                        null,
                                        true,
                                        null,
                                        CommandType.StoredProcedure).ToList();
            }
            if (users.Count > 0)
            {
                users.ForEach((user) => Console.WriteLine(user.UserName + "\n"));
            }
            Console.ReadLine();
        }

        /// <summary>
        /// Execute StroedProcedure and get result from return value
        /// </summary>
        /// <param name="sqlConnnectionString"></param>
        public static void ExecuteStoredProcedureWithParms(string sqlConnnectionString)
        {
            DynamicParameters p = new DynamicParameters();
            p.Add("@UserName", "cooper");
            p.Add("@Password", "123456");
            p.Add("@LoginActionType", null, DbType.Int32, ParameterDirection.ReturnValue);
            using (IDbConnection cnn = GetSqlConnection(sqlConnnectionString))
            {
                cnn.Execute("dbo.p_validateUser", p, null, null, CommandType.StoredProcedure);
                int result = p.Get<int>("@LoginActionType");
                Console.WriteLine(result);
            }

            Console.ReadLine();
        }

时间: 2024-08-04 15:30:48

Dapper.NET——轻量ORM的相关文章

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 将是你不

Go ADM,Go语言轻量ORM

厚颜无耻的推荐一下,go-adm,Go语言轻量ORM.0.1.0分支已经实现类面向对象的操作方式,说明请戳这里. 目前的总体特性已经完成,暂时不会增加其他的特性,待0.1.0的面向对象化的特性测试完善,会合并到主分支中. 艾玛,不要打我,就是推荐一下,不要打脸-- 咳,Go的确吊炸天,我计划将agimvc也搬到Golang上,不过mvc这个词可以丢掉了.

SqlSugar轻量ORM

蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSugar基础应用 2.使用SqlSugar处理大数据 3.使用SqlSugar实现Join  待更新 4.使用SqlSugar实现分页+分组+多列排序 待更新 5.节点故障如何进行主从调换 一.介简 优点: 1.优越的性能,查询使用  reflection.emit 创建IL语言+委托绑定 然后对该对象进行

C# Dapper 轻量ORM调试对SQLServer

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

轻量型ORM框架Dapper的使用

在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我个人的见解,EF是相对来说比较重的ORM框架,它是讲究通用性的框架,而非单纯的实现某种需求的框架,不得不否认的说,EF的开发效率要比用单纯的ADO.NET写sql语句的效率高的不是一点半点,可能很多人会说EF的性能低等等,针对这种问题有时候是需要折中的来讲,从另一个方面来讲,你用了ADO.NET写s

OWIN轻量型框架介绍

OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请求响应上下文 自定义默认处理函数 内置各种便捷函数 复合类型的请求处理 框架的扩展 静态内容的支持 跨域Post的支持 基础类型继承灵活处理 尾声 回到顶部 引言 什么是OWIN,我就不介绍了,请自行搜索,这里主要是介绍自行开发的OWIN框架的特点和用法.由于.NET的web框架都比较庞大,导致性能

轻量的Memcached代理Twemproxy的部署

轻量的Memcached代理Twemproxy的部署 Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数.由Twitter开源出来的缓存服务器集群管理工具,主要用来弥补Redis和Memcached对集群(cluster)管理指出的不足. Twemproxy是一个快速的单线程代理程序,支持Memcached ASCII协议和更新的Redis协议. Twemproxy最了不起的地方就在于它能在节点失败的时候卸载它,

推荐轻量友好的.NET测试断言工具Shoudly

Shoudly是一个轻量的断言(Assertion)框架,用于补充.NET框架下的测试工具.Shoudly将焦点放在当断言失败时如何简单精准的给出很好的错误信息. Shouldly在GitHub的开源地址:https://github.com/shouldly/shouldly Shouldly的官方文档:http://docs.shouldly-lib.net/ 为什么要Shoudly? 我们知道通常测试代码中一个断言是这样写的: Assert.That(contestant.Points,

一个轻量系统的诞生

经过几个月的业余时间,为一家公司设计了如下一套简单,轻量的内部管理系统.在这几个月中,基本牺牲了所有的业余时间,不乏晚上加班加点.一个人和工厂讨论需求,提出设计想法,和工厂人员确定这么“整”还是那么“整”,是否可满足具体要求. 然后再回到家进行Coding.... 做该项目的意义何在?其实市场上有很多XX ERP,XXX协同系统.这些系统功能可能很强大,强大到太强而不能用. 最重要的一点是,并不是适合具体公司的业务流程和业务内容. 如果你们公司买了一套系统有可能就是将你公司的管理调整到和要上的系