用轻量级ORM--Dapper调用MySQL存储过程

阅读本文你的收获

  1. 写一个MySQL的分页存储过程
  2. 学会使用Dapper去调用存储过程

在《用轻量级ORM–Dapper实现泛型仓储》中分享了轻量级ORM框架的基本使用,并实现了一个泛型仓储。本文继续分享用Dapper执行存储过程,区别于上文用的SQL Server数据库,本次我们用MySQL。闲话少絮,直接上案例。

一、场景描述

分页是系统中常用的功能,首先我们在MySQL中创建一个通用的分页存储过程,然后用Dapper去调用分页存储过程,实现用户列表的分页查询。

开发环境:

平台版本是:.NET6
开发框架:ASP.NET Core WebApi
开发工具:Visual Studio 2022
数据库版本:MySQL 5.7

二、在MySQL中创建存储过程

1.创建存储过程
写一个通用分页存储过程,可以进行任何单表的分页查询。

-- 0. 如果存在该存储过程,则删除
DROP PROCEDURE IF EXISTS p_pageList;-- 1. 创建存储过程
CREATE PROCEDURE p_pageList
(IN _pageIndex INT,  -- 页码  IN是输入参数IN _pageSize  INT,  -- 页的容量IN _tableName varchar(30), -- 表的名字IN _condition varchar(500), -- 查询条件OUT _totalCount INT -- 总条数  OUT是输出参数
)
BEGIN-- 用Declare关键词 定义一个局部变量DECLARE skip int;-- 给skip赋值, 跳过的条数set skip = (_pageIndex-1)*_pageSize;-- mysql的分页怎么写,用什么关键字??-- SELECT SQL_CALC_FOUND_ROWS * FROM users  where xxxx='' LIMIT skip ,_pageSize;-- 用Concat函数,拼接SQL语句,存入全局变量@sqlStrset @sqlStr = CONCAT("SELECT SQL_CALC_FOUND_ROWS "," * From ", _tableName, " where 1=1 ", _condition, " LIMIT ", skip,",", _pageSize);-- 打印拼接的SQL语句-- select @sqlStr;-- 执行SQL字符串语句PREPARE stmt FROM @sqlStr;  -- 对sql语句进行预处理EXECUTE stmt;              -- 执行sql语句DEALLOCATE PREPARE stmt;   -- 释放预处理的资源-- 在mysql中如何获取总条数,比SQL Server要简单SET _totalCount = FOUND_ROWS(); -- FOUND_ROWS()获取总条数END;

2.测试存储过程

-- 调用存储过程
CALL p_pageList(1,3,"users", "and userName like '%张三%'", @total);  -- @开头变量,类似于全局变量
select @total;

三、使用Dapper调用存储过程

1.定义分页数据响应模型

/// <summary>
/// 分页返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedList<T>
{public List<T> PagedData { get; set; } //分页结果集public int TotalCount { get; set; }    //总条数
}

2.定义用户模块的数据库访问接口

//IUserDal.cs/// <summary>
/// 用户模块的数据库访问接口
/// </summary>
public interface IUserDal
{PagedList<User> GetPage(int pageIndex, int pageSize, string name);
}

3.实现IUserDal接口

//UserDal.cs代码如下using Dapper;  //引用Dapper命名空间 
using System.Data;/// <summary>
/// 用户的仓储接口实现类
/// </summary>
public class UserDal: IUserDal
{//获取连接字符串(本例中是硬编码的,最好写在appsettings.json中)private const string CONNECT_STRING = "Server=localhost;Database=testdb1;User=root;Password=123abc!;Port=3306";/// <summary>/// 用户分页查询/// </summary>/// <param name="pageIndex">页索引</param>/// <param name="pageSize">页容量</param>/// <param name="name">姓名查询条件</param>/// <returns></returns>public PagedList<User> GetUserPage(int pageIndex, int pageSize, string name){//定义并添加参数 string strWhere = string.Empty;if (!string.IsNullOrEmpty(name)){strWhere += $" and Username like '{name}%'";}//1. Dapper动态参数赋值:定义DynamicParameters对象DynamicParameters paras = new DynamicParameters();paras.Add("_tableName", "Users");paras.Add("_condition", strWhere);paras.Add("_pageIndex", pageIndex);paras.Add("_pageSize", pageSize);paras.Add("_totalCount", dbType: DbType.Int32,direction: ParameterDirection.Output);//2. 实例化MySql数据库连接对象using var dbConnection = new MySqlConnection(CONNECT_STRING );PagedList<User> result = new PagedList<User>();//3. 用Dapper扩展方法来执行存储过程result.PagedData = dbConnection.Query<User>("p_pageList",commandType: CommandType.StoredProcedure, //存储过程param: paras).ToList();//获取总条数result.TotalCount = paras.Get<int>("_totalCount");return result; }
}

