Dapper ORM 用法—Net下无敌的ORM(转)

【.Net后端开发框架-Dapper框架】-Dappe轻量级ORM框架 Dappe轻量级ORM框架学习 dapper介绍 Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的,可以实现数据到对象的ORM操作,体积小速度快(性能不错),使用ORM的好处是对数据的增、删、改查的速度很快,还有就是程序中大量的从数据库中读数据然后创建model,并为model字段赋值。Dapper都可 阅读详情

转载自:http://www.renfb.com/blog/2011/Article/335
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载
Dapper的优势:
1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.
2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
3,Dapper支持什么数据库。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db
4,Dapper的r支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。
5,Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能实在高高高。
6,Dapper支持net2.0,3.0,3.5,4.0。【如果想在Net2.0下使用,可以去网上找一下Net2.0下如何配置运行Net3.5即可。】
7,Dapper语法十分简单。并且无须迁就数据库的设计。


下面介绍Dapper如何使用,来进行高效开发,以下操作是编译后在Net3.5下操作的例子,Net4.0下大部分函数有默认值,参数很简单。


//数据库里的表:
CREATE TABLE ColumnCat
(
Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NAME NVARCHAR(150) NULL,
ModifiedOn SMALLDATETIME NULL DEFAULT(GETDATE()),
Parentid INT
)


CREATE TABLE Column
(
Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NAME NVARCHAR(150) NULL,
ModifiedDate SMALLDATETIME NULL DEFAULT(GETDATE()),
ColumnCatid INT null
)
常用的表,分类和内容表,分类可以有下级类别。以下操作基本上都是对这两个表的操作。


//连接数据库字符串。
private readonly string sqlconnection =
                 "Data Source=RENFB;Initial Catalog=test;User Id=sa;Password=sa;";
//public readonly string mysqlconnectionString =
                 @"server=127.0.0.1;database=test;uid=renfb;pwd=123456;charset='gbk'";
 


//获取Sql Server的连接数据库对象。SqlConnection
public SqlConnection OpenConnection()
{
    SqlConnection connection = new SqlConnection(sqlconnection);
    connection.Open();
    return connection;
}
//获取MySql的连接数据库对象。MySqlConnection
//public MySqlConnection OpenConnection()
//{
//     MySqlConnection connection = new MySqlConnection(mysqlconnectionString);
//     connection.Open();
//     return connection;
//}
注:如果需要换成Mysql数据库,只用将获得sql Server的连接数据库对象的函数注释掉,取消MySql的连接数据库对象的函数的注释,一并取消Mysql连接字符串的注释,并修改为自己的连接信息。


Query()方法:
Query()是IDbConnection扩展方法并且重载了,从数据库里提取信息,并用来填充我们的业务对象模型。


//先创建一个类,是数据库的ColumnCat表的模型。
public class ColumnCat
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime ModifiedOn { get; set; }
    public int Parentid { get; set; }
}
 


//获取ColumnCat对象的集合。
public IEnumerable<ColumnCat> SelectColumnCats()
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "select * from ColumnCat order by id desc";
        return conn.Query<ColumnCat>(query,null);
    }
}
就是这么简单,直接在例子中嵌入Sql,很容易扩展为存储过程,可以使用别名使结果集中的列与业务对象模型(ColumnCat)的属性对应。


//下面使用上面的集合显示出分类。
List<ColumnCat> AllColumnCat =SelectColumnCats().ToList<ColumnCat>();
foreach (ColumnCat cat in AllColumnCat.Where(c => c.Parentid == 0))
{
    Response.Write("Name==>" + cat.Name + "\t");
    Response.Write("时间==>" + cat.ModifiedOn + "\t");
    Response.Write("<br/>");


    foreach (ColumnCat c in AllColumnCat
                .Where<ColumnCat>(subColumnCat => subColumnCat.Parentid == cat.Id))
    {
        Response.Write("&nbsp;&nbsp;++++");
        Response.Write("Name==>" + c.Name + "\t");
        Response.Write("时间==>" + c.ModifiedOn + "\t");
        Response.Write("<br/>");
    }
}
//将一级类别和二级类别显示在页面上,如果使用一个递归,很容易实现无限级分类(你懂的)。
 


