mybatis自定义typeHandler映射对象为JSON

如何获取SAP BTP账户及BAS启用 返回到 Service Marketplace 点击SAP Business Application Studio 然后go to Application。进入子用户的OverView里面找到Entitlements添加SAP Business Application Studio。注意:在选购BTP免费环境的时候,使用人要选公司才可以成功。在完成上述操作后,就可以登陆Cockpit。这里有SAP官方的BTP试用的手顺链接。配置权限※我绑定的是登录时的邮箱。※过程中有问题可以在评论区讨论。 阅读详情
技术背景: 
一个domain对象不可避免的会出现List、Map类型的字段,或者将多个字段拼装到一个字段的情况。
前者存在是业务及设计的需求,后者出现是当初设计数据库没有考虑那么多字段,业务快速发展时需要增加字段,数据库数据量大时,添加一个字段非常耗时,有可能中断服务。为保证服务的可用性,及减少数据订正麻烦,应对频繁的业务变更,会把几个字段拼接到一个字段中。
 这些字段在domain对象中往往采用下面的方式进行处理:解析字段成需要的类型,拼接多个字段填充成一个字段。操作过程类似下面的代码:

public class User implements Serializable{ private static final long serialVersionUID = -3120416800441648924L; private List<String> hobbys;

//存储hobbys private String hobbyExt; private String ext1; private String ext2; private String ext3; //存储ext1 、 ext2、 ext3 的信息 private String extInfo; public String getExtInfo() { return extInfo; } public void setExtInfo(String extInfo) { this.extInfo = extInfo; } public String getExt1() { return ext1; } public void setExt1(String ext1) { this.ext1 = ext1; } public String getExt2() { return ext2; } public void setExt2(String ext2) { this.ext2 = ext2; } public String getExt3() { return ext3; } public void setExt3(String ext3) { this.ext3 = ext3; } public List<String> getHobbys(){ this.parseInfo(); return hobbys; } public void parseInfo() { //TODO 解析字段hobbyExt 成hobbys, 将extInfo解析成ext1、ext2、ext3 } public void fillExtendInfo(){ //TODO 将List hobbys拼装成一个字符串,ext1、ext2、ext3拼接成一个字符串 } public String getHobbyExt() { return hobbyExt; } public void setHobbyExt(String hobbyExt) { this.hobbyExt = hobbyExt; } public void setHobbys(List<String> hobbys) { this.hobbys = hobbys; } }

这样处理操作繁琐,程序进行存取时要注意解析及填充操作,如果一旦忽略或误用了某个操作,会导致数据库中某个信息没被填充进去,或者产生一些脏数据,极易引入潜在的bug。
       领一种解决解决方法是将解析及填充操作放到DO对象的set及get方法中,类似下面的代码:

public List<String> getHobbys(){ this.parseInfo(); return hobbys; }

        这种处理方式会导致每次存取该字段时都要进行解析操作,增加了不必要的性能开销。不同程序员对不同domain对象定义难以想用,这种解析操作无法共用。如果要增加附加字段,需修改原有的解析方法,又增加了引入bug的风险。这种拼接,解析操作也减低了程序的易读性,导致可维护性降低。

如何避免这种拼接及解析的操作,创建一个干净的domain对象呢?

下面是一个干净的domain对象及其对应的ibatis的的映射文件配置:
UserDO 对象:

//UserDO 对象

public class UserDO implements Serializable { private static final long serialVersionUID = 377875304139361819L; private int id; private String name; private UserExtDO extDO; private List<String> hobbys ; private Map<String,String> votes; public Map<String, String> getVotes() { return votes; } public void setVotes(Map<String, String> votes) { this.votes = votes; } public void addHobby(String hobby){ if(hobbys == null){ hobbys = new ArrayList<String>(); } hobbys.add(hobby); } public List<String> getHobbys() { return hobbys; } public void setHobbys(List<String> hobbys) { this.hobbys = hobbys; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public UserExtDO getExtDO() { return extDO; } public void setExtDO(UserExtDO extDO) { this.extDO = extDO; } }

//其扩展字段的对象

public class UserExtDO implements Serializable{ private static final long serialVersionUID = -6065939028174333314L; private String school; private List<String> loves;  

public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } public List<String> getLoves() { return loves; } public void setLoves(List<String> loves) { this.loves = loves; } public void addLove(String love){ if(loves == null){ loves = new ArrayList<String>(); } loves.add(love); } }

