C#的dapper使用-程序员宅基地

技术标签: git  数据库  大数据  

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

为什么选择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的安装

方法一:使用NuGet安装
打开visual studio的项目,依次点击工具NuGet包管理器管理解决方案的NuGet程序包; 

再点击浏览搜索dapper点击搜索结果中的Dapper勾选项目选择安装

解决方案管理器中点击项目查看引用,如果有Dapper,说明安装成功。 

 

方法二:直接在官网[2]下载源代码,加入项目。这种方法哈希君没有试,不过可以参考链接Dapper快速学习

 

Dapper的基本用法

插入操作

将一个对象person插入数据库的方法如图。 

插入代码文本如下。@Name的意思是自动将person里的Name值绑定上去。

public static int Insert(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", person);
    }
}

批量插入:

/// <summary>
/// 批量插入Person数据,返回影响行数
/// </summary>
/// <param name="persons"></param>
/// <returns>影响行数</returns>
public static int Insert(List<Person> persons)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", persons);
    }
}
删除操作
public static int Delete(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("delete from Person where id=@ID", person);
    }
}

public static int Delete(List<Person> persons)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("delete from Person where id=@ID", persons);
    }
}
修改操作
public static int Update(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("update Person set name=@name where id=@ID", person);
    }
}

public static int Update(List<Person> persons)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("update Person set name=@name where id=@ID", persons);
    }
}
查询操作
/// <summary>
/// 无参查询所有数据
/// </summary>
/// <returns></returns>
public static List<Person> Query()
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
    return connection.Query<Person>("select * from Person").ToList();
    }
}

/// <summary>
/// 查询指定数据
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
public static Person Query(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Query<Person>("select * from Person where id=@ID",person).SingleOrDefault();
}
}

Dapper的复杂操作

查询的In操作
/// <summary>
/// In操作
/// </summary>
public static List<Person> QueryIn()
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = "select * from Person where id in @ids";
        //参数类型是Array的时候,dappper会自动将其转化
        return connection.Query<Person>(sql, new { ids = new int[2] { 1, 2 }, }).ToList();
    }
}

public static List<Person> QueryIn(int[] ids)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = "select * from Person where id in @ids";
        //参数类型是Array的时候,dappper会自动将其转化
        return connection.Query<Person>(sql, new { ids }).ToList();
    }
}
多语句操作

为此我们引入以下Book类,同样在数据库里设置这个表。

public class Book
{
    public int ID { get; set; }
    public int PersonID { get; set; }
    public string BookName { get; set; }
}
/// <summary>
/// 多语句操作
/// </summary>
public static void QueryMultiple()
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = "select * from Person; select * from Book";
        var multiReader = connection.QueryMultiple(sql);
        var personList = multiReader.Read<Person>();
        var bookList = multiReader.Read<Book>();
        multiReader.Dispose();
    }
}
Join操作

我们是面向对象编程,所以一个对象里面会有许多其他子对象,这个子对象里面又有其自己的子对象,这种关系在数据库里的表示就是外键。
比如我们有一本书book,它有主人person,book是一个对象,主人又是一个对象。

public class BookWithPerson
{
    public int ID { get; set; }
    public Person Pers { get; set; }
    public string BookName { get; set; }
}
我们自然想要一个方法把数据库里复杂的外键关系转成我们需要的对象BookWithPerson,所有我们需要的信息都存在里面,取数据的时候只要找这个对象取数据就行了,比如我们需要一本书的主人的姓名,我们只需要bookWithPerson.Pers.Name。如果是一对多的关系我们用数组,如果是多对多我们加一层mapping。
现在我们想根据书的ID查询书的信息,包括主人信息。那么
public static BookWithPerson QueryJoin(Book book)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = @"select b.id,b.bookName,p.id,p.name,p.remark
                        from Person as p
                        join Book as b
                        on p.id = b.personId
                        where b.id = @id;";
        var result = connection.Query<BookWithPerson, Person, BookWithPerson>(sql,
        (bookWithPerson, person) =>
        {
            bookWithPerson.Pers = person;
            return bookWithPerson;
        },
        book);
      //splitOn: "bookName");
      return (BookWithPerson)result;
  }
}
中,Query的三个泛型参数分别是 委托回调类型1委托回调类型2返回类型。形参的三个参数分别是 sql语句map委托对象参数。所以整句的意思是先根据sql语句查询;同时把查询的person信息赋值给bookWithPerson.Pers,并且返回bookWithPerson;book是对象参数,提供参数绑定的值。
最终整个方法返回BookWithPerson,这样我们所需要的所有信息就有了。
摘自于:https://www.jianshu.com/p/c4ca2989d26a

转载于:https://www.cnblogs.com/flywong/p/9666963.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33690367/article/details/94567425

智能推荐

Python import各种包遇到的问题_import helper出错-程序员宅基地

文章浏览阅读1.5k次。对于一般的包,直接File->Settings->Project Interpreter->点加号搜名字就行了但是在安装seaborn的时候,总是提示出错,问题可能在于seaborn要依赖于scipy,但是装seaborn的时候他不给你装scipy,只能手动去装,于是我就去一个网站下载了scipy:http://www.lfd.uci.edu/~gohlke/pythonlibs/#sci_import helper出错

大学生网页作业设计HTML,库里网页_库里的html动态网页-程序员宅基地

文章浏览阅读1.3k次,点赞3次,收藏11次。大学生网页代码,静态动态都可以做,这是我随手做的球星库里的网页_库里的html动态网页

SVN命令行基本操作_svn命令 显示修改列表-程序员宅基地

