Dapper的好处:
- 轻量级:Dapper是一个非常轻量级的库,对性能的影响非常小。它主要关注于执行SQL查询和映射查询结果到对象,因此它的设计和实现都非常简洁。
- 直接SQL:Dapper鼓励直接写SQL,而不是使用抽象查询语法。这使得开发者能够充分利用数据库的能力,进行复杂的查询和性能优化。
- 动态映射:Dapper支持动态地映射查询结果到对象,无需事先定义对象结构。这使得它在处理动态数据或不确定结构的数据时非常灵活。
- 异步支持:Dapper提供异步方法,支持异步数据库操作。这在处理大量并发请求时非常有用,可以提高系统的吞吐量和响应速度。
- 简单API:Dapper的API非常简洁,易于学习和使用。这使得开发者可以快速上手,并高效地编写数据库操作代码。
EF Core的好处:
- 自动生成数据库架构:EF Core提供了自动生成数据库架构的能力。这使得开发人员可以轻松地创建和更新数据库表结构,而无需手动编写SQL脚本。这大大加快了开发速度,并减少了出错的可能性。
- 快速迭代:使用EF Core可以快速迭代开发。通过简单的代码更改即可更新数据库架构,避免了手动编辑SQL脚本的繁琐过程。
- 可移植性:EF Core支持多种数据库提供程序(例如SQL Server、MySQL、PostgreSQL等)。开发人员可以通过更改配置,轻松地将应用程序迁移到不同的数据库平台。
- 易于维护:自动生成的数据库架构保持与实体类的一致性。当有新的实体类添加到应用程序中时,数据库架构可以自动更新。这减少了手动维护数据库架构的工作量。
一、EF Core
我使用的是MySQL需要使用到 MySql.Data.EntityFrameworkCorePomelo.EntityFrameworkCore.MySql包
①在appsettings.json中配置数据库连接
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { "MySqlConnection": "Server=127.0.0.1;Database=efceshi;Uid=root;Pwd=gsgs2021;SslMode=REQUIRED;AllowPublicKeyRetrieval=True;" }, "AllowedHosts": "*" }
②在Program.cs文件中配置
DbContext
以使用MySQL作为数据库提供者,注册,配置服务builder.Services.AddDbContext<efceshidbcontext>(options => options.UseMySql(builder.Configuration.GetConnectionString("MySqlConnection"), ServerVersion.AutoDetect(builder.Configuration.GetConnectionString("MySqlConnection"))));
③建立一个表的模型类
[Table("user")] public class user { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public string Password { get; set; } [MaxLength(11)] public string Phone { get; set; } public string Address { get; set; } public DateTime AddTime { get; set; } public int Age { get; set; } }
④添加一个继承自 DbContext 的类,用于配置和管理与数据库的交互。
public class efceshidbcontext : DbContext { //这是一个 DbSet 属性,代表数据库中的一个表(集合)。 public DbSet<user> User { get; set; } = null; // DbContextOptions<efceshidbcontext> 包含了配置 DbContext 所需的所有选项,比如连接字符串、数据库提供程序等。 // 这些选项通常是在 Startup.cs 的 ConfigureServices 方法中通过 AddDbContext 扩展方法来配置的。 // :base(options) 表示调用基类 DbContext 的构造函数,并将 options 传递给它。 public efceshidbcontext(DbContextOptions<efceshidbcontext> options) : base(options) { } // 这是 DbContext 的一个虚方法,用于在模型创建时自定义模型配置。 // 比如,你可以在这里定义表名、列名、索引、关系等。 protected override void OnModelCreating(ModelBuilder modelBuilder) { // 调用基类的 OnModelCreating 方法,以保持默认的模型配置。 base.OnModelCreating(modelBuilder); // 在这里,你可以添加自定义的模型配置代码。 // 例如:modelBuilder.Entity<user>().ToTable("user"); // 将 user 实体映射到 "Users" 表 } }
⑤使用EF Core完成一个简单的分页接口
[HttpGet] [Route("api/Pagination")] //传入页数 public IActionResult fenye(int pageNumber) { if (pageNumber > 0)//pageNumber必须大于0 { // 定义一个常量 pageSize,表示每页显示的用户数量,这里设置为2 const int pageSize = 2; // 计算需要跳过的记录数,即 (页码 - 1) * 每页大小 int skip = (pageNumber - 1) * pageSize; // 从 _context.User 集合中跳过指定数量的记录,并取 pageSize 数量的记录 // _context.User 应该是 DbSet<User> 类型的属性,代表数据库中的 User 表 // Skip 和 Take 是 Entity Framework Core 提供的扩展方法,用于实现分页 var users = _context.User .Skip(skip) .Take(pageSize) .ToList(); // 将查询结果转换为 List<User> 类型的集合 // 直接返回用户列表,ASP.NET Core 将自动将其序列化为 JSON return Ok(users); } return Ok(""); }
效果:
二、Dapper
需要引入Dapper包
①在Program.cs中把sql连接传入DapperHelper类
new DapperHelper(builder.Configuration.GetConnectionString("MySqlConnection"));
②创建一个DapperHelper类,实现增删改成方法(包括异步)
public class DapperHelper { private static string _conn; public DapperHelper(string configuration) { _conn = configuration; } /// <summary> /// 执行非查询操作(增删改) /// </summary> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public static int Execute(string sql, object param = null) { using var connection = new MySqlConnection(_conn); // 假设_connectionString是一个有效的连接字符串 connection.Open(); // 现在调用Dapper的Execute方法,并传递非可为空的CommandType return connection.Execute(sql, param); } /// <summary> /// 异步执行非查询操作(增删改) /// </summary> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public static async Task<int> ExecuteAsync(string sql, object param = null) { using var connection = new MySqlConnection(_conn); // 根据您的数据库选择连接类 await connection.OpenAsync(); return await connection.ExecuteAsync(sql, param); } /// <summary> /// 执行查询操作并返回单个对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public static T QuerySingle<T>(string sql, object param = null) { using var connection = new MySqlConnection(_conn); // 根据您的数据库选择连接类 connection.Open(); return connection.QuerySingle<T>(sql, param); } /// <summary> /// 异步执行查询操作并返回单个对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public static async Task<T> QuerySingleAsync<T>(string sql, object param = null) { using var connection = new MySqlConnection(_conn); // 根据您的数据库选择连接类 await connection.OpenAsync(); return await connection.QuerySingleAsync<T>(sql, param); } /// <summary> /// 执行查询操作并返回对象列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public static IEnumerable<T> Query<T>(string sql, object param = null) { using var connection = new MySqlConnection(_conn); // 根据您的数据库选择连接类 connection.Open(); return connection.Query<T>(sql, param); } /// <summary> /// 异步执行查询操作并返回对象列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sql"></param> /// <param name="param"></param> /// <returns></returns> public static async Task<IEnumerable<T>> QueryAsync<T>(string sql, object param = null) { using var connection = new MySqlConnection(_conn); // 根据您的数据库选择连接类 await connection.OpenAsync(); return await connection.QueryAsync<T>(sql, param); } }
③使用DapperHelper类
[HttpGet] [Route("/api/Dapper")] public IActionResult Dapper() { //返回数据列表 IEnumerable<user> a = DapperHelper.Query<user>("select * from user"); //异步返回数据列表 Task<IEnumerable<user>> asynca = DapperHelper.QueryAsync<user>("select * from user"); //返回单个数据 user b = DapperHelper.QuerySingle<user>("select * from user where Id=@Id", new { Id = 1 }); //异步返回单个数据 Task<user> asyncb = DapperHelper.QuerySingleAsync<user>("select * from where Id=@Id", new { Id = 2 }); //添加信息 DapperHelper.Execute($"insert into user(Name,Email,Password,Phone,Address,AddTime,Age)" + $"values(@Name,@Email,@Password,@Phone,@Address,@AddTime,@Age)", new { Name = "夏婉莹", Email = "352565@qq.com", Password = "1456", Phone = "15659259642", AddTime = DateTime.Now.ToString(), Address = "山东省", Age = 18 }); // ASP.NET Core 将自动将其序列化为 JSON return Ok(new { Data = a }); }
效果: