DapperHelper

本文介绍了Dapper的使用,这是一个轻量且高效的ORM库。通过示例展示了如何进行数据的批量插入、查询、更新和删除操作,同时也讨论了Dapper的优点,如高性能、支持多种数据库以及对.NET Core的支持,同时也指出其仍需SQL语句编程的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

对于Dapper的使用,我们需要引入两个包:Dapper和SqlClient。Dapper使用拓展方法对IDbConnection 对象进行拓展。Github链接:https://github.com/StackExchange/Dapper

二、示例

我们首先创建了两张表,然后根据第一张表创建了一个实例模型类(没有包含主键)。
在这里插入图片描述
在这里插入图片描述

    public class Player
    {
        public string FullName { get; set; }

        public decimal Salray { get; set; }

        public int TeamId { get; set; }

        public DateTime Birthday { get; set; }
    }

然后我们写了一个辅助类,包括了一些基本的增删改查。

public class DapperHelper
    {
        string connStr = @"server=DESKTOP-P7UORUH\SQLEXPRESS;database=TestDB;uid=heater;pwd=123456";

        /// <summary>
        /// 批量插入多组数据
        /// </summary>
        /// <param name="players">需要插入的数据集合</param>
        /// <returns>返回数据库表中受影响的行数</returns>
        public int Insert(IEnumerable<Player> players)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                //参数名需要与属性名称相同,但是不一定需要与数据库中列名相同;参数顺序与列保持一致就行。
                string sql = "insert into Players values(@FullName,@Salary,@TeamId,@Birthday)";
                return conn.Execute(sql, players);
            }
        }

        /// <summary>
        /// 插入一组数据
        /// </summary>
        /// <param name="player">需要被插入的数据</param>
        /// <returns>数据库中受影响的行数</returns>
        public int Insert(Player player)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                //参数名需要与属性名称相同,但是不一定需要与数据库中列名相同;参数顺序与列保持一致就行。
                string sql = "insert into Players values(@FullName,@Salary,@TeamId,@Birthday)";
                return conn.Execute(sql, player);//直接将player对象传递进去,它会自动匹配。
            }
        }

        /// <summary>
        /// 通过名字模糊查询
        /// </summary>
        /// <param name="name">需要查询的名字</param>
        /// <returns>返回一个可枚举的类型</returns>
        public IEnumerable<Player> QueryByFullName(string name)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Players where FullName like @FullName";
                return conn.Query<Player>(sql, new { FullName = $"%{name}%" });//声明参数(需要与参数名保持一致) 匿名类型
            }
        }

        /// <summary>
        /// 根据ID进行查询
        /// </summary>
        /// <param name="id">需要查询的ID</param>
        /// <returns>返回查询的数据</returns>
        public Player QueryById(int id)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Players where Id = @id";
                return conn.QueryFirstOrDefault<Player>(sql, new { id = id });
            }
        }

        /// <summary>
        /// 通过ID来查询球队Name
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public string QueryTeamNameById(int id)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "select Name from Teams where Id=(select TeamId from Players where Id = @id)";
                return conn.ExecuteScalar<string>(sql, new { id = id });
            }
        }


        /// <summary>
        /// 通过薪水上下限来查询
        /// </summary>
        /// <param name="min">薪水最小值</param>
        /// <param name="max">薪水最大值</param>
        /// <returns>查询结果</returns>
        public IEnumerable<Player> QueryBySalary(decimal min, decimal max)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Players where Salray between @min and @max";
                return conn.Query<Player>(sql, new { min=min,max=max });
            }
        }

        /// <summary>
        /// 查询在某些球队中的球员
        /// </summary>
        /// <param name="id">球队编号</param>
        /// <returns>查询结果</returns>
        public IEnumerable<Player> QueryByTeamId(IEnumerable<int> id)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Players where TeamId in @id";//这里是in语法
                return conn.Query<Player>(sql, new { id= id});//传递参数的时候 直接给的一个枚举类型
            }
        }

        /// <summary>
        /// 通过id来修改数据
        /// </summary>
        /// <param name="player">修改后的数据</param>
        /// <param name="id">需要被修改的数据的ID</param>
        /// <returns>返回受影响的行数</returns>
        public int UpdateById(Player player, int id)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "update Players set FullName=@FullName,Salray=@Salary,TeamId=@TeamId,Birthday=@Birthday where Id = @id";

                //这里参数有点多  直接分开写了。
                return conn.Execute(sql, new { FullName = player.FullName, Salary = player.Salray, TeamId = player.TeamId, Birthday = player.Birthday, id = id });
            }
        }

        /// <summary>
        /// 通过ID删除数据
        /// </summary>
        /// <param name="id">需要删除的ID</param>
        /// <returns>受影响的行数</returns>
        public int DeleteById(int id)
        {
            using (IDbConnection conn = new SqlConnection(connStr))
            {
                string sql = "delete from Players where Id = @id";
                return conn.Execute(sql, new { id = id });
            }
        }
    }
三、总结
Dapper的优点:
  • 轻量。因为它就是对Ado.Net的简单封装。
  • 高性能、速度快。是最靠近Ado.Net的ORM(Object Releational Mapping)
  • 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  • 支持 .netcore。
Dapper的缺点:
  • 还是有一点面向数据库编程的意思,还是需要依赖Sql,没有完全面向对象。所以还需要一些拓展达到零SQL
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>类型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值