数据持久化框架为什么放弃 Hibernate、JPA、Mybatis,最终选择 JDBCTemplate!

一次HTTP完整得请求过程 一次HTTP完整的请求过程 一,大致流程: 根据域名和DNS解析到服务器的IP地址(DNS+CDN) 通过ARP协议获得IP地址对应的物理机器得MAC地址 浏览器对服务器发起三次握手 建立TCP连接后发起HTTP请求报文 服务器响应HTTP请求,将响应报文返回浏览器 短连接情况下,请求结束通过TCP四次挥手关闭连接,长连接在没有访问服务器得若干时间后,进行连接关闭 浏览器得到响应信... 阅读详情

来源:sf.gg/a/1190000018472572

  • 一、SQL 封装和性能

  • 二、DSL 和变化适应性

  • 三、跨数据库移植

  • 四、安全性

  • 五、JOOQ 的失败之处


因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ 是总体上最好的,可惜不是完全免费,最终选择 JDBC Template。

Hibernate 和 Mybatis 是使用最多的两个主流框架,而 JOOQ、Ebean 等小众框架则知道的人不多,但也有很多独特的优点;而 JPA 则是一组 Java 持久层 Api 的规范,Spring Data JPA 是 JPA Repository 的实现,本来和 Hibernate、Mybatis、JOOQ 之类的框架不在同一个层次上,但引入 Spring Data JPA 之类框架之后,我们会直接使用 JPA 的 API 查询更新数据库,就像我们使用 Mybatis 一样,所以这里也把 JPA 和其他框架放在一起进行比较。

同样,JDBC 和其他框架也在同一层次,位于所有持久框架的底层,但我们有时候也会直接在项目中使用 JDBC,而 Spring JDBC Template 部分消除了使用 JDBC 的繁琐细节,降低了使用成本,使得我们更加愿意在项目中直接使用 JDBC。

一、SQL 封装和性能

在使用 Hibernate 的时候,我们查询的是 POJO 实体类,而不再是数据库的表,例如 hql 语句 select count(*) from User,里面的 User 是一个 Java 类,而不是数据库表 User。这符合 ORM 最初的理想,ORM 认为 Java 程序员使用 OO 的思维方式,和关系数据库的思维方式差距巨大,为了填补对象和关系思维方式的鸿沟,必须做一个对象到关系的映射,然后在 Java 的对象世界中,程序员可以使用纯的对象的思维方式,查询 POJO 对象,查询条件是对象属性,不再需要有任何表、字段等关系的概念,这样 java 程序员就更容易做持久层的操作。

JPA 可以视为 Hibernate 的儿子,也继承了这个思路,把 SQL 彻底封装起来,让 Java 程序员看不到关系的概念,用纯的面向对象思想,重新创造一个新的查询语言代替 sql,比如 hql,还有 JPQL 等。支持 JPA 的框架,例如 Ebean 都属于这种类型的框架。

但封装 SQL,使用另一种纯的面向对象查询语言代替 sql,真的能够让程序员更容易实现持久层操作吗?MyBatis 的流行证明了事实并非如此,至少在大多数情况下,使用 hql 并不比使用 sql 简单。首先,从很多角度上看,hql/JPQL 等语言更加复杂和难以理解;其次就是性能上明显降低,速度更慢,内存占用巨大,而且还不好优化。最为恼火的是,当关系的概念被替换为对象的概念之后,查询语言的灵活性变得很差,表达能力也比 sql 弱很多。写查询语句的时候受到各种各样的限制,一个典型的例子就是多表关联查询。

不管是 hibernate 还是 jpa,表之间的连接查询,被映射为实体类之间的关联关系,这样,如果两个实体类之间没有(实现)关联关系,你就不能把两个实体(或者表)join 起来查询。这是很恼火的事情,因为我们很多时候并不需要显式定义两个实体类之间的关联关系就可以实现业务逻辑,如果使用 hql,只是为了 join 我们就必须在两个实体类之间添加代码,而且还不能逆向工程,如果表里面没有定义外键约束的话,逆向工程会把我们添加的关联代码抹掉。

MyBatis 则是另外一种类型的持久化框架,它没有封装 SQL 也没有创建一种新的面相对象的查询语言,而是直接使用 SQL 作为查询语言,只是把结果填入 POJO 对象而已。使用 sql 并不比 hql 和 JPQL 困难,查询速度快,可以灵活使用任意复杂的查询只要数据库支持。从 SQL 封装角度上看,MyBatis 比 Hibernate 和 JPA 成功,SQL 本不该被封装和隐藏,让 Java 程序员使用 SQL 既不麻烦也更容易学习和上手,这应该是 MyBatis 流行起来的重要原因。