//获取单个ColumnCat对象。
public ColumnCat SelectColumnCat(int columnCatId)
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "select * from ColumnCat where Id=@id";
        return conn.Query<ColumnCat>(query, new { id=columnCatId})
                        .SingleOrDefault<ColumnCat>();
    }
}
这里我们传递了一个参数给Query方法,参数可以是任何对象,其属性在查询中与sql的参数匹配,由于Query总是返回一个集合,我们只需调用SingleOrDefault方法,因为我们知道总是返回0或1行.


//Dapper也可以加载填充嵌套对象,考虑这样一种情形,考虑到新闻的类别属性,返回类别对象,
//我们创建一个Column的类
public class Column
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime ModifiedDate { get; set; }
    public ColumnCat ColumnCat { get; set; }
}
 


//接下来我们来填充我们的业务对象。
public IList<Column> SelectColumnsWithColumnCat()
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "select c.Id,c.Name,c.ModifiedDate,c.ColumnCatid
        ,cat.id,cat.[Name],cat.ModifiedOn,cat.Parentid from [Column] as c
        left outer join ColumnCat as cat on c.ColumnCatid=cat.id";
        return conn.Query<Column, ColumnCat, Column>(query
               , (column, columncat) => { column.ColumnCat = columncat; return column; }
               , null, null, false, "Id", null, null).ToList<Column>();
    }
}
注:1,在填充嵌套对象的时候,只好执行ToList<>方法,否则回报ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭,而单个对象不会报错,估计是using结束后关闭了连接,而嵌套对象在map的时候又执行了ExecuteReader,只好在using结束之前返回list集合。
2,嵌套对象的参数是比较多的,主要是前两个参数,其它参数没用可以设置为null,不过在4.0版本可以只写两个参数,其它参数都有默认值。特别要注意的是splitOn,这个参数不能为空,否则会报对象为引用的错误。【splitOn参数的意思是读取第二个对象的的分割列,从哪个列起开始读取第二个对象,如果表里的自增长列都为Id,可以设置这个参数为”Id”】.


Execute方法:
正如Query方法是检索数据的,Execute方法不会检索数据,它与Query方法非常相似,但它总返回总数(受影响的行数),而不是一个对象集合【如:insert update和delete】.


 //接下来向数据库里添加一个类别
public int InsertColumnCat(ColumnCat cat)
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "insert into ColumnCat([name],ModifiedOn,Parentid)
        values (@name,@ModifiedOn,@Parentid)";
        int row = conn.Execute(query,cat);
        //更新对象的Id为数据库里新增的Id,假如增加之后不需要获得新增的对象,
        //只需将对象添加到数据库里,可以将下面的一行注释掉。
        SetIdentity(conn,id=>cat.Id=id,"id","ColumnCat");    
        return row;


    }
}


 public void SetIdentity(IDbConnection conn, Action<int> setId,string primarykey
                          ,string tableName)
{
    if (string.IsNullOrEmpty(primarykey)) primarykey = "id";
    if (string.IsNullOrEmpty(tableName))
    {
        throw new ArgumentException("tableName参数不能为空,为查询的表名");
    }
    string query = string.Format("SELECT max({0}) as Id FROM {1}", primarykey
                         , tableName);
    NewId identity = conn.Query<NewId>(query, null).Single<NewId>();
    setId(identity.Id);
}


public class NewId
{
    public int Id { get; set; }
}
由于Dapper是通过类的属性自动绑定的,所以增加了NewId类来获取增加对象后的Id,本来打算使用@@identity,Net3.5下使用总是报错,只好使用Max函数获取。当然如果不需要获得更新后的对象的ID,可以不使用SetIdentity,这个函数通用。


 //编译Dapper源码生成的是Net4.0下使用的,可以借助Net4.0新增的dynamic动态类型,
//SetIdentity的实现将非常方便。如下:
public void SetIdentity<T>(IDbConnection conn, Action<int> setId)
{
    dynamic identity = connection.Query("SELECT @@IDENTITY AS Id").Single();
    T newId = (T)identity.Id;
    setId(newId);
}


 //更新一个类别:
public int UpdateColumnCat(ColumnCat cat)
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "update ColumnCat set name=@Name
                          ,ModifiedOn=@ModifiedOn,Parentid=@Parentid where Id=@id";
        return conn.Execute(query,cat);
    }
}


 //删除一个类别:
public int DeleteColumnCat(ColumnCat cat)
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "delete from ColumnCat where id=@id";
        return conn.Execute(query, cat);
    }
}
下面介绍一下Dapper的高级用法


 //Dapper对事务处理的例子,如删除类别的同时删除类别下的所有新闻。或者删除产品的同时,