 UserDO 的ORM映射文件:

<?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="UserDO"> <resultMap type="UserDO" id="UserDO"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="extDO" column="extDO" /> </resultMap> <parameterMap type="UserDO" id="UserDO"> <parameter property="id"/> <parameter property="name"/> <parameter property="extDO"/> </parameterMap> <select id="selectAllUsers" resultType="UserDO"> select * from user </select> <insert id="insertUser" parameterType="UserDO"> insert into user(id, name, extDO, hobbys, votes) values(#{id}, #{name}, #{extDO}, #{hobbys}, #{votes} ); </insert> <select id="mapTest" resultType="UserDO"> select * from user where votes like #{keyword} </select> </mapper>

     查看UserDO映射文件,extDO字段是一个对象,程序中没有任何拼接代码,怎么能存到数据库中呢?数据库中该字段时什么类型呢?数据库中extDO的类型如下图:
自定义typeHandler映射JSON与对象增强mybatis功能 - gubaojian - 为世界之光
           extDO字段是Text类型。 UserExtDO对象存储到一个text类型的字段上了,这是如何实现的呢? 这就要靠mybatis提供的自定义类型处理器功能了。
          MyBatis 在预处理语句中设置一个参数,或从结果集中获取一个值时,会使用类型处理器typeHandler将获取的值以合适的方式转换成 Java 类型。数据库中的基本类型之所以能被mybatis转换成Java类型,是因为mybatis已经内置了这些类型的处理器,如下图是mybatis内置的部分处理器: 
自定义typeHandler映射JSON与对象增强mybatis功能 - gubaojian - 为世界之光
        除内置的类型处理器外,mybatis同时提供了类型处理器的扩展功能,允许程序自定类型处理器,或者替换内置的类型处理器。 自定义的类型处理器只需继承TypeHandler接口,然后在xml配置文件配置一下,或者用程序注册类型处理器,即可实现自定义处理器的功能。 
        UseExtDO及List、 Map字段只所以能直接存储到数据库中,就是采用自定义的类型处理器实现的。 在存储时,利用类型处理器将对象序列化成JSON字符串,存储到数据库的一个字段中,在取出时类型处理器将json数据进行解析,反序列化成对象。类型处理器代码如下:

import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import com.alibaba.fastjson.JSON;

public class JSONHandler implements TypeHandler<Object> { /** * json数据和类名的分隔符号 * */ private static final char SPLIT = '/'; public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { if(parameter == null){ ps.setString(i, null); return; } String json = JSON.toJSONString(parameter); json = json + SPLIT + parameter.getClass().getName(); ps.setString(i, json); } public Object getResult(ResultSet rs, String columnName) throws SQLException { String json = rs.getString(columnName); return jsonToObject(json); } public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { String json = cs.getString(columnIndex); return jsonToObject(json); } /** * json 转换成对象 * */ private Object jsonToObject(String json){ if(json == null){ return null; } int index = json.lastIndexOf(SPLIT); if(index < 0){ return null; } String key = json.substring(index + 1, json.length()); json = json.substring(0, index); Class<?> cls = null; try { cls = Class.forName(key); } catch (ClassNotFoundException e) { throw new RuntimeException("序列化成json时找不到指定的类", e); } Object ob = JSON.parseObject(json, cls); return ob; } }

在ibatis.xml 文件增加如下配置: 

<typeHandlers> <typeHandler javaType="com.jianbai.learn.ibatis.domain.UserExtDO" jdbcType="TEXT" handler="com.jianbai.learn.ibatis.handler.JSONHandler"/> <typeHandler javaType="java.util.Map" jdbcType="TEXT" handler="com.jianbai.learn.ibatis.handler.JSONHandler"/> <typeHandler javaType="java.util.List" jdbcType="TEXT" handler="com.jianbai.learn.ibatis.handler.JSONHandler"/> </typeHandlers>

或者通过程序注册类型处理器: 

Reader rd = Resources.getResourceAsReader("ibatis.xml"); SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(rd); Configuration cfg = sf.getConfiguration(); TypeHandlerRegistry tr = cfg.getTypeHandlerRegistry(); //程序注册,不然不起作用 tr.register(UserExtDO.class, new JSONHandler()); tr.register(List.class, new JSONHandler()); tr.register(Map.class, new JSONHandler());

         这样既可把List、Map及对象当做基本类型进行存储。  如果需要在UserExtDO 添加字段,则直接添加属性,设置普通的set和get方法既可,无需做拼接解析操作,并且mybatis配置及映射文件无需做任何变化,数据库也无需做任何变化。 减少字段也可以很方便的进行。 业务开发人员无需在做任何字段的解析及拼接的操作, 极大增强了程序的扩展性,易读性,及维护性。    

实际数据库中存储形式如下:

自定义typeHandler映射JSON与对象增强mybatis功能 - gubaojian - 为世界之光
 
       当然你也可以将Java对象存储成其它形式,比如直接采用Java内置的序列化进行处理,存储成二进制的形式。  选用json主要出于通用性考虑,可视化的存储结果,便于对存储结果进行操作及扩展。

相关资源: 
 mybatis参考                            :   http://www.mybatis.org/ 
序列化JSON采用的库FastJSON  :   http://code.alibabatech.com/wiki/display/FastJSON/Inside+Fastjson
Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南 本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。 阅读详情

相关推荐

基于STM32的RS485土壤氮磷钾与PH传感器数据采集与OLED显示实战(附完整代码)

本文详细介绍了基于STM32单片机通过RS485协议采集土壤氮磷钾与PH传感器数据的实战项目。涵盖硬件选型、连接方法、Modbus-RTU通信协议解析、STM32程序实现及OLED显示,提供完整代码和调试技巧,适用于农业物联网环境监测系统。

kotlin6android的博客 335

java-Mybatis自定义JsonObjectTypeHandler动态解析数据库JSON类型数据

配置并使用自定义的TypeHandler比较容易,继承个基类实现几个方法就OK了。不过总有一种猜的成分在里面,不知道他是如何工作如何实现的,甚至不清楚我自定义的handler是否成功,是否注册到了需要生效的位置。如果不通过分析代码分析流程自己永远只能在“黑盒”之外用一用。遇到问题解决问题,是很好的学些过程,在时间和进度允许的的情况下,可以钻下“牛角尖”。

草青工作室 的专栏 3150

手把手教你用Logisim搞定华科计组实验:单总线CPU硬布线控制器设计(含Excel自动生成电路技巧)

本文详细解析了如何使用Logisim完成华科计组实验中的单总线CPU硬布线控制器设计,特别分享了利用Excel自动生成电路逻辑的高效技巧。从实验准备、状态机表格填写到模块化构建和系统联调,提供全流程实战指导,帮助读者快速掌握计算机组成原理核心概念,大幅提升实验效率。

weixin_28744423的博客 321

springboot+mybatis自定义typeHandler 解决varchar到JsonObject的映射

【代码】springboot+mybatis自定义typeHandler 解决varchar到JsonObject的映射。

Nio的博客 826

slam_toolbox 简介和使用

专为移动机器人在未知环境中实时构建地图和定位设计。它适用于2D和3D环境,支持多种机器人平台和传感器配置。

weixin_74808846的博客 3305

TSMaster如何用珠海创芯CAN卡实现高效CAN通信(附完整驱动安装指南)

本文详细介绍了如何使用TSMaster软件与珠海创芯CAN卡实现高效CAN通信,包括驱动安装、系统配置、ControlCAN.dll替换及TSMaster集成配置等关键步骤。通过实战指南和故障排除技巧,帮助工程师快速搭建稳定可靠的CAN通信测试环境,适用于汽车电子和工业控制等领域。

weixin_29201859的博客 479

MybatisPlus 自定义 TypeHandler 映射JSON类型为JSONObject,报错 no typehandler found for property dataparams

3.xml中对应的 result要加属性,mybatis-plus就方便多了,框架已经实现了自定义typeHandler类。2.实体类型为JSONObject,头上也要加注解。1.实体类上一定要加注解。

weixin_59755109的博客 3146

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

http://www.cierobot.com 1522

在Mybatis-Plus中指定TypeHandler后不生效的问题与解决办法

实体类上打上注解:@TableName(value = "数据库表名", autoResultMap = true)经过如此指定之后,在插入时,表现正常,查询时则查出来一个无符号数。是一个将 32 位无符号数转换为字符串(或者反过来)的处理器。如果mapper中是以。resultMap接收。

。度的博客 7836

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 298

Electron vue3 - 使用SerialPort与串口交互教程,计算机串行端口(COM口、USB转串口等)进行通信连接读取或写入Arduino、单片机、PLC、扫码枪、打印机、老式调制解调器!

实战Electron使用SerialPort与串口交互详细全过程,Electron-vue3与串口交互示例,Electron vue使用serialport实现串口交互通讯,Electron-vue使用serialport连接本地串口,electron-vue 台称串口对接 SerialPort,electron串口调试工具,electron+vue+serialport实现串口通信,串口通信serialport使用和调试,electron-vue使用serialport串口通信及踩过的坑(已解决!)ele

🏆 前端领域优质创作者 4640

Mybatis 通用JSON Type Handler (无需在mapper.xml中配置)

MappedJdbcTypes(JdbcType.VARCHAR) ,这两个注解表示将JdbcType.VARCHAR(数据库VarChar)类型转换为 JSONArray.class, JSONObject.class (FastJson)类型,如果需要加上其他的类进行转换,@MappedTypes注解中追加类型即可。在这个案例中,我们使用了alibaba的fastJson库将 JSON 数据转化为字符串,并且将需要处理的类进行了强制转换。:从结果集中根据列索引获取结果并转化为 Java 对象。

chen_ke_java的博客 1230

[PCIE5.0] 2.2.8.3 Error Signaling Messages

错误信号消息用于在 PCI Express 设备之间传递错误信息,帮助系统发现并报告错误。每当发生某种错误时,检测到该错误的设备会通过发送这些消息来通知系统。• 没有数据负载:这些错误信号消息不包含任何数据(即 TLP Type 是 Msg),它们仅用于错误报告。• 长度字段保留:在这些消息中,长度字段是保留的,不使用。• 功能号(Function Number)字段:这个字段标识哪个设备发生了错误。

系统固件工程师 292

数据库存json ,mybatis拿对象映射,自定义typeHandler

以下是json tyHandler /** mapper里json型字段到类的映射。 用法一: 入库:#{jsonDataField, typeHandler=com.adu.spring_test.mybatis.typehandler.JsonTypeHandler} 出库: 用法二: 1)在mybatis-config.xml中指定handler: <typeHandlers> <typeHandler...

weixin_44862610的博客 807

WINCC7.3破解文件

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mybatis 自动映射对象为json

一般我们关系型数据库存储的字段都是从不同单一维度描述这个对象, 而随着业务的复杂和数据维度的增加, 我们有时候需要直接将一些简单维度(只作展示, 不涉及条件查询以及基本不修改)的集合封装成json格式放入一个大字段中(避免联合查询的额外扫表的开销) typeHandler的方式做对象映射 本文只介绍简单的使用方式, 具体原理和详细解析请跳转以下链接 参考资料 https://www.codenong.com/js92a4cfdcc700/ https://juejin.im/post/68449039.

_WanG 5790

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

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

Mybatis实现存取Mysql的Json字段映射Java对象

Mybatis实现存取Mysql的Json字段映射Java对象一、需求二、解决方案 一、需求 在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信息。使用json格式存储数据有它的优缺点,在这里我们就不细说了,有兴趣的朋友可以去查一下。 在进行开发的过程中,我们是希望在mysql中查询出的json格式数据直接映射成java对象;而java对象也可以转换成json格式数据进行存储;在这里记录一下我们如何实现这样的需求。 二、解决方案 定义一个JsonTypeH

daviddairy的博客 4441

如何使用自定义Mybatis-TypeHandler直接将查询到的JSON数据封装到指定对象,达到可复用?

使用自定义Mybatis-TypeHandler直接将查询到的JSON数据封装到指定对象,达到可复用!! ​ 前言:最近在做项目的时候,遇到一个问题,就是数据量特别大的情况下,除了分表分库,索引层面优化,以及加缓存以外,还可以对数据进行进一步处理,比如你要查明细数据,你可以将这些明细信息以Json的形式存储在数据库中,另外保留一些基础信息,这样就能把大量的数据缩减,提高查询效率,我们知道Mybatis默认的JdbcType 是没有Json类型的,那么如何把查询得到的json结果封装成我们需要的对象呢,My

我是个小佬 4136

使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型

postgres里的json格式 我们在使用postgres数据库时会使用到json格式来存放一些格式不固定的字段,postgres支持json和jsonb两种格式,两者的区别以后再说,今天说一下结合mybaits的使用方法: 1. typeHandler的实现 mybatis默认是没有实现json类型字段对应的TypeHandler,所以一般我们需要自定义mybatis的TypeHand...

学习 8476

Mybatis之TypeHandler(自定义接收返回数组或对象的数据类型)

mybatis默认是没有实现jsonb类型字段对应的TypeHandler,所以一般我们需要自定义mybatis的TypeHandler的一个简单实现:1、jsonarray数组json: 2、jsonObjectd对象: 数据类型举例:

奋斗男孩的博客 4067

mysql5.7支持json,mybatis不支持json

mybatis提供了解决方案,就是自定义 typeHandler,然后再 sql 那里指定 你要使用 的typeHandler 下面是我代码的配置: <?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="

LYR 的博客 926

java中提供的json类_MyBatis里json型字段到Java类的映射

标签:一、简介我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字段串字段与Java类的相互类型转换。当然,你可以为每个类写一个MyClassTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐。有了泛型,一个通用的TypeHandl...

weixin_39598941的博客 240

Mybatis标签之 typeHandlers 使用及解析

Mybatis标签之TypeHandler使用及解析 一、typeHandlers作用 由于Java 类型和数据库的 JDBC 类型不是一一对应的(比如 String 与 varchar), 所以我们把 Java 对象转换为数据库的值,和把数据库的值转换成 Java 对象,需要经过 一定的转换,这两个方向的转换就要用到 TypeHandle

weixin_45538589的博客 7075

基于mybatis-typeHandler扩展 对象、对象集合以json的形式存取数据库

目录问题的诞生问题的解决解决环境代码如下如何要写个抽象的类代码整完之后,就要开始配置咯MP下使用 问题的诞生 有些业务场景下,数据库中字符串字段要存一个json,比方说:商品的展示图片集合、文档的附件集合之类的。 那么就会出现这种情况- - @Data @Accessors(chain = true) public class ProductVO implements Serializable { private static final long serialVersionUID = 64216

腹肌有啥用 945

MyBatis里json型字段到Java类的映射

一、简介   我们在用MyBatis里,很多时间有这样一个需求:POJO里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字符串字段与Java类的相互类型转换。   当然,你可以为每个类写一个MyClassTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐。   有了泛型,一个通用的...

weixin_34219944的博客 1354

mybatis json字段处理

前言 最近遇到了使用mysql的json类型字段的解析问题,之前的开发的时候,刚开始用的就是mybatis,为了解决json字段的问题,有的同事是把json字段映射成Java里的String,手动在业务代码里转化,也有同事尝试用typeHandler自动解析,可惜没成功,最近我接受这部分代码,花了一天的时间才完成自动解析的配置。 目的 最终的目的是希望json字段能自动映射成java对象。 基本情况说明 Java表对应的java实体 TeacherDO { private Student stud

web15870359587的博客 1719

java自定义字段设计_mybatis源码系列之自定义typeHandler

上一章我们提到typeHandler但是并没有做详细的介绍,那么现在我将详细说明一下typeHandler的作用以及自定义方式。众所周知,mybatis是一个ORM框架,即对象关系映射框架。那我们在执行sql语句的时候是如何将Java类型的数据映射成数据库类型的值呢,这个时候就用到了typeHandler。在执行sql语句前,它会将JavaType类型的传参映射成jdbcType类型的参数,执行s...

weixin_28893183的博客 414

MyBatis-Plus13:自定义 TypeHandler

/ 存数据库时:明文 → 加密 → 存密文@Override// 取数据库时:密文 → 解密 → 返回明文(按列名)@Override// 取数据库时:密文 → 解密 → 返回明文(按列下标)@Override// 存储过程@Override因为这个需求是在 Java 和数据库之间做了额外的业务处理(加解密),不是简单的类型转换,任何内置的 TypeHandler 都做不到,只能自己写。

qq_31532983的博客 892
上一篇: AbstractQueuedSynchronizer框架
下一篇: 浅谈Java并发编程系列(七) ——— 深入解析synchronized关键字
codershamo
博客等级 码龄10年 22粉丝 12原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值