C#的dapper使用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
apper是一个轻量级的ORM框架,它可以帮助我们更方便地操作数据库。下面是使用Dapper进行数据库操作的示例代码: 首先,我们需要安装Dapper包。可以通过NuGet包管理器或者在项目中添加引用来完成安装。 ```csharp using System.Data.SqlClient; using Dapper; public class DapperHelper<T> { private volatile static DapperHelper<T> _instance = null; private static readonly object lockHelper = new object(); private DapperHelper() { } public static DapperHelper<T> Ins() { if (_instance == null) { lock (lockHelper) { if (_instance == null) { _instance = new DapperHelper<T>(); } } } return _instance; } private string connectionString = "Data Source=.;Initial Catalog=Test;Integrated Security=True"; public List<T> ExecutePro(string proc, object param) { using (SqlConnection con = new SqlConnection(connectionString)) { List<T> list = con.Query<T>( proc, param, null, true, null, CommandType.StoredProcedure).ToList(); return list; } } } ``` 上面的代码中,我们定义了一个DapperHelper类,用于封装Dapper的操作。其中,ExecutePro方法用于执行存储过程,并返回结果集。 使用Dapper进行数据库操作的步骤如下: 1.创建SqlConnection对象,指定连接字符串。 2.调用Query方法执行SQL语句或存储过程,并将结果集转换为List<T>类型。 下面是一个使用DapperHelper类执行存储过程的示例代码: ```csharp var helper = DapperHelper<MyModel>.Ins(); var list = helper.ExecutePro("GetMyModelList", new { Id = 1 }); ``` 上面的代码中,我们首先获取DapperHelper实例,然后调用ExecutePro方法执行存储过程,并将结果集转换为List<MyModel>类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值