MyBatis动态SQL标签1

MyBatis之sql拼接 阅读详情

动态 SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。

动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

接下来我们就逐一看看,这么标签怎么用:

1.if的用法举例

我们来实现username的模糊查询

① 记得在接口中加@Param注解,以防止以下异常ReflectionException: There is no getter for property named...

②if标签里的test属性里是用的OGNL表达式,这是apache下的一个标签,用法类似jstl,但有些小差别,具体的内容可以在ognl官网上查询,这里强调一点,有些符号在xml文件里写的时候,属于特殊符号,不能直接使用,我们可以在w3cschool里查HTML ISO-8859-1 参考手册,比如:双引号(")

2.where标签的用法举例

我们还来实现模糊查询,不过这次是两个模糊查询的条件,username和password:

上面的做法是我平时最爱干的一种解决办法,但是呢,Mybatis也想到这点,给我们提供了一种解决办法就是where标签,它的特殊作用就是能够去掉执行的sql的第一个条件前的多余的“and”或者“or”这种字符串:

 

注意点:where标签只能去掉第一个条件的前面多余出来的and 或 or ,并不能去掉后面的哈,这一点切记!那么如果我们非要写在后面,这时就只用能trim标签!

3.trim标签的用法举例

如上所说,trim可以解决and在后面的情况:

这个标签,有四个属性:

prefix:加前缀

prefixOverrides:如果发现字符串前有某个前缀,把它干掉

suffix:加后缀

suffixOverrides:发现某个后缀干掉

MyBatis详解-----动态SQL的介绍及使用详解 MyBatis的强大特性之一就是动态sql,使用JDBC的时候或者时在用其他类似的框架的时候,我们根据不同的需求进行拼接SQL的时候都是非常严格的,不仅要注意一些必要的空格,还有注意在sql中的一些逗号的使用。而MyBatis的动态SQL就帮我们解决了这些麻烦。 动态SQL__if的用法 <if> 标签内的Sql片段在满足条件后才会添加,用法为: <if test="条件"> 。 作用:当满足test属性中的条件的时候if中的sql语句会追加在原有的sql语句后面,如果条件.. 阅读详情

相关推荐

MyBatis 接口与 SQL 语句绑定的 4 种方式,你会几种?

通过以上四种方式,你可以轻松地将 MyBatis 接口与 SQL 语句绑定。XML 映射文件配置:适合复杂的 SQL 语句,配置灵活,但维护成本较高。注解绑定:代码简洁,适合简单的 SQL 语句,但不适合复杂的动态 SQL。Provider 类方式:支持动态生成 SQL 语句,灵活性高,但增加了代码复杂度。自动扫描包下所有映射器:简化配置,适合项目中 Mapper 接口较多的情况。

java专栏 1166

OGNL mybatis

http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱...

weixin_30387799的博客 400

Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

Springboot 封装整活 Mybatis 动态查询条件SQL自动组装拼接

默默不代表沉默 6977

MyBatis动态拼接SQL

MyBatis动态拼接SQL

magic_818的博客 4783

告别高延迟!用RV1106+4G模块+libdatachannel搭建低功耗WebRTC监控,保姆级避坑指南

本文详细介绍了如何利用RV1106低功耗处理器、4G模块和libdatachannel库构建嵌入式WebRTC监控系统,解决高延迟问题。通过硬件选型、系统优化和核心代码实现,提供了一套完整的低功耗实时视频传输方案,特别适合智能安防和工业物联网应用。

weixin_42527401的博客 193

强化学习新手上路:用PPO-Clip轻松玩转Pendulum-v1(PyTorch保姆级教程)

本文提供了一份基于PyTorch的PPO-Clip算法实战教程,指导强化学习新手在Pendulum-v1环境中构建连续控制智能体。教程详细解析了PPO-Clip的核心机制,特别是其Clip机制如何限制策略更新幅度以确保训练稳定,并涵盖了从环境配置、策略网络设计、经验收集到完整训练框架搭建的全过程,是掌握连续动作空间强化学习的实用指南。

weixin_29062963的博客 273

【Mybatis】动态SQL标签1

如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。②if标签里的test属性里是用的OGNL表达式,这是apache下的一个标签,用法类似jstl,但有些小差别,具体的内容可以在ognl官网上查询,这里强调一点,有些符号在xml文件里写的时候,属于特殊符号,不能直接使用,我们可以在w3cschool里查。虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。

CodeRunning的博客 411

JS实例(三)图片的缓慢放大和缩小

  我们经常能看到在一些网站中可以通过按钮实现对图片的放大或者缩小,也有可能是鼠标经过时图片放大。在本例中就是通过JavaScript实现图片的放大和缩小。   首先是进行简单的页面布局 1 <div class="imagedispose"> 2 <img src="1.jpeg" id="imaged" width="400px" height="3...

weixin_34235105的博客 314

看程序学mybatis 动态SQL1-动态SQL - MYBATIS IF 标签例子

步骤 1 : 基于前面的教程上进行 这个知识点要对Product做不少的查询操作,所以基于 多对一 的基础上进行,因为在这个系列教程中,到那一步,才用到了Product这个类。 步骤 2 : 执行不同的条件限定,需要准备两条sql语句 假设需要对Product执行两条sql语句,一个是查询所有,一个是根据名称模糊查询。 那么按照现在的方式,必须提供两条sql语句:listProduct和listP...

tujiahao1的博客 191

新能源充电桩充电枪口标准

建立的标准确保了新能源汽车充电的安全性、兼容性和效率,促进了新能源汽车产业的发展。

网络安全的研究者、新能源行业的追求者 4695

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 360

【MyBatis】深入解析 MyBatis:使用 if 标签动态拼接 SQL 语句中多个 where 条件的方法(添加条件 “1=1“、使用 where 标签)和 where 标签的作用及使用方法

【MyBatis】深入解析 MyBatis:使用 <if> 动态拼接 SQL 语句中多个 where 条件的方法(添加条件 "1=1"、使用<where>标签)个 <where> 标签的作用及使用方法

OuO-1 的博客 1147

最新腾讯手游游戏appid列表及urlScheme一览 urlscheme查询

[全网独家] 2024最新腾讯游戏appid列表及urlScheme一览 手游包含王者荣耀QQ飞车我的世界PUBG吃鸡和平精英金铲铲之战三角洲行动QQ炫舞拳皇98OL欢乐斗地主 元梦之星使命召唤等

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

mybatis动态SQL多条件查询1 - if 标签

Mybatis框架的动态SQL技术是一种根据特定条件动态拼接SQL语句的过程。它的存在是为了解决拼接SQL语句字符串的痛点问题。创建新的Mapper接口和新的mapper映射文件。 目录 1.创建DynamicSqlMapper接口 2.创建DynamicSqlMapper映射文件 3.测试类 4.测试结果 5. 引伸 : 其中一样传入信息不符合 5.1 and后的参数不提供 5.1.1运行效果 5.2 where后的参数不提供 5.2.1 运行效果 5.2.2 解决方法 6. 总.

m0_53753920的博客 1731

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

如果大家学习过WiFi的SPEC,比如从我的资源里面下载 IEEE 802.11-2007,应该很容易发现,FiRa的spec定义实在是太差了。有现成的好例子不学,非得自己来一套,搞一堆新的名词,其实都是一个意思。比如GID,OID等,而且GID、OID是最先出现的,但是对应表格 还得去附件的最后一项去找。 FiRa是UWB联盟,希望跟WIFi联盟学习一下,把UWB做大做强,而不是自成一派,自命不凡。

Ankie资深技术项目经理 2435

从 Service Entry Sheet 按 PO 行项目追溯服务行:PACKNO 与 ESLL 层级解包实战

摘要: SAP MM模块中,外部服务采购的数据结构较为复杂,服务明细并非直接存储在采购订单行项目表EKPO中,而是通过PACKNO关联到服务包表ESLL。本文解析了从采购订单行项目EBELN+EBELP获取服务行号SRVPOS的方法,重点分析了服务包的层级结构(根包、子包SUB_PACKNO),并提供了兼容合同项目的ABAP代码实现。通过EKPO-PACKNO定位根包后,需结合ESUC和ESLL表逐层解析子包,最终获取服务明细数据,解决了服务采购场景下的数据关联难题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

mybatis解决动态拼接的where 1=1问题

当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 来比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL 注入的风险。 select <includ...

由入门到精通 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

mybatis 入门(四):动态SQL

mybatis 不仅支持传入参数到SQL语句标签,还支持通过字符串拼接的方式实现动态传入SQL标签。处于灵活性的考虑,对应 where 后的语句如果想实现动态SQL,要么在where后添加 1=1 实现,要么就引入标签,至于where后面的SQL拼接,需要再引入 if 标签形如= null">,其中state 就是传入SQL的Java字段,用以判断该if语句中的SQL是否可以进行拼接。另:where标签中 的第一个if标签会被自动处理,但是之后的标签不会校验生成的SQL是否正确。......

备忘录的博客 240

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 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拒绝where 1=1

为什么使用 where 1=1? 在MyBatis框架中,动态SQL是很棒的一点,为了解决拼接SQL字符串带来的问题,MyBatis存在动态SQL技术,按照特定的条件对满足条件的SQL语句进行拼接。 举例: <select id="getEmpByIf" resultType="Emp"> select * from t_emp where 1=1 <if test="empName !=null and empName!=''">

hd_cash的博客 1249

mybatis中 where 1 = 1和动态标签<where></where>

mybatis中 where 1 = 1和动态标签where 比如下面这段代码: <select id="getTotal" parameterType="Map" resultType="Integer"> select count(*) from menu where 1 = 1 <if test="parentId != null"> and pa...

RussellChampagne的博客 1074

2025/2/23 1-DAY《尚硅谷》—— MyBatis 动态SQL(涵盖各种标签以及使用实例演示和解析)——if标签、where标签、trim标签、choose、when......

2025/2/23 1-DAY《尚硅谷》—— MyBatis 动态SQL(涵盖各种标签以及使用实例演示和解析)——if标签、where标签、trim标签、choose、when、otherwise标签、foreach标签、sql标签。

YZH&HQQ 765

Mybatis的动态sql、懒加载

一、 动态sql if标签:满足某某条件 <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> ...

醒不来的梦的博客 864

MyBatis 动态 SQL:让 SQL 语句随条件灵活变化

本文详细介绍了MyBatis动态SQL的多种标签用法。主要讲解了if标签实现条件查询;where标签替代where 1=1;set标签用于更新操作;choose/when/otherwise实现多条件分支;foreach标签遍历数组、集合和Map进行批量操作。每种标签都提供了具体的使用示例,包括持久层接口定义、映射文件配置和测试方法。动态SQL可以根据不同条件灵活构建SQL语句,使数据库操作更高效便捷。掌握这些标签能显著提升MyBatis开发效率。

艺杯羹的博客 1988

Mybatis where 1=1 和 <where>标签

&lt;select id="selSampleListByIDX4" resultMap="BaseResultMap" parameterType="cn.com.git.cbs.datamodel.TBL_Sample"&gt; select &lt;include refid="Base_Column_List" /&gt; from SAMPLE where

weixin_34356138的博客 409

Mybatis动态sql中的where标签的使用

在MyBatis中,建议尽量避免使用无意义的SQL拼接where 1=1,我们可以使用where标签来替代

北辰 3918

MyBatis的SQL

MyBatis的SQL1.CRUD1)select标签2)insert标签3)update标签4)delete标签2.动态sqlif标签where标签补充 1.CRUD 1)select标签 第一个查询语句: <!-- 查询所有用户信息 --> <select id="findAllUser" resultType="com.gxy.entity.User"> select * from user </select> 这是一个id为findAllUser的映射语

weixin_52033343的博客 973
上一篇: MyBatis使用第三方缓存框架ehchache
下一篇: 最新AI软件、AIGC系统+AI绘画系统源码,deepseek-r1、gemini-2.5-flash-all、Claude-3-7多模态大模型+图片理解+文档分析(SparkAi系统v6.8.0)
synchronizeOn
博客等级 码龄3年 1193粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值