探索Dapper与EF Core等ORM框架的神器

news2024/11/14 18:34:53

Dapper的好处:

  1. 轻量级:Dapper是一个非常轻量级的库,对性能的影响非常小。它主要关注于执行SQL查询和映射查询结果到对象,因此它的设计和实现都非常简洁。
  2. 直接SQL:Dapper鼓励直接写SQL,而不是使用抽象查询语法。这使得开发者能够充分利用数据库的能力,进行复杂的查询和性能优化。
  3. 动态映射:Dapper支持动态地映射查询结果到对象,无需事先定义对象结构。这使得它在处理动态数据或不确定结构的数据时非常灵活。
  4. 异步支持:Dapper提供异步方法,支持异步数据库操作。这在处理大量并发请求时非常有用,可以提高系统的吞吐量和响应速度。
  5. 简单API:Dapper的API非常简洁,易于学习和使用。这使得开发者可以快速上手,并高效地编写数据库操作代码。

EF Core的好处:

  1. 自动生成数据库架构:EF Core提供了自动生成数据库架构的能力。这使得开发人员可以轻松地创建和更新数据库表结构,而无需手动编写SQL脚本。这大大加快了开发速度,并减少了出错的可能性。
  2. 快速迭代:使用EF Core可以快速迭代开发。通过简单的代码更改即可更新数据库架构,避免了手动编辑SQL脚本的繁琐过程。
  3. 可移植性:EF Core支持多种数据库提供程序(例如SQL Server、MySQL、PostgreSQL等)。开发人员可以通过更改配置,轻松地将应用程序迁移到不同的数据库平台。
  4. 易于维护:自动生成的数据库架构保持与实体类的一致性。当有新的实体类添加到应用程序中时,数据库架构可以自动更新。这减少了手动维护数据库架构的工作量。

一、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 });
}

 效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从独立开发者到成为SeaTunnel社区的贡献者,我做对了哪些事儿?

个人介绍 大家好&#xff0c;我是闫成雨&#xff0c;目前是一名独立开发者。专注于数据开发、机器学习、资源调度算法和分布式系统。 GitHub ID: CheneyYin 个人主页&#xff1a;https://cheneyyin.github.io/ 为社区做了哪些贡献 加强了Spark引擎和Flink引擎对SeaTunnel数据…

photoshop(PS)有什么快速提升工作效率的功能?或者实用功能?这里告诉你7条!

1:文件太多&#xff0c;不方便马上找到需要插入元素&#xff08;元素放入PS会发现&#xff0c;位置不知道在哪里&#xff09;&#xff0c;点击需要选中或者搭配的元素&#xff0c;ctrlV就可以快速插入目标/图层元素的位置了&#xff01; 点击当前元素&#xff0c;选中&#xf…

MT3035 逆波兰式

思路&#xff1a; 两个栈str1和sr2&#xff0c;分别存放运算符和结果。 如果是数字&#xff0c;直接放入str2中。 如果是运算符&#xff1a; 1. ( &#xff1a;直接放入 str1 2. /-/*// 看栈顶元素&#xff0c;若当前字符优先级比栈顶大&#xff0c;则压到str1中&#x…

【STL】string

本节博客主要是介绍了一下CPP标准库中的string这一容器的相关用法和常用接口&#xff0c;有需要借鉴即可。 目录 1.string介绍1.1CPP标准库与STL关系1.2string历史问题与介绍 2.string概要3.Member functions3.1constructor3.2operator 4.访问4.1[]访问4.2迭代器访问4.3范围for…

软件测试的一些概念

一.基本概念 1.什么事需求 1&#xff09;需求的定义 用户需求&#xff1a;可以简单理解为甲方提出的需求&#xff0c;如果没有甲方&#xff0c;那么就是终端用户使用产品时&#xff0c;必须完成的任务&#xff0c;该需求一般比较简略 软件需求&#xff1a;或则叫功能需求&a…

【Amplify_自己写的shadr遇到没有阴影的解决方案】

Amplify 自己写的shadr遇到没有阴影的解决方案 2020-01-21 16:04 本来我有个百试很灵的投射阴影脚本。 这次不灵光了&#xff01;地形内建材质&#xff0c;这个不支持投射的阴影~~奇了怪了。 可以采用引用的方式UsePass加入阴影部分代码&#xff0c;具体操作如下&#xff1…