轻量级持久层框架 JOOQ 也和 MyBatis 一样,直接使用 SQL 作为查询语言,比起 MyBatis,JOOQ 虽然知名度要低得多,但 JOOQ 不但和 MyBatis 一样可以利用 SQL 的灵活性和高效率,通过逆向工程,JOOQ 还可以用 Java 代码来编写 SQL 语句,利用 IDE 的代码自动补全功能,自动提示表名和字段名,减少程序员记忆负担,还可以在元数据发生变化时发生编译错误,提示程序员修改相应的 SQL 语句。

Ebean 作为一种基于 JPA 的框架,它也使用 JPQL 语言进行查询,多数情况下会让人很恼火。但据说 Ebean 不排斥 SQL,可以直接用 SQL 查询,也可以用类似 JOOQ 的 DSL 方式在代码中构造 SQL 语句(还是 JPQL 语句?),但没用过 Ebean,所以具体细节不清楚。

JDBC Template 就不用说了,它根本没做 ORM,当然是纯 SQL 查询。利用 Spring 框架,可以把 JDBC Template 和 JPA 结合起来使用,在 JPA 不好查询的地方,或者效率低不好优化的地方使用 JDBC,缓解了 Hibernate/JPA 封装 SQL 造成的麻烦,但我仍没看到任何封装 SQL 的必要性,除了给程序员带来一大堆麻烦和学习负担之外,没有太明显的好处。

二、DSL 和变化适应性

为了实现复杂的业务逻辑,不论是用 SQL 还是 hql 或者 JPQL,我们都不得不写很多简单的或者复杂的查询语句,ORM 无法减少这部分工作,最多是用另一种面向对象风格的语言去表达查询需求,如前所述,用面向对象风格的语言不见得比 SQL 更容易。通常业务系统中会有很多表,每个表都有很多字段,即便是编写最简单的查询语句也不是一件容易的事情,需要记住数据库中有哪些表,有哪些字段,记住有哪些函数等。写查询语句很多时候成为一件头疼的事情。

QueryDSL、JOOQ、Ebean 甚至 MyBatis 和 JPA 都设计一些特性,帮助开发人员编写查询语句,有人称之为 “DSL 风格数据库编程”。最早实现这类功能的可能是 QueryDSL,把数据库的表结构逆向工程为 java 的类,然后可以让 java 程序员能够用 java 的语法构造出一个复杂的查询语句,利用 IDE 的代码自动补全功能,可以自动提示表名、字段名、查询语句的关键字等,很成功的简化了查询语句的编写,免除了程序员记忆各种名字、函数和关键字的负担。

QueryDSL 有很多版本,但用得多的是 QueryDSL JPA,可以帮助开发人员编写 JPQL 语句,如前所述,JPQL 语句有很多局限不如 SQL 灵活高效。后来的 JOOQ 和 Ebean,基本上继承了 QueryDSL 的思路,Ebean 基本上还是 JPA 风格的 ORM 框架,虽然也支持 SQL,但不清楚其 DSL 特性是否支持 SQL 语句编写,在官网上看到的例子都是用于构造 JPQL 语句。

这里面最成功的应该是 JOOQ,和 QueryDSL 不同,JOOQ 的 DSL 编程是帮助开发人员编写 SQL 语句,抛弃累赘的 ORM 概念,JOOQ 这个功能非常轻小,非常容易学习和使用,同时性能也非常好,不像 QueryDSL 和 Ebean,需要了解复杂的 JPA 概念和各种奇异的限制,JOOQ 编写的就是普通的 SQL 语句,只是把查询结果填充到实体类中(严格说 JOOQ 没有实体类,只是自动生成的 Record 对象),JOOQ 甚至不一定要把结果转换为实体类,可以让开发人员按照字段取得结果的值,相对于 JDBC,JOOQ 会把结果值转换为合适的 Java 类型,用起来比 JDBC 更简单。

传统主流的框架对 DSL 风格支持得很少,Hibernate 里面基本上没有看到有这方面的特性。MyBatis 提供了 "SQL 语句构建器" 来帮助开发人员构造 SQL 语句,但和 QueryDSL/JOOQ/Ebean 差很多,不能提示表名和字段名,语法也显得累赘不像 SQL。