剖析以上案例,要点就是:

  1. 创建MySqlConnection连接对象dbConnection,注意要用using结构来确保资源释放;
  2. 用dbConnection对象调用Dapper扩展的方法Query来执行存储过程。其中"p_pageList"是存储过程的名称,commandType请设置为CommandType.StoredProcedure枚举值。给Query方法传参使用DynamicParameters动态参数对象

怎么样?用Dapper执行存储过程,是不是挺简单的?
那今天就分享到这里,如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。

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

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

相关文章

【异常】Incorrect string value: ‘\xE5\xAE\xA2\xE4\xBA\xBA...‘ for column

【异常】incorrect string value :\xAA\xE4\xBA for column Incorrect string value: \xE5\xAE\xA2\xE4\xBA\xBA... for column 将配置文件中的连接信息改为如下 spring.datasource.urljdbc:mysql://127.0.0.1:3306/dbname?useUnicodetrue&character_set_serverutf8mb…

3D视觉-结构光测量-多线结构光测量

工作原理 多线结构光测量在测量方式上类似上述线结构光测量&#xff0c;但是两者也有着一些明显的差别。这种形式的结构光测量&#xff0c;也常常被成为面结构光测量。首先激光器发出电光源通过通过光栅的调制产生多个切片光束&#xff0c;这些切片光束照射到待测物体表面后形成…

安全生产知识竞赛活动方案

为进一步普及安全生产法律法规知识&#xff0c;增强安全意识&#xff0c;提高安全技能&#xff0c;经研究&#xff0c;决定举办以“加强安全法治、保障安全生产”为主题的新修订《安全生产法》知识竞赛活动&#xff0c;现将有关事项通知如下&#xff1a; 一、活动时间&#xf…

第22课 类和对象

文章目录 前言一、自定义数据类型——类二、构造函数与析构函数三、类类型的变量——对象1. 对象的定义2. 对象成员的访问3. 定义一个长方形的类Rectangle4. 定义一个圆形的类Circle5. 定义一个数据成员由三角形的3条边构成的三角形类Triangle 课后练习1. 定义一个简单的日期类…

大模型系列:OpenAI使用技巧_自定义文本向量化embeding

文章目录 0. Imports1. 输入2. 加载和处理输入数据3. 将数据分成训练和测试集4. 生成合成的负样本5. 计算嵌入和余弦相似度6. 绘制余弦相似度的分布图7. 使用提供的训练数据优化矩阵。8. 绘制训练期间找到的最佳矩阵的前后对比图&#xff0c;展示结果 本笔记本演示了一种将Open…

yolov8实战第四天——yolov8图像分类 ResNet50图像分类(保姆式教程)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客在前几天&#xff0c;我们使用yolov8进行了部署&#xff0c;并在目标检测方向上进行自己数据集的训练与测试&#xff0c;今天我们训练下yolov8的图像分类…

LangChain.js 实战系列:入门介绍

&#x1f4dd; LangChain.js 是一个快速开发大模型应用的框架&#xff0c;它提供了一系列强大的功能和工具&#xff0c;使得开发者能够更加高效地构建复杂的应用程序。LangChain.js 实战系列文章将介绍在实际项目中使用 LangChain.js 时的一些方法和技巧。 LangChain.js 是一个…

环形锻件全自动尺寸测量法兰三维检测自动化设备-CASAIM自动化蓝光检测系统

