案例分享使用Dapper实现CRUD
一、简介
.Net平台下有非常多的ORM框架,ef(core)、dapper、nhibernate、sqlsugar、freesql等等,每个orm都有自己的特点,但性能这块还是dapper牛逼。二、使用案例
创建一个Asp.Net Core Web Api 项目,接口文档可以参照上一篇文章介绍的Knife4j进行配置。项目引入依赖:
项目使用SqlServer数据库,需要创建一个数据库:Article,一张表Product
建表脚本:CREATE TABLE [dbo].[Product]( [ProductId] [varchar](50) NOT NULL, [ProductName] [nvarchar](50) NOT NULL, [CategoryId] [nvarchar](50) NULL, CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED ( [ProductId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
新建数据库访问类:DataAccessusing System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Data.SqlClient; using System.Data; using Dapper; namespace ApiDoc.Controllers { public class DataAccess { private readonly string ConnectionString = "Data Source=.;Initial Catalog=Article;User ID=sa;Password=数据库密码"; public async Task Execute(string sql, T entity) { using IDbConnection connection = new SqlConnection(ConnectionString); return await connection.ExecuteAsync(sql, entity); } public async Task> GetList(string sql, object param = null) { using IDbConnection connection = new SqlConnection(ConnectionString); return await connection.QueryAsync(sql, param); } } }
新建产品类:Product /// /// 产品类 /// public class Product { /// /// 产品ID /// public string ProductId { get; set; } /// /// 产品名称 /// public string ProductName { get; set; } /// /// 产品分组 /// public string CategoryId { get; set; } }
新建控制器:ProductController[Route("api/[controller]")] [ApiController] public class ProductController : ControllerBase { /// /// 读取单个 /// /// [HttpGet("Get")] public async Task Get(string productId) { DataAccess dataAccess = new DataAccess(); var list = await dataAccess.GetList(#34;select * from Product where productId="{productId}"").ConfigureAwait(false); return list.FirstOrDefault(); } /// /// 读取集合 /// /// [HttpGet("List")] public async Task> List() { DataAccess dataAccess = new DataAccess(); return await dataAccess.GetList(#34;select * from Product ").ConfigureAwait(false); //return new List() { // new Product { ProductId = "1", ProductName = "优质大米", CategoryId = "1" }, // new Product { ProductId = "2", ProductName = "优质大豆", CategoryId = "1" }, //}; } /// /// 删除 /// /// 主键 [HttpDelete("Delete")] public async Task Delete(string productId) { DataAccess dataAccess = new DataAccess(); return await dataAccess.Execute($@"DELETE FROM [dbo].[Product] WHERE [ProductId]="{productId}"", null); } /// /// 新增 /// /// 产品 [HttpPost("Add")] public async Task Add(Product product) { DataAccess dataAccess = new DataAccess(); return await dataAccess.Execute(@"INSERT INTO [Product] ([ProductId] ,[ProductName] ,[CategoryId]) VALUES (@ProductId ,@ProductName ,@CategoryId)", product); } /// /// 修改 /// /// 产品 [HttpPut("Edit")] public async Task Edit(Product product) { DataAccess dataAccess = new DataAccess(); return await dataAccess.Execute( $@"UPDATE [Product] SET [ProductName] = @ProductName ,[CategoryId] = @CategoryId WHERE [ProductId]="{product.ProductId}"", product); } }
准备好后,我们的项目是这样的:
我们将控制器里面的List方法改为返回静态数据:
运行项目,执行List方法我们得到一些测试数据:
使用这些测试数据,我们进行新增
新增完两条数据后,我们将List方法改回读数据库:
执行List方法:
剩余的修改和删除我就不一一演示了,整个过程非常简单可以动手试试。
Dapper是一个IDbConnection对象的扩展库,增加了非常多的查询和执行命令的方法:
大家可以根据自己的需求选择其中的方法。
作为一个高性能的ORM其使用者也是非常多,为了弥补需要手写sql的缺点,社区内有非常多的扩展库比如:DapperExtensions 等可以实现无sql化。