JPA 给人的印象是复杂难懂,它的 MetaModel Api 继承了特点,MetaModel API+Criteria API,再配合 Hibernate JPA 2 Metamodel Generator,让人有点 QueryDSL JPA 的感觉,只是绕了一个大大的弯,叠加了好几层技术,最后勉强实现了 QueryDSL JPA 的简单易懂的功能。很多人不推荐 JPA+QueryDSL 的用法,而是推荐 JPA MetaModel API+Criteria API+Hibernate JPA 2 Metamodel Generator 的用法,让人很难理解,也许是因为这个方案是纯的标准的 JPA 方案。

数据库 DSL 编程的另一个主要卖点是变化适应性强,数据库表结构在开发过程中通常会频繁发生变化,传统的非 DSL 编程,字段名只是一个字符串,如果字段名或者类型改变之后,查询语句没有相应修改,编译不会出错,也容易被开发人员忽略,是 bug 的一个主要来源。DSL 编程里面,字段被逆向工程为一个 java 类的属性,数据库结构改变之后,作为 java 代码一部分的查询语句会发生编译错误,提示开发人员进行修改,可以减少大量 bug,减轻测试的负担,提高软件的可靠性和质量。

三、跨数据库移植

Hibernate 和 JPA 使用 hql 和 JPQL 这类数据库无关的中间语言描述查询,可以在不同数据库中无缝移植,移植到一个 SQL 有巨大差别的数据库通常不需要修改代码或者只需要修改很少的代码。Ebean 如果不使用原生 SQL,而是使用 JPA 的方式开发,也能在不同数据库中平滑的移植。

MyBatis 和 JOOQ 直接使用 SQL,跨数据库移植时都难免要修改 SQL 语句。这方面 MyBatis 比较差,只有一个动态 SQL 提供的特性,对于不同的数据库编写不同的 sql 语句。

JOOQ 虽然无法像 Hibernate 和 JPA 那样无缝移植,但比 MyBatis 好很多。JOOQ 的 DSL 很大一部分是通用的,例如分页查询中,Mysql 的 limit/offset 关键字是很方便的描述方式,但 Oracle 和 SQLServer 的 SQL 不支持,如果我们用 JOOQ 的 DSL 的 limit 和 offset 方法构造 SQL 语句,不修改移植到不支持 limit/offset 的 Oracle 和 SQLServer 上,我们会发现这些语句还能正常使用,因为 JOOQ 会把 limit/offset 转换成等价的目标数据库的 SQL 语句。JOOQ 根据目标数据库转换 SQL 语句的特性,使得在不同数据库之间移植的时候,只需要修改很少的代码,明显优于 MyBatis。

JDBC Template 应该最差,只能尽量使用标准 sql 语句来减少移植工作量。

四、安全性

一般来说,拼接查询语句都会有安全隐患,容易被 sql 注入攻击。不论是 jdbc,还是 hql/JPQL,只要使用拼接的查询语句都是不安全的。对于 JDBC 来说,使用参数化的 sql 语句代替拼接,可以解决问题。而 JPA 则应该使用 Criteria API 解决这个问题。

对于 JOOQ 之类的 DSL 风格框架,最终会被 render 为参数化的 sql,天生免疫 sql 注入攻击。Ebean 也支持 DSL 方式编程,也同样免疫 sql 注入攻击。

这是因为 DSL 风格编程参数化查询比拼接字符串查询更简单,没人会拼接字符串。而 jdbc/hql/JPQL 拼接字符串有时候比参数化查询更简单,特别是 jdbc,很多人会偷懒使用不安全的方式。

五、JOOQ 的失败之处

可能大部分人会不同意,虽然 Hibernate、JPA 仍然大行其道,是最主流的持久化框架,但其实这种封装 SQL 的纯正 ORM 已经过时,效益低于使用它们的代价,应该淘汰了。MyBatis 虽然有很多优点,但它的优点 JOOQ 基本上都有,而且多数还更好。MyBatis 最大的缺点是难以避免写 xml 文件,xml 文件编写困难,容易出错,还不容易查找错误。相对于 JOOQ,MyBatis 在多数情况下没有任何优势。

Ebean 同时具有很多不同框架的优点,但它是基于 JPA 的,难免有 JPA 的各种限制,这是致命的缺点。

JOOQ 这个极端轻量级的框架技术上是最完美的,突然有一天几个 Web 系统同时崩了,最后发现是 JOOQ 试用期过期了,这是 JOOQ 的失败之处,它不是完全免费的,只是对 MySql 之类的开源数据库免费。

最终,我决定选择 JDBC Template。

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.2 数据分组与透视(CUBE/ROLLUP/GROUPING SETS) 阅读详情

相关推荐

新手如何结合pbootCMS和宝塔面板快速构建网站

