MyBatis基础02之CRUD(增删改查)

Spring Boot整合MyBatis Plus,实现增删改查(CRUD) 该篇文章主要围绕Spring Boot整合MyBatis Plus框架,实现MySQL数据库的增删改查(CRUD)操作。使用MyBatis-Plus代码生成器生成项目代码,使用postman工具测试REST式的接口请求。内容简单易读,适合初学者入门学习。 阅读详情

CRUD

即增删改查

1 .修改Category.xml文件即可

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <mapper namespace="com.how2java.pojo">
        <insert id="addCategory" parameterType="Category" >
        /*parameterType 为输入参数,配置的时候,配置相应的输入参数  
        即可*/
        /*addCategory对应的插入sql语句,#{name}会自动获取c对象的  
        name属性值*/
            insert into category_ ( name ) values (#{name})   
        </insert>

        <delete id="deleteCategory" parameterType="Category" >
            delete from category_ where id= #{id}  
        </delete>

        <select id="getCategory" parameterType="_int"
        /*_int为mybatis内置别名,对应的类型为int,其他比如_float   
        对应float*/
        resultType="Category">
            select * from   category_  where id= #{id}   
        </select>

        <update id="updateCategory" parameterType="Category" >
            update category_ set name=#{name} where id=#{id}   
        </update>
        <select id="listCategory" resultType="Category">
            select * from   category_     
        </select>    
    </mapper>
增加

TestMyBatis.java

     ...
     String resource = "mybatis-config.xml";
        InputStream inputStream =  
         Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =  
         new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession session = sqlSessionFactory.openSession();

        Category c = new Category();
        c.setName("新增的category");
        session.insert("addCategory",c);
          /*addCategory为Category.xml中设置的id,  
          c为ParamType的Category类型*/
        listAll(session);

        session.commit();
        session.close();

        public static void listAll(SqlSession session){
               List<Category> cs = session.selectList  
               ("listCategory");
        for (Category c : cs) {
            System.out.println(c.getName());
        }
     }
     }
删除
删除id=6的对象

Category c = new Category();
c.setId(6);
session.delete("deleteCategory",c);


deleteCategory对应删除的sql语句

<delete id="deleteCategory" parameterType="Category" >
    delete from category_ where id= #{id}   
</delete>
查询单个
通过session.selectOne获取id=3的记录

Category c= session.selectOne("getCategory",3);



getCategory对应的sql语句:
 /*查询的传递int型数据,返回的是Category类型相关的数据*/
<select id="getCategory" parameterType="_int" 
 resultType="Category">
    select * from   category_  where id= #{id}    
</select>
修改
通过session.update进行修改

session.update("updateCategory",c);


updateCategory对应的sql语句:

<update id="updateCategory" parameterType="Category" >
    update category_ set name=#{name} where id=#{id}    
</update>

更多查询

  1. 模糊查询
1. 修改Category.xml,提供listCategoryByName查询语句