视觉SLAM14精讲——三维空间刚体运动1.2

三维空间刚体运动 欧拉角 欧拉角可以说是零理解成本的表示形式&#xff0c;由于有万向锁的问题被绝大部分项目所抛弃。欧拉角的每个轴旋转都有固定好的名称&#xff0c;这些名称十分直观&#xff1a; Z轴旋转&#xff0c;相当于左右旋转&#xff0c;叫航角&#xff0c;或偏航…

photoshop(PS)有什么快速提升工作效率的功能?或者实用功能?这里告诉你5条!

1:文件太多&#xff0c;不方便马上找到需要插入元素&#xff08;元素放入PS会发现&#xff0c;位置不知道在哪里&#xff09;&#xff0c;点击需要选中或者搭配的元素&#xff0c;ctrlV就可以快速插入目标/图层元素的位置了&#xff01; 点击当前元素&#xff0c;选中&#xf…

全局异常处理实现

全局异常统一处理 ​ 全局异常处理类通常用于捕获和处理应用程序中发生的所有异常&#xff0c;从而避免在代码的多个地方重复编写异常处理逻辑。 一、全局异常处理方案 ​ 全局异常处理类有多种实现方式&#xff0c;每种方式都有其特定的应用场景和优势。以下是几种常见的全…

Vitis HLS 学习笔记--理解串流Stream(1)

目录 1. 介绍 2. 示例 2.1 代码解析 2.2 串流数据类型 2.3 综合报告 3. 总结 1. 介绍 在Vitis HLS中&#xff0c;hls::stream是一个用于在C/C中进行高级合成的关键数据结构。它类似于C标准库中的std::stream&#xff0c;但是专门设计用于硬件描述语言&#xff08;如Veri…

vue使用marked和highlight.js实现代码高亮效果

marked是对markdown进行解析的插件&#xff0c;它可以把markdown语法解析成html语法&#xff0c;从而实现页面效果&#xff0c;而highlight.js是对解析出的代码实现高亮效果 效果&#xff1a; 安装&#xff1a;避免踩我走的坑&#xff0c;安装尽量按照这个版本安装 npm install…

【Linux网络编程】IO多路转接之poll

poll 1.poll初始2.poll函数接口3.poll服务器4.poll的优点缺点 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.poll初始 poll也是一种linux…

物联网D4——OLED显示屏

OLED简介 调试方式 SCL和SDA端口 在STM32微控制器中&#xff0c;SCL代表Serial Clock&#xff08;串行时钟线&#xff09;&#xff0c;它是IC&#xff08;Inter-Integrated Circuit&#xff09;总线协议的两个信号线之一。IC总线是一种常用的双向同步串行通信接口&#xff0c;…

el-tooltip 提示框样式修改?

【element-plus el-tooltip官网地址&#xff1a; Tooltip 文字提示 | Element Plus】 <el-tooltippopper-class"Tooltip":content"content"placement"top"effect"light" ><span class"content">{{ content }}&l…

Leecode热题100---3:无重复字符的最长子串

题目&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 C&#xff1a; 指针法&#xff0c;使用at读取字符串中的值&#xff1b; #include <iostream> #include <string> #include <vector> #include <windows.…

Image Sensor固定模式噪声(FPN)的消除方法

本文介绍Image Sensor固定模式噪声&#xff08;FPN&#xff09;的消除方法。 固定模式噪声&#xff08;FPN&#xff09;英文全称&#xff1a;Fixed Pattern Noise&#xff0c;在Image Sensor调试过程中还是比较常见的&#xff0c;它的特点是噪声位置固定不变&#xff0c;不随采…

echarts树图 改文本显示的地方的样式

树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…

vue3+ts(<script setup lang=“ts“>)刷新页面后保持下拉框选中效果

效果图&#xff1a; 代码&#xff1a; <template><div class"app-layout"><div class"app-box"><div class"header"><div class"header-left"></div><div class"title">室外智…

K8s 二进制部署 上篇

一 K8S按装部署方式&#xff1a; ① Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特 性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ② Kubeadmin Kubeadmin也是一个工…