摘要: 新手可通过pbootCMS(轻量CMS)和宝塔面板(可视化工具)快速搭建网站,无需命令行。步骤包括:1) 准备服务器(Linux/CentOS7.x)和域名;2) 安装宝塔面板并配置LNMP环境(PHP7.4+MySQL5.7);3) 创建网站目录,上传并解压pbootCMS源码,设置文件权限;4) 运行安装向导,填写数据库信息和管理员账号;5) 测试前台/后台功能,优化性能并绑定域名。全程约30-60分钟,宝塔简化运维,pbootCMS便于内容管理,适合零基础用户。注意定期更新和备份以保障安全。

qinzhenyan的博客 1643

JPA、Hibernate和Mybatis区别和总结

一、应用场合: 传统公司、部分个人开发者喜欢用jpa;而互联网公司更青睐于mybatis 原因: 1、mybatis更加灵活,开发迭代模式决定了他是互联网公司的首先;每一次的修改不会带来性能上的下降。 2、传统公司需求迭代速度慢、项目改动小,hibernate可以做到一劳永逸;hibernate容易因为添加关联关系或者开发者不了解优化导致项目,造成越改越糟糕。 二、各自特点: 1、my...

qq_25180071的博客 2万+

从零开始:如何用STM32和MAX30100打造你的第一台智能心率监测设备

本文详细介绍了如何使用STM32微控制器和MAX30100传感器从零开始构建智能心率监测设备。涵盖硬件选择、电路设计、软件开发到心率算法实现的全过程,特别适合嵌入式开发新手和创客。通过OLED显示和蓝牙串口传输数据,打造低成本、高精度的心率检测仪,为健康监测项目提供实用解决方案。

7z8x2c4v6b9的博客 194

数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!

因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template。 Hibernate和Mybatis是使用最多的两个主流框架,而JOOQ、Ebean等小众框架则知道的人不多,但也有很多独特的优点;而JPA则是一组Java持久层Api的规范,Spring Data JPA是JPA Repository的实现,本来和Hibernate、Mybatis、JOOQ之类的框架不在同一个层次上,但引.

aiwokache的博客 356

【SOFA】SOFA框架+Win10+VS2019 配置

SOFA (Simulation Open Framework Architecture)官网 SOFA 是一个开源的仿真框架,用于实时的物理仿真,而且主要针对医学上的仿真。主要用于研究人员开发新的算法,也可以作为一个有效的快速成型工具或是物理引擎。 官网中给出的配置方法写的很清晰,有着各个库或者软件的版本要求,仔细看按版本要求来 官网配置地址 官网给了两种方 1.通过脚本自动配置 2. 自己下载相关库通过CMake进行生成 第一种 没使用,不知道是否好使,因为如果其中有下载的东西,国内不一定能成功,大家可

GordonWei 5261

01|无代码开发 | 如何使用Zion实现导航网站制作

以上就是我制作导航网站的心得,分享给大家,作为一个小白想要独立搭建一个网站还是比较困难的,而在Zion不仅可以用可视化的方法进行搭建,甚至还可以一键发布,不用考虑服务器域名啥的问题,真是太方便了。

2301_76262110的博客 1390

思考:为什么很多人不愿意用hibernate了?

hibernate将数据库与开发者隔离了,开发者不需要关注数据库是Oracle还是MySQL,hibernate来帮你生成查询的sql语句,但问题来了,如果你想用某种数据库特有的功能,或者要让查询的sql完全符合你的心意,这就难了。的确很多地方Hibernate可以强大的只用一行代码解决很多问题,但比如说一个update()或者save()到底做了什么,这里既有hibernate本身的逻辑,也有你应用的逻辑,如果这一行产生了问题,你该如何去做?hibernate对一对多,多对多关系实现是非常好的。

qq_66627105的博客 1085

【雷达成像实战】RD、CS、RMA算法对比与Matlab实现:从信号处理到高清成像

本文深入对比了雷达成像中三种核心算法:经典的距离多普勒算法(RD)、基于稀疏重建的压缩感知算法(CS)以及高精度的快速多通道获取算法(RMA)。通过详细的Matlab实战代码,从原理拆解到实现步骤,分析了各自在计算效率、成像精度、数据需求和适用场景上的优劣,为工程选型与算法实践提供了清晰指南。

weixin_29095587的博客 452

Hibernate为什么如此流行?

