C#的dapper使用

Dapper是一款輕量級ORM工具(Github)。若是你在小的項目中,使用Entity Framework、NHibernate 來處理大數據訪問及關係映射,未免有點殺雞用牛刀。你又以爲ORM省時省力,這時Dapper 將是你不二的選擇。html

爲何選擇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程序包; git

再點擊瀏覽搜索dapper點擊搜索結果中的Dapper勾選項目選擇安裝github

解決方案管理器中點擊項目查看引用,若是有Dapper,說明安裝成功。 sql

 

方法二:直接在官網[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);
    }
}
複製代碼

批量插入:oracle

複製代碼
/// <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類,一樣在數據庫裏設置這個表。app

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是一個對象,主人又是一個對象。ide

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
相關文章
相關標籤/搜索