//删除产品图片表里关联的所有图片。
public int DeleteColumnCatAndColumn(ColumnCat cat)
{
    using (IDbConnection conn = OpenConnection())
    {
        const string deleteColumn = "delete from [Column] where ColumnCatid=@catid";
        const string deleteColumnCat = "delete from ColumnCat where id=@Id";


        IDbTransaction transaction = conn.BeginTransaction();
        int row=conn.Execute(deleteColumn, new { catid =cat.Id},transaction,null,null);
        row += conn.Execute(deleteColumnCat, new { id=cat.Id},transaction,null,null);
        transaction.Commit();
        return row;
    }
}
.Net使用Dapper框架(快速上手) 在.net6快速使用Dapper,本文从Dapper的方法使用、参数、事务和存储过程等方法,提供Dapper框架的代码使用示例使我们快速便捷地使用该ROM框架。 阅读详情

相关推荐

四大.NET ORM框架深度对比:EF Core、SqlSugar、FreeSql与Dapper的性能、功能与适用场景

在对比Entity Framework Core(EF Core)、SqlSugar、FreeSql和Dapper这四种常用的.NET ORM框架时,我们可以从多个维度进行详细的梳理和总结。以下是对这些框架的对比,包括应用场景、优势、劣势,并尝试通过表格形式展示关键数据(尽管ORM框架的对比通常难以直接量化到具体的数据点,但我会尽量通过描述性信息来呈现)。

学习和分享 9079

Dapper ORM 用法

假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载 Dapper的优势: 1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。 3,Dapper支持什么数据库。Dapper支持...

weixin_30613433的博客 408

.Net封装Dapper dbContext类

封装Dapper dbContext类,对Dapper 的增删查改进行封装

.NET Dapper的正确使用姿势

阅读目录Dapper优势和缺点数据库连接增删改查的优化工作单元SQL监控Demo源码结束本文demo适用于MySQLDapper优势和缺点优点高性能、易排查、易运维、灵活可控缺点和EF相比,手写sql当修改表结构不易发现bug。习惯了EF后再来使用Dapper,会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。数据库连接问题:IDbConnection需不需要手动Open打开连接答...

weixin_68436326的博客 534

[Linux]双网卡 CentOS 系统中指定网络请求走特定网卡的配置方法

本文详细介绍了在双网卡CentOS系统中指定特定域名/IP通过指定网卡传输流量的方法。核心步骤包括:1)确认网卡信息(ip addr)和域名IP解析(nslookup);2)添加临时路由(ip route add);3)持久化配置(创建route-eth1文件);4)验证配置(ip route show和curl测试)。文章还提供了网关查询、路由删除等常见问题的解决方法,并区分了不同CentOS版本重启网络服务的命令差异。通过合理配置路由规则,可实现流量的定向传输需求。

wingaso的博客 1571

python零基础入门到精通,python入门到精通教程

坚持到了这儿,恭喜你,表示你有做开发的潜力,其实我想说的上面的内容还是刚刚开始,刚开始大家不需要多么精通了解这些内容,除了Python方面的知识,每个部分掌握一点儿能进行基本开发就好,主要是不断练习,让自己跳出「舒适区」,进入「学习区」,但是又不进入「恐慌区」,不断给自己「喂招」。上述这份完整版的Python全套学习资料已经上传优快云官方,朋友们如果需要可以扫描下方二维码免费获取【保证100%免费】

YYmmsss的博客 3429

Dapper ORM 用法—Net下无敌的ORM (转)

转载自:http://www.renfb.com/blog/2011/Article/335假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.Dapper的优势:1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.2,Dapper很快。Dapper的速度接近与IDataRea...

diaoyanzhen2925的博客 77

修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置

原标题:串口虚拟化 | 串口服务器Nport 5630 设置JZGKCHINA项目改造,客户需要对IFix4.5进行升级,并优化通讯,在不改变原来配置的基础上逐步进行替换。需要将IFix升级到IFix5.9,数据库升级为SQL Server 2016,客户现场使用的智能仪表都是支持Modbus RTU协议的,因原来的手拉手的通讯方式的,当一台仪表掉线后,会影响到其他仪表的通讯,所以此次在不改变原有...

weixin_31688465的博客 2408

Dapper ORM 用法—Net下无敌的ORM(转)

假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载Dapper的优势:1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。3,Dapper支持什么数据库。Dapper支持Mysql,Sq...