Hibernate为什么如此流行?作者:robbin 来源:hibernate这篇文章是Gavin King写的,非常有趣,充分体现了Hibernate的设计理念,我粗略的意译如下: 下面是对Hibernate开发工作的个人想法,正是这些工作使得Hibernate如此迅速的得到广泛的欢迎。 1、飞快的版本发布 保持活跃的开发速度,经常进行版本

bluevoyage的专栏 1706

15张图详解三方支付:总架构、5大核心业务处理流程、备付金管理

用户可以将银行卡与零钱账户绑定,建立银行结算账户与支付账户的连接,然后将银行账户资金充值到零钱账户中,或将零钱账号中的余额提现至绑定的银行卡。因此,用户在A支付机构的零钱一般只能支付给A支付机构的商户,如支付宝的零钱不能支付给微信的商户。这五大业务的协同运作,使得第三方支付机构这一庞大的支付服务平台能够为市场提供卓越的支付能力。到了结算时间,网联会向备付金集中存管账户提交结算指令,在第三方支付机构备付金集中存管账户内完成最终的结算,并将结算结果及额度变动情况通知给第三方支付机构,具体流程如图13所示。

银行信息系统应用架构详解 1044

【系统架构设计师】预测试卷一:综合知识(75道选择题)

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,架构风格反映领域中众多系统所共有的结构和 (48),强调对架构(49)的重用。 (48) A. 语义特性 B. 功能需求 C. 质量属性 D. 业务规则 (49) A. 分析 B. 设计 C.实现

数据知道的博客 7767

ssh之为什么要放弃ssh?

本文经转载, 源出处不详.https://www.cnblogs.com/hackxiyu/p/6849085.html 最近听一些朋友说,招聘面试的很多人简历都差不多,大部分人的简历上面都写了熟悉ssh框架,我朋友就在吐槽,为什么这些人简历都差不多,并且都熟悉ssh框架? 后面他说, 可能这些人都是培训机构出来的, 然后培训机构对于完全外行的人都是简单培训了基本的java语法,然后介绍ssh...

weixin_34211761的博客 1473

Qt代码-无人机地面站系统

无人机地面站系统是无人机与操作员交互的核心枢纽,需实现**无人机状态监控**(位置、姿态、电池等)、**实时通信**(基于MAVLink协议)、**任务规划**(航点编辑、航线生成)、**地图显示**(无人机位置与航迹)、**参数配置**(传感器校准、飞行模式设置)等核心功能。地面站作为`MAV_COMP_ID_GCS`(地面控制站组件ID=255),无人机通常为`MAV_COMP_ID_AUTOPILOT1`(组件ID=1)。// 航点/盘旋指令。// 北京坐标(示例)

寒寒豆豆软件公司的博客 324

为什么放弃使用 Hibernate、JPA、Mybatis 数据持久化框架,最终选择 JDBCTemplate!

>>号外:关注“Java精选”公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料、开源项目。因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的...

Java精选 548

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

hibernate mybatis_数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!...

点击上方“JAVA”,星标公众号重磅干货,第一时间送达因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template。Hibernate和Mybatis是使用最多的两个主流框架,而JOOQ、Ebean等小众框架则知道的人不多,但也有很多独特的优点;而JPA则是一组Java持...

weixin_39933414的博客 66

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

hibernate mybatis_数据持久化框架为什么放弃 Hibernate、JPA、Mybatis,最终选择 JDBCTemplate!...

来源:sf.gg/a/1190000018472572一、SQL 封装和性能二、DSL 和变化适应性三、跨数据库移植四、安全性五、JOOQ 的失败之处因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ 是总体上最好的,可惜不是完全免费,最终选择 JDBC Template。Hibernate 和 Mybatis 是使用最多的两个...

weixin_39970064的博客 82

计算机控制技术及应用

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

为什么放弃Hibernate、JPA、Mybatis持久化框架,最终选择JDBCTemplate?

这符合ORM最初的理想,ORM认为Java程序员使用OO的思维方式,和关系数据库的思维方式差距巨大,为了填补对象和关系思维方式的鸿沟,必须做一个对象到关系的映射,然后在Java的对象世界中,程序员可以使用纯的对象的思维方式,查询POJO对象,查询条件是对象属性,不再需要有任何表、字段等关系的概念,这样java程序员就更容易做持久层的操作。可能大部分人会不同意,虽然Hibernate、JPA仍然大行其道,是最主流的持久化框架,但其实这种封装SQL的纯正ORM已经过时,效益低于使用它们的代价,应该淘汰了。

JBIB ENGINE 1160
上一篇: 没想到,他面试竟然挂在了Spring的这个点上...
下一篇: 最新版全套 Java 学习资料,现在免费送你,限时有效,过时立即删除!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值