Dapper.NET 使用简单举例

概述

Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。也就是说实体类都要自己写。它没有复杂的配置文件,一个单文件就可以了。

现在已经取代了原来的SqlHelper优点:

  • 使用Dapper可以自动进行对象映射!
  • 轻量级,单文件。
  • 支持多数据库。
  • Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象
  • 由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。所以在使用前先实例化一个IDBConnection对象。所以调用之前,一定先加上命名空间:using Dapper;

使用举例

数据库表结构

----Book表,主表CREATE TABLE [dbo].[Book](
    [BookId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Book] PRIMARY KEY CLUSTERED
(
    [BookId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
----BookReview类似于book评价表
CREATE TABLE [dbo].[BookReview](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [BookId] [int] NULL,
    [Content] [nvarchar](50) NULL,
 CONSTRAINT [PK_BookReview] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[BookReview]  WITH CHECK ADD  CONSTRAINT [FK_BookID_BookPreBookid] FOREIGN KEY([BookId])
REFERENCES [dbo].[Book] ([BookId])
GO

ALTER TABLE [dbo].[BookReview] CHECK CONSTRAINT [FK_BookID_BookPreBookid]
GO

实体结构

public class Book
    {
        public Book()
        {
            Reviews = new List<BookReview>();
        }
        public int BookId { get; set; }
        public string Name { get; set; }
        public virtual List<BookReview> Reviews { get; set; }
        public override string ToString()
        {
            return string.Format("[{0}]------《{1}》", BookId, Name);
        }
    }

//书评
    public class BookReview
    {
        public int Id { get; set; }
        public int BookId { get; set; }
        public virtual string Content { get; set; }
        public virtual Book AssoicationWithBook { get; set; }
        public override string ToString()
        {
            return string.Format("{0})--[{1}]\t\"{3}\"", Id, BookId, Content);
        }
    }
  • Execute执行数据库脚本
        public static void OpeartData()
        {
            string sqlconnct = System.Configuration.ConfigurationManager.ConnectionStrings["myconnect"].ConnectionString;
            using (IDbConnection comm = new SqlConnection(sqlconnct))
            {
                comm.Open();
                //Book book = new Book() { Name="C#9论述",Id=1 };
                string query = "insert into Book(Name) values(@name)";
                //添加,可以执行SQL脚本

                //comm.Execute(query, book);
                //comm.Execute(query, new { name = "Java Learn" });

                query = "UPDATE Book SET  [email protected] WHERE BookId [email protected]";
                //comm.Execute(query, book);
                //comm.Execute(query, new {name="C985426",BookId=1 });

                query = "DELETE FROM Book WHERE BookId = @id";
                //var idsult=comm.Execute(query, new { name = "C985426", BookId = 1 });

                query = "select * from Book where [email protected]";
                //var ruslt = comm.Query<Book>(query).ToList();
                // var ruslt = comm.Query<Book>(query, new { BookId = 2 }).FirstOrDefault();
            }
        }
  • Query执行数据库脚本查询

    • One To More 查询
    public static Book OpeartMoData()
            {
                string sqlconnct = System.Configuration.ConfigurationManager.ConnectionStrings["myconnect"].ConnectionString;
                using (IDbConnection conn = new SqlConnection(sqlconnct))
                {
                    conn.Open();
                    string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id";
                    Book lookup = null;
                    //Query<TFirst, TSecond, TReturn>
                    var b = conn.Query<Book, BookReview, Book>(query,
                     (book, bookReview) =>
                     {
                         //扫描第一条记录,判断非空和非重复
                         if (lookup == null || lookup.BookId != book.BookId)
                             lookup = book;
                         //书对应的书评非空,加入当前书的书评List中,最后把重复的书去掉。
                         if (bookReview != null)
                             lookup.Reviews.Add(bookReview);
                         return lookup;
                     }, new { id = 2 }, splitOn: "id").Distinct().SingleOrDefault();
                    return b;
                }
            }
    • One To One 查询
     public static BookReview OpeartData1T1()
            {
                string sqlconnct = System.Configuration.ConfigurationManager.ConnectionStrings["myconnect"].ConnectionString;
                using (IDbConnection conn = new SqlConnection(sqlconnct))
                {
                    BookReview br;
                    string query = "SELECT br.Id,b.BookId,Content,Name FROM BookReview br  inner JOIN Book b ON br.BookId = b.BookId  WHERE br.id = @id";
                    using (conn)
                    {
                        br = conn.Query<BookReview, Book, BookReview>(query,
                       (bookReview, book) =>
                       {
                           bookReview.AssoicationWithBook = book;
                           return bookReview;
                       }, new { id = 4 }, splitOn: "BookId",commandType:CommandType.StoredProcedure).FirstOrDefault();
                        return br;
                    }
                }
            }
    • 执行事务
     public static void BookTransaction()
            {
                string sqlconnct = System.Configuration.ConfigurationManager.ConnectionStrings["myconnect"].ConnectionString;
                using (IDbConnection conn = new SqlConnection(sqlconnct))
                {
                    conn.Open();
                    //开始事务
                    IDbTransaction transaction = conn.BeginTransaction();
                    try
                    {
                        string query = "DELETE FROM Book WHERE id = @id";
                        string query2 = "DELETE FROM BookReview WHERE BookId = @BookId";
                        conn.Execute(query2, new { BookId = 2 }, transaction, null, null);
                        conn.Execute(query, new { id = 2 }, transaction, null, null);
                        //提交事务
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        //出现异常,事务Rollback
                        transaction.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
时间: 2024-11-03 05:43:18

Dapper.NET 使用简单举例的相关文章

使用oracle官方文档(11G)简单举例

使用oracle官方文档(11G)举例 以下正是oracle官方文档界面,想要学好oracle,读官方文档是必经之路,此文为给初学者大致了解官方文档的使用,对官方文档有一个更直观的认识.文档可通过文章关联的链接查看到,或登录到oracle官网查看(内容更加丰富). <官方文档>阅读来源 官网链接:Oracle11G官方文档      下载地址:Oracle11G官方文档下载 以下,简单几个例子,帮助读者对于文档的使用有进一步的理解: [举例1]:在Windows下远程连接数据库使用的指令是什么

SQL Server中带事务的存储过程简单举例

先来看一个概念: 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行.那么在存储过程里添加事务,则可以保证该事务里的所有sql代码要么完全执行要么完全不执行. 举个简单的带事务的存储过程: Begin Set NOCOUNT ON; --不返回影响行数 Set XACT_ABORT ON; --使用存储过程执行事务需要开启XACT_ABORT参数(默认为OFF) delete from table1 where n

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是mssql和postgre,这个不需多讲,我们只讲讲单表情况下的postgre如何通过迭代查询获取有层级关系的数据. 一.表结构举例 MENU表 ID VARCHAR2(32)     N   sys_guid()    节点idFENXID VARCHAR2(32)

shell-script的简单举例

#!/bin/bash #defind the path PATH=/usr/local export PATH read -p "please input your first name:" firstname reap -p "please input your last name:" lastname echo -e "\nyour name is: $firstname $lastname" #use date create file r

CentOS 文件通配符;预定义字符;简单举例

文件通配符使用举例 *            匹配零个或者多个字符 ~]# ls x*      比如搜索以x开头的文件或者目录 ?            匹配任何单个字符 ~]# ls x?      搜索以x打头的文件或者目录  单个字符补上 ^            取得反向值 ~            当前用户家目录 ~]# cd            回到家目录 ~username    ~]# cd ~makangbo  回到用户家目录 ~]# ll ~/         也可以访问

简单举例通过Kibana给运维展示直观精美的图形

关于elk集群搭建请查看:http://blog.51cto.com/linyingyong/2084284 先上一个我最后弄出来的图形: 环境 : nginx服务器  安装filebeat 配置: 1.nginx配置 nginx配置日志格式为json,修改nginx配置文件: vim /usr/local/nginx/conf/nginx.conf  在http标签下添加:  log_format  logstash_json  '{ "@timestamp": "$tim

c#抽象类和接口的简单举例

1. 个性大于共性. 2. 差异较大的个性间具有某些相同的行为. 3. 相同行为的实现方式有较大区别. 给你三个对象,分别是鲫鱼.鲤鱼.金鱼,仍然让你设计基类来概括它们之间的联系,那么你第一个意识到的肯定是它们都属于鱼类,其次是他们游泳的方式可能稍有差异,这时就应当使用抽象基类而不是接口,对比着上面的例子,原因有三条: interface ISwim { void Swim(); } public class Person : ISwim { public void Swim() { //Swi

JavaScript中map函数和filter的简单举例(转)

js的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似1)filter是满足条件的留下,是对原数组的过滤:2)map则是对原数组的加工,映射成一一映射的新数组var xx = [1, 2, 5, 7];function pp(x){return x % 2;}function px(x){return x % 2;}var m = xx.map(pp);console.log("m = " + m);var f = xx.filter(p

参数化查询(简单举例)

这几天在查一些有关SQL语句防注入的资料,敲敲改改总算弄好了,不多说,贴代码 string str = @"server=LAPTOP-CM9CUARS;Integrated Security=SSPI;database=Space;"; using (SqlConnection Conn = new SqlConnection(str)) { Conn.Open(); //打开数据库 try { using (SqlCommand Cmd = Conn.CreateCommand()