文章浏览阅读467次。原文地址:http://blog.csdn.net/hekunhotmail/article/details/9302541以下是我常用到的svn 命令行,整理了一下,这东西版本控制上很有用,所以不会不行,当然,你也可以选择一些svn图形界面的工具0 查看当前工作目录svn 状态简写:svn st1、将文件checkout到本地目录svn checkout path(path是_svn命令 显示修改列表

mysql decimal 整数_MySQL数据类型DECIMAL用法详解-程序员宅基地

文章浏览阅读834次。MySQLDECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。要定义数据类型为DECIMAL的列,请使用以下语法:column_name DECIMAL(P,D);在上面的语法中:P是表示有效数字数的精度。P范围为1〜65。D是表示小数点后的位数。D的范围是0~30。MySQL要求D小于或等于(<=)P。DEC..._mysql decimal 保存成整数

下载安装 gSoap_gsoap download-程序员宅基地

文章浏览阅读750次。文章目录一、官网1. Products (产品介绍)2. Dev Center (开发者中心)(1)Getting Started(入门教程)(2)Tutorials(教程)(3)Documentation(文档)(4)Download & Help(下载和帮助)总结一、官网官网地址是 https://www.genivia.com/,主页很简单。接下来看一下主要内容。1. Products (产品介绍)最先进的C/XC++自动编码工具是XML Web服务API和其他XML应用程序,是_gsoap download

设备驱动模型中设备的init_name成员_struct device init_name-程序员宅基地

文章浏览阅读796次。现象是:依次加载了总线bus,设备device,驱动driver,在加载驱动时候出现了segmentation fault。环境条件:采用的是国嵌的教材(可能是教材比较古老了吧,导致出现这样问题),内核版本使用的是2.6.32.2。最后查找原因是由于空指针导致了在strncmp产生了段错误。_struct device init_name

随便推点

pandas基础学习-程序员宅基地

文章浏览阅读27次。作为参数,0表示第一行,1表示第2行,以此类推。DataFrame意为数据框架,是Pandas库中的一种数据结构,类似于二维表,由行和列组成,与Series一样支持多种数据类型。loc属性,以列名(columns)和行名(index)作为参数,当只有一个参数时,默认是行名,即抽取整行数据,包括所有列。修改行标题,使用DataFrame对象的index属性直接赋值,,或者使用DataFrame对象的rename方法修改行标题。缺失值的处理方式有不处理、删除、填充或替换、插值(均值、中位数、众数等填补)_pandas基础

关于将android项目发布到jcenter的最新最全说明_publication not found-程序员宅基地

文章浏览阅读3.1k次。方式一 一些坑提醒 项目中含有中文,那么请全局设置utf-8编码或者,使用另一种方式生成JavaDoc(可以仔细看下方生成JavaDoc方式,不一样的) 上传的库的名字,是和你Module的名字是一样的!!!所以你的Module叫什么,你的gradle依赖路径就是: groupId:moduleName:publishVersion 下面的步骤只是将项目提交到Maven里面,你要在提交完成后_publication not found

RTKLIB中ppp代码解析_rtklib进行ppp解算-程序员宅基地

文章浏览阅读1.1k次,点赞21次,收藏25次。v= zk - hx 在代码中对应的是v[nv]=y-(r+cdtr-CLIGHT*dts[i*2]+dtrp+C*dion+dcb+bias);9) ppp_res(9,obs,n,rs,dts,var,svh,dr,exc,nav,xp,rtk,v,H,R,azel)) 模糊度固定的残差校验。kalman方程中的测量xk = xk/k-1 +kv 以及pk = pk/k-1 - kh*pk/k-1 状态更新。待估参数的预测,对应klaman公式中的xk/k-1、 Pk/k-1。_rtklib进行ppp解算

learn-SVG学习_如何训练svg标注数据集-程序员宅基地

文章浏览阅读60次。SVG 是可缩放矢量图形的缩写,它是一种用于描述二维矢量图形的XML标记语言。与传统的栅格图像不同,SVG图像可以无限缩放而不会失真,同时也支持交互和动画等特性。SVG最早于1999年由W3C发布,用于在Web上展示矢量图形,并于2001年正式成为标准。在过去的二十多年中,SVG经历了多次更新和改进,增加了更多的功能和特性,如动画、交互等,并逐渐得到广泛的应用。SVG2.0于2016年9月15日成为W3C候选推荐标准,最新草案于。_如何训练svg标注数据集

WINDOWS 端CUDA10.2+CUDNN8环境搭建for YOLOV5 and Pytorch1.7-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏11次。Windows 端CUDA10.2+CUDNN8环境搭建for Pytorch1.71.CUDA下载安装1.1 查看自己的显卡1.2 显卡驱动下载及安装1.3 显卡驱动安装检测1.4 CUDN下载1.5 CUDN安装1.6 环境变量设置2 CUDNN安装2.1 CUDNN下载2.2 CUDNN安装2.3 CUDA安装检测最近,我做了一些使用YOLOV5算法的项目,遇到了很多的坑,也感叹YOLOV5的人性化操作,如此真香的算法,忍不住拿出来与大家进行分享,现在就把项目过程中的一些操作逐个记录一遍。很不好意_cudnn8

优化Hadoop Balancer运行速度_failed to move blk_1076014847_2274553 with size=89-程序员宅基地

文章浏览阅读6.7k次。 1. 修改dfs.datanode.max.transfer.threads = 4096 (如果运行hbase的话建议为16384),指定用于在DataNode间传输block数据的最大线程数,老版本的对应参数为dfs.datanode.max.xcievers2. 修改dfs.datanode.balance.bandwidthPerSec = 52428800,指定DataNod..._failed to move blk_1076014847_2274553 with size=89971516 from 172.16.33.248:

推荐文章

热门文章

相关标签