weixin_33724570的博客 81

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 453

Dapper ORM 框架跟我学:第一课 - Dapper ORM 介绍

Dapper 是一个轻量级的微 ORM(微型对象关系映射器),由 Stack Overflow 团队开发并开源。它的设计目标是提供一种简单、高效的方式来与数据库交互,同时保持代码的简洁性和性能。与传统的 ORM 框架不同,Dapper 不会生成复杂的 SQL 查询,也不会管理实体之间的复杂关系。相反,它专注于将 SQL 查询的结果直接映射到 C# 对象,帮助你快速执行数据库操作,而不需要编写大量的样板代码。

caifox的博客 1611

Python量化交易实战:pytdx库高效获取通达信分笔成交数据

本文详细介绍了如何使用Python的pytdx库高效获取通达信分笔成交数据,为量化交易提供关键市场微观结构分析。通过环境搭建、服务器连接、数据获取与清洗的完整流程,帮助开发者快速掌握这一免费高质量数据源,并实现分笔数据的实战分析与应用。

weixin_29061509的博客 1345

ORM框架之------Dapper,Net下无敌的ORM

ORM框架之------Dapper,Net下无敌的ORM 一,介绍:Dapper是一款轻量级ORM工具。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。   ---ORM框架的核心思想是对象关系映射,ORM是...

LHL62411570的专栏 527

1、深入解析OTA/gm - C滤波器架构与设计

本文深入探讨了OTA/gm-C滤波器的架构与设计方法,涵盖了从基本构建模块到高阶滤波器实现的多种技术。重点分析了双积分器环路结构(如Tow-Thomas和KHN滤波器)的工作原理、性能特点及OTA非理想特性对滤波器的影响,并介绍了降低寄生效应、提升动态范围的方法。文章还讨论了基于LC梯形仿真、多环反馈和电流模式的gm-C滤波器设计,以及自动调谐技术在频率稳定性中的应用。最后总结了不同类型gm-C滤波器的优缺点及其适用场景,为高频集成连续时间滤波器的设计提供了全面的技术参考。

fanta的博客 185

lammps教程:MS转data文件出错原因分析及解决办法

使用ms建模是lammps建模的一种重要方法,但是ms建模转换为data过程中经常会出现各种各样的错误。 ms模型转data文件流程分两部分,一是ms建模、forcite设置力场并导出car文件,二是msi2lmp将car转为data文件。 任何一个环节出错都会导致无法得到data文件,最容易出错的是forcite力场设置环节。 forcite力场设置出错原因有很多,一个原因是缺乏某类原子的力场参数。 msi2lmp软件只能转换cvff或pcff力场的car文件,因此,如果力场中不包含某类原子的参数,在设置

lammps_jiayou的博客 5062

ASP.NET Core 中的 ORM 之 Dapper

Dapper简介Dapper是.NET的一款轻量级ORM工具(GitHub),也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的,也就是说实体类和S...

dotNET跨平台 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mysql .net orm_【.NET框架】Dapper ORM 用法—Net下无敌的ORM

假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载 Dapper的优势:1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。3,Dapper支持什么数据库。Dapper支持Mysql,S...

weixin_32691939的博客 124

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

.NET-4.ORM 常见框架EFcorn、Dapper、SqlSugar、FreeSql 和ADO.NET

EF core学习与深入前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 学习参考: 1, .NET 6教程,.Net Core 2022视频教程,杨中科主讲— 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotli

joyyi9的博客 5066

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Dapper ORM 用法—Net下无敌的ORM

假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载 Dapper的优势: 1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。 3,Dapper支持什么数据库。Dapper支持

惟楚有才 1万+

ORM框架 Dapper

一,介绍:Dapper是一款轻量级ORM工具。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。   ---ORM框架的核心思想是对象关系映射,ORM是将表与表之间的操作,映射成对象和对象之间的操作,就是通过操作实体类来达到操作表的目的。从数据库提取的数据会自动按你设置的映射要求封装成特定的对象。之后你就可以通过对对象进行操作来修改数据库中的数据。这时候你面对的不是信息

你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 6839

Dapper ORM 使用教程

Dapper 是一个开源的、轻量级的 ORM 框架,性能出色,关于它的特点不必多说,网上到处都是。个人比较喜欢它基于 SQL 语句的方式。本博文讲解 Dapper 的用法。

王敏的专栏 1845
下一篇: ADO.NET五大对象
vimanas
博客等级 码龄11年 25粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值