Dapper

Posted 该昵称有误

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dapper相关的知识,希望对你有一定的参考价值。

Dapper
   Dapper是一个简单的.NET对象映射器,几乎与使用原始的ADO.NET数据读取器一样快。Dapper通过扩展IDbConnection提供一些有用的扩展方法去查询数据库。
   Dapper通过NuGet安装:https://www.nuget.org/packages/Dapper
   文档地址:https://dapper-tutorial.net/dapper
   Dapper是如何工作的
      1、创建一个IDbConnection接口对象;
      2、编写一个查询SQL来执行CRUD操作;
      3、将查询SQL作为Execute方法的参数传递。

方法:
  返回受影响行数
    Execute()返回受影响行数
  返回集合
    Query()返回结果序列
  返回1个结果
    QueryFirst()          如果无结果会抛出错误“序列不包含任何元素”,如果有多个结果时,只返回第1个
    QueryFirstOrDefault()     如果序列不包含任何元素则为默认值,如果有多个结果时,只返回第1个
    QuerySingle()       如果序列中没有元素或有多个元素将引发异常。
    QuerySingleOrDefault()  如果序列为空则为默认值。如果序列中有多个元素将引发异常。
  批量执行
    QueryMultiple()       可以在相同的命令和映射结果中执行多个查询。


参数:
  sql:要执行的查询。
  param:查询参数(默认为null)。
  transaction:需要使用的事务(默认为null)。
  buffered:是否从缓冲读取查询结果(默认为true)。
  commandTimeout:命令执行超时时间(默认为null)。
  commandType:命令类型(默认为null)。

    public class Person
    {
        public int Id { get; set; }
        public string OpenId { get; set; }
        public string Name { get; set; }
        public ushort Age { get; set; }
        public PersonGroup Group { get; set; }
    }
    public class PersonGroup
    {
        public int Id { get; set; }
        public string OpenId { get; set; }
        public string Name { get; set; }
        public List<Person> Persons { get; set; }
    }
    public class Test
    {
        DbConnection GetConnection()
        {
            string dbConnStr = "data source=127.0.0.1;initial catalog=test;persist security info=true;user id=test;password=123456;charset=utf8;";
            DbConnection dbConnection = new mysqlConnection(dbConnStr);
            dbConnection.Open();
            return dbConnection;
        }
        public void Show()
        {
            try
            {
                List<Person> personList;
                List<PersonGroup> personGroupList;
                Person person1;
                Person person2;
                var obj = new { OpenId = "d3d19ed7376d4a388a1a8723c92ac05d", OpenId2 = "41c2f8fe6d084cb3a6be0b95df2bf0af" };
                using (IDbConnection conn = GetConnection())
                {
                    //返回受影响行数
                    string sql = "UPDATE `person` SET Age=Age+1;";
                    int number = conn.Execute(sql, obj);//返回受影响行数

                    //返回集合
                    string sql1 = "SELECT * FROM `person`;";
                    personList = conn.Query<Person>(sql1, obj).ToList();//查询多条

                    //查询1条
                    string sql2 = "SELECT * FROM `person` WHERE OpenId=@OpenId;";
                    person1 = conn.QueryFirst<Person>(sql2, obj);//多条结果时,返回第1条。无结果时抛出异常
                    person2 = conn.QueryFirstOrDefault<Person>(sql2, obj);//多条结果时,返回第1条。无结果时返回默认值
                    string sql3 = "SELECT * FROM `person` ORDER BY Id DESC LIMIT 1 ;";
                    person1 = conn.QuerySingle<Person>(sql3, obj);//多条结果时或无结果时抛出异常
                    person2 = conn.QuerySingleOrDefault<Person>(sql3, obj);//多条结果时抛出异常,无结果时返回默认值

                    //多条语句执行
                    string sql4 = "SELECT * FROM `person` WHERE OpenId=@OpenId;SELECT * FROM `person_group` WHERE OpenId=@OpenId2;";
                    using (var reader = conn.QueryMultiple(sql4, obj))
                    {
                        personList = reader.Read<Person>().ToList();
                        personGroupList = reader.Read<PersonGroup>().ToList();
                    }

                    //结果多映射 
                    //一对一  注意调用Distinct()
                    string sql5 = "SELECT * FROM `person` p LEFT JOIN `person_group` pg ON p.GroupId=pg.Id;";
                    personList = conn.Query<Person, PersonGroup, Person>(sql5, (person, personGroup) =>
                    {
                        person.Group = personGroup;
                        return person;
                    }).Distinct().ToList();
                    //一对多 注意调用Distinct()
                    var groupDic = new Dictionary<int, PersonGroup>();
                    personGroupList = conn.Query<Person, PersonGroup, PersonGroup>(sql5, (person, personGroup) =>
                    {
                        PersonGroup groupEntry;
                        if (!groupDic.TryGetValue(personGroup.Id, out groupEntry))
                        {
                            groupEntry = personGroup;
                            groupEntry.Persons = new List<Person>();
                            groupDic.Add(groupEntry.Id, groupEntry);
                        }
                        groupEntry.Persons.Add(person);
                        return groupEntry;
                    }).Distinct().ToList();
                }
            } catch (Exception)
            {
                throw;
            }
        }
    }

 

以上是关于Dapper的主要内容,如果未能解决你的问题,请参考以下文章

Dapper入门使用,代替你的DbSQLhelper

Dapper入门使用,代替你的DbSQLhelper

牛腩代码生成器使用视频(dapper)

Dapper ORM 用法

使用dapper进行参数化查询

Dapper系列之一:Dapper的入门