select * from   category_  where name like concat('%',#{0},'%')


concat('%',#{0},'%') 这是mysql的写法
如果是oracle,写法是

select * from   category_  where name like '%'||#{0}||'%'



2. 运行测试

List<Category> cs = session.selectList  
("listCategoryByName","cat");

2 . 多条件查询

结合前面的模糊查询,多一个id>多少的条件
1. Category.xml 准备sql语句

<select id="listCategoryByIdAndName"  
   parameterType="map" resultType="Category">
        select * from   category_  where id> #{id}   
         and name like concat('%',#{name},'%')
</select>



2. 测试代码
因为是多个参数,而selectList方法又只接受一个参数对象,  
所以需要把多个参数放在Map里,然后把这个Map对象作为参数传递进去

        Map<String,Object> params = new HashMap<>();
        params.put("id", 3);
        params.put("name", "cat");
        List<Category> cs =   
        session.selectList("listCategoryByIdAndName",params);

总结:
1 . 通过设置实体类对应的xml文件,预先存储需要使用的SQL语句,在需要的时候使用可以简化代码。

最新版SpringBoot整合Mybatis,实现增删改查(CRUD) 为什么要学SpringBoot和Mybatis呢,我觉得作为一个合格的后端程序员增删改查(CRUD)肯定是要会的,而且是最基本的一项技能,不然怎么完成给你分配的需求呢;而为什么选择SpringBoot和Mybatis呢,首先选择SpringBoot是可以理解的,毕竟作为一款轻量型的框架,集成了很多组件和Tomcat服务器,让我们的开发更简便,当然最主要的还是因为博主只会SpringBoot??。 阅读详情

相关推荐

IDEA搭建SSM实现登录、注册,增删改查功能

IDEA搭建SSM实现登录、注册,增删改查功能.IDEA搭建SSM实现登录、注册,增删改查功能

Mybatis - 简单使用Mybatis 实现 增删改查

1.传统的JDBC实现    首先我们先看下传统的JDBC的代码 : public class JdbcDemo { private final static String CONN_URL="jdbc:oracle:thin:@localhost:1521:xe"; private final static String ORACLE_DRIVER="oracle.jdbc.O

原小明 4954

深入解析UVM寄存器模型:reg2bus与bus2reg的隐式调用机制

本文深入解析了UVM寄存器模型中reg2bus与bus2reg函数的隐式调用机制。通过追踪一次寄存器访问的完整旅程,揭示了这两个关键函数是如何在uvm_reg_map和uvm_reg_predictor中被框架自动调用的,从而在抽象的寄存器操作与具体总线事务之间完成转换,并实现镜像值的自动更新。掌握此机制是高效调试和灵活应用UVM寄存器模型的基础。

weixin_29211309的博客 439

mysql中CONCAT()的用法

先讲讲在工作上的一个用法。生产上,用户晒单后,其中一个表中一个字段没有维护,打算手动用sql把线上一个月的数据维护一下。用到了concat()函数,拼接生成update语句:SELECT CONCAT('update gshop_order_product set isSun=1 where id=',order_product_id,';') FROM gshop_comments WHERE ...

zouxucong的博客 8万+

Transformer模型详解(图解最完整版)

Transformer由论文提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。Transformer 与 RNN 不同,可以比较好地并行训练。

2501_91695094的博客 2699

自偏置电流镜设计实例

自偏置电流镜设计实例 一、概述 ​ 众所周知,电流镜属于模拟电路设计中的一个基本模块,可为其他模块提供偏置电流,例如在放大器中提供偏置电流以形成尾电流源并确定直流偏置点。本文将会介绍一种自偏置的电流镜,从原理出发,并以0.18um的工艺进行设计和仿真。 二、原理 ​ 如图一所示的电路,也称之为Beta-multiply reference电路,其中M2的尺寸是M1的k倍。M3复制M4的电流,M2和M1的漏极电流相同,但是VGS并不相等。其中 VGS=2IμnCoxW/...

aonuanjiang的博客 1万+

mysql 模糊查询 concat()

concat() 函数,是用来连接字符串。 精确查询: select * from user where name=”zhangsan” 模糊查询; select * from user where name like “%zhang%”在实际的使用中,条件是作为参数传递进来的。 所以我们使用 concat() 函数 mybatis: select * from user wh

勿在浮沙筑高台 4万+

Pikachu靶场环境搭建(Windows环境下安装详细教程)

Pikachu靶场是一个漏洞测试练习平台。其中包含了常见的web安全漏洞,如果你是一个渗透测试学习者没有靶场的练手,那么pikachu是一个很好的测试平台。

weixin_42857656的博客 1823

YII入门 (3) -- 实现 CRUD 操作

通过Gii来实现系统的 CRUD  操作 1、修改 config 文件夹的 main.php,激活 Gii ,如下 'modules'=>array(         // uncomment the following to enable the Gii tool         'gii'=>array(             'class'=>'system.gii.

刘锐群的笔记 893

LabVIEW进行MQTT通信及数据解析

该文章介绍了LabVIEW的MQTT通信的开源VI控制,以及如果进行数据的解析,特别是一些需要注意的点

heda3的博客 4105

safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案

本文主要介绍了safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 Windows 2.2 Linux

weixin_43178406的博客 15万+

Mybatis增删改查CRUD 02

一、Mybatis基础方式增删改查CRUD(了解) 1.在xxxMapper.xml中 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.ma.entity.personMapper

qq_38667785的博客 208

1.4 你绝对不能错过的天气查询工具:MCP 标准化接入实战

本文介绍了如何构建一个符合MCP标准的天气查询服务。通过FastMCP框架集成OpenWeatherMap API,实现实时天气、天气预报和历史天气查询功能。文章详细展示了从环境准备、插件设计到控制器实现的完整流程,包括如何定义工具函数、配置路由和中间件。同时讲解了如何将MCP服务封装为LangChain工具并与DeepSeek等大模型集成,还涵盖了缓存、限流等高级特性。该示例演示了如何将任意API标准化为MCP服务,为Agent应用提供统一接口。

yonggeit的博客 3046

02-mybatis的增删改查(CRUD)

目 录一. 前 言二. CRUD的实现与测试2.1 新增(insert)2.2 删除(delete)2.3 修改(update)2.4 查询(select)三. 要注意的问题 一. 前 言 在上一篇文章中,将mybatis配置好后,接下来用mybatis实现对数据库的增删改查,只需要改动两个文件即可。一个是mapper接口文件,另一个是对应的mapper.xml文件。 两个文件总体内容如下所示: mapper接口文件 package com.mybatis.mapper; imp

yuhuofei的草屋 1495

c\c++: Identifiers, modifier, qualifier, specifier, decorator; systemtap

文章目录参考英语含义在c、C++ 参考 c++ 标准 https://blog.youkuaiyun.com/tyronne/article/details/44016621 英语含义 modifier word or phrase that modifies (modify 2) another word or phrase 修饰语. qualifier (grammar) word, esp an adjective or adverb, that qualifies another word 修饰词; (尤指)形

mzhan017的博客 2423

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Mybatis由浅入深 - 02增删改查CRUD

这是Mybatis由浅入深的第2节,上文传送门:[【Mybatis由浅入深 -01入门】](https://blog.youkuaiyun.com/scm_2008/article/details/126574504) # 通过本文您将掌握: 1. 基本的CRUD语句如何写? 2. insert如何获得自增id值? 3. #{}与${}的区别? 4. @Param到底该怎么用? 什么时侯必须用,什么时侯可以不用 5. SqlSessionFactory如何单例?

天罡gg的专栏 519

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MyBatis-02-02-MyBatis的CRUD操作(增删改查操作)

文章目录插入操作查询操作更新操作删除操作 插入操作 查询操作 更新操作 删除操作

异侠 434

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Mybatis 02 对数据的CRUD(增删改查) 操作

1.导包 2.配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>...

Beyond_Nothing 501

基于注解实现Mybatis的基础CRUD

作为后端开发人员,通常使用Java程序来完成对数据库的操作。目前使用Java程序操作数据库的主流方式是Mybatis。

seeyouseeyou_的博客 1709

JavaWeb——MyBatis框架之对数据库的增删改查操作CRUD实践及MyBatis参数的深入详解

本博文总结下使用MyBatis的CRUD操作,关于MyBatis的环境搭建就不再赘述了,可以回顾下以前的博文,本次也是在这个工厂的基础上进行的。 1 保存操作 ...

数字世界 万物互联 2390

MyBatis——MyBatis的CRUD(增删改查)

mybatis的增删改查

wan的博客 935

MyBatis 增删改查CRUD

MyBatis 增删改查CRUD

.G();的博客 1036

Mybatis基础之增删改查CRUD操作接口

由于之前的每篇篇幅较短,所以本章笔者决定详细的进行介绍,这也是mybatis使用xml文件和接口crud最基础也是最为重要的学习之一。 一、配置文件SqlMapConfig.xml的配置 1.1配置内容 SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandle...

bikeSinger的博客 468

Mybatis基础学习之CRUD增删改查

前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。 这个Mybatis基础学习系列是用来记录我学习Mybatis框架基础知识的全过程 (这个系列是参照B站狂神的Mybatis最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!) 之后我将会以一天一更的速度更新这个系列,还没有学习Mybatis3框架的小伙伴可以参照我的博客学习一下

weixin_45301250的博客 716

Spring Boot整合MyBatis实现简单的CRUD

这篇文章主要针对java初学者,详细介绍如何创建一个基本的springboot项目来对数据库进行crud操作。

沐雨橙风ιε的博客 4486

Spring boot + Mybatis 实现数据库的增删改查(CRUD)操作

利用 Mybatis 为 Spring boot 提供的依赖,我们可以快捷地连接到 MySQL,实现 web 项目对数据库的 CRUD 操作。

qq_71946662的博客 2566
上一篇: MyBatis基础01之入门
下一篇: MyBatis基础03之一对多关系
Young-zhou
博客等级 码龄10年 10粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值