锻造是一种利用锻压机械对金属坯料施加压力&#xff0c;使其产生塑性变形以获得具有一定机械性能、一定形状和尺寸锻件的加工方法&#xff0c;锻压&#xff08;锻造与冲压&#xff09;的两大组成部分之一。 目前客户使用专用直径千分尺、塞规、塞尺等对锻件形状尺寸误差进行测…

使用 JWT(JSON Web 令牌)实现登录身份验证和令牌续订

文档链接 文档链接, PDF中包含一部分宣传大字制作不易还望多多支持互相交流 使用 JWT&#xff08;JSON Web 令牌&#xff09;实现登录身份验证和令牌续订。它将 JWT 与基于会话的身份验证进行了比较&#xff0c;并强调了每种方法的差异、优点和缺点。本文档介绍了基于会话的方…

2022年2月-2023年12月总结

时间&#xff1a;2023年12月30日 14:28 地点&#xff1a;博库书城 0、序言 2023年上半年除了阿里16N拆分&#xff0c;我就不记得其他的事情了&#xff0c;就好像我的记忆只从今年9月份自己的折腾开始。是不是只有自己认真对待过的日子&#xff0c;才会让人深刻呢&#xff1f;…

T527 Android13遥控适配

T527 Android13遥控的适配和官方提供的文档有些不一样&#xff0c;按照官方的文档不能够正常适配到自己的遥控器。 首先确保驱动是否有打开CONFIG_AW_IR_RX和CONFIG_RC_DECODERSy 以及CONFIG_IR_NEC_DECODERm&#xff0c;这个可以在longan/out/t527对应的目录下的.config查看是…

算法每日一题:购买两块巧克力 | 两个最小值的遍历

大家好&#xff0c;我是星恒 今天的每日一题是寻找一个数组中的两个最小值&#xff0c;看似简单的一道题&#xff0c;其实有不少门道&#xff01; 话不多说&#xff0c;我们直接来看&#xff1a; 题目&#xff1a;给你一个整数数组 prices &#xff0c;它表示一个商店里若干巧克…

数模学习day05-插值算法

插值算法有什么作用呢&#xff1f; 答&#xff1a;数模比赛中&#xff0c;常常需要根据已知的函数点进行数据、模型的处理和分析&#xff0c;而有时候现有的数据是极少的&#xff0c;不足以支撑分析的进行&#xff0c;这时就需要使用一些数学的方法&#xff0c;“模拟产生”一些…

Windows下Qt使用MSVC编译出现需要转为unicode的提示

参考 Qt5中文编码问题解决办法_qt5设置编码-CSDN博客 致敬 提示&#xff1a;warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。 出现此问题&#xff0c;应该是Unix格式下代码的编码格式是UTF-8&#xff0c;注意不…

SOLIDWORKS Flow Simulation热环境分析

关于室内通风的问题&#xff0c;其实室内通风方面的与我们之前聊到的数据中心通风散热问题相类似&#xff0c;只不过本次会引入一个新的模块——人体舒适度问题&#xff0c;在Flow Simulation中有一个HVAC模块就是专门用于研究人体舒适度的&#xff0c;它可以预测人们在热环境中…

LeetCode75| 哈希表/哈希集合

目录 2215 找出两数组的不同 1207 独一无二的出现次数 1657 确定两个字符串是否接近 2352 相等行列对 2215 找出两数组的不同 class Solution { public:vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {un…

力扣题目学习笔记(OC + Swift)206. 反转链表

206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 方法一、迭代 在遍历链表时&#xff0c;将当前节点的 next\textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点&#xff0c;因此必须事先存储其…

【Proteus仿真】【51单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈值&am…

面试数据库八股文五问五答第三期

面试数据库八股文五问五答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;MyIsAm 和 InnoDB 的区别 事务支持&#xff1a;MyISAM不支持事务&a…

开源radishes高仿网易云音乐完整源码,可试听和下载“灰色”歌曲,跨平台的无版权音乐平台

源码介绍 Radishes是项目名称&#xff0c;是由萝卜翻译而来。可以在这里试听和下载“灰色”歌曲&#xff0c;是一个可以跨平台的无版权音乐平台。 萝卜音乐界面和功能参考 windows 网易云音乐界面和 ios 的网易云音乐 安装依赖 cd radishes/ yarn bootstrap 运行项目 web:…