一、前言

对于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
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