Java持久性API(JPA)第6讲——关系操作

目标:通过实例掌握常用的具有关系的实体操作,实例采用大家比较熟悉的订单管理。
主要内容:
n 创建数据库表,包括订单表和订单明细表。
n 创建持久单元和实体类
n 创建管理实体类的会话Bean,添加添加订单、删除订单和察看所有订单的功能。
n 编写客户端程序进行测试。
注意:在完成第三次大作业的时候可以参考这个内容,但是不要完全按照这个做。
1、创建数据库表
订单管理包括订单表和订单明细表(正常情况下,还应该包含物品表,为了讲解方便),表定义语句如下:
create table ordertable
(
orderid char(10) not null,
orderdate date,
orderstate char(1),
userid char(10),
primary key(orderid)
);
create table orderdetail
(
orderid char(10),
goodid char(10),
quantity int,
primary key(orderid,goodid),
foreign key(orderid) references ordertable(orderid)
);
2、创建持久单元和实体类
操作过程与前面几讲的操作过程相同。
根据上面的表结构生成的实体类的代码如下。
2.1 实体类Ordertable:
package order;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "ordertable")
@NamedQueries( {
@NamedQuery(name = "Ordertable.findByOrderid", query = "SELECT o FROM Ordertable o WHERE o.orderid = :orderid"),
@NamedQuery(name = "Ordertable.findByOrderdate", query = "SELECT o FROM Ordertable o WHERE o.orderdate = :orderdate"),
@NamedQuery(name = "Ordertable.findByOrderstate", query = "SELECT o FROM Ordertable o WHERE o.orderstate = :orderstate"),
@NamedQuery(name = "Ordertable.findByUserid", query = "SELECT o FROM Ordertable o WHERE o.userid = :userid")
})
public class Ordertable implements Serializable {
@Id
@Column(name = "orderid", nullable = false)
private String orderid;
@Column(name = "orderdate")
@Temporal(TemporalType.DATE)
private Date orderdate;
@Column(name = "orderstate")
private Character orderstate;
@Column(name = "userid")
private String userid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ordertable",fetch=FetchType.EAGER)
private Collection<Orderdetail> orderdetailCollection;
/** Creates a new instance of Ordertable */
public Ordertable() {
}
public Ordertable(String orderid) {
this.orderid = orderid;
}
public String getOrderid() {
return this.orderid;
}
public void setOrderid(String orderid) {
this.orderid = orderid;
}
public Date getOrderdate() {
return this.orderdate;
}
public void setOrderdate(Date orderdate) {
this.orderdate = orderdate;
}
public Character getOrderstate() {
return this.orderstate;
}
public void setOrderstate(Character orderstate) {
this.orderstate = orderstate;
}
public String getUserid() {
return this.userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public Collection<Orderdetail> getOrderdetailCollection() {
return this.orderdetailCollection;
}
public void setOrderdetailCollection(Collection<Orderdetail> orderdetailCollection) {
this.orderdetailCollection = orderdetailCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (this.orderid != null ? this.orderid.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Ordertable)) {
return false;
}
Ordertable other = (Ordertable)object;
if (this.orderid != other.orderid && (this.orderid == null || !this.orderid.equals(other.orderid))) return false;
return true;
}
@Override
public String toString() {
return "order.Ordertable[orderid=" + orderid + "]";
}
}
2.2 实体类Orderdetail:
package order;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name = "orderdetail")
@NamedQueries( {
@NamedQuery(name = "Orderdetail.findByOrderid", query = "SELECT o FROM Orderdetail o WHERE o.orderdetailPK.orderid = :orderid"),
@NamedQuery(name = "Orderdetail.findByGoodid", query = "SELECT o FROM Orderdetail o WHERE o.orderdetailPK.goodid = :goodid"),
@NamedQuery(name = "Orderdetail.findByQuantity", query = "SELECT o FROM Orderdetail o WHERE o.quantity = :quantity")
})
public class Orderdetail implements Serializable {
@EmbeddedId
protected OrderdetailPK orderdetailPK;
@Column(name = "quantity")
private Integer quantity;
@JoinColumn(name = "orderid", referencedColumnName = "orderid", insertable = false, updatable = false)
@ManyToOne
private Ordertable ordertable;
public Orderdetail() {
}
public Orderdetail(OrderdetailPK orderdetailPK) {
this.orderdetailPK = orderdetailPK;
}
public Orderdetail( String orderid,String goodsid) {
this.orderdetailPK = new OrderdetailPK(goodsid, orderid);
}
public OrderdetailPK getOrderdetailPK() {
return this.orderdetailPK;
}
public void setOrderdetailPK(OrderdetailPK orderdetailPK) {
this.orderdetailPK = orderdetailPK;
}
public Integer getQuantity() {
return this.quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Ordertable getOrdertable() {
return this.ordertable;
}
public void setOrdertable(Ordertable ordertable) {
this.ordertable = ordertable;
}
@Override
public int hashCode() {
int hash = 0;
hash += (this.orderdetailPK != null ? this.orderdetailPK.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Orderdetail)) {
return false;
}
Orderdetail other = (Orderdetail)object;
if (this.orderdetailPK != other.orderdetailPK && (this.orderdetailPK == null || !this.orderdetailPK.equals(other.orderdetailPK))) return false;
return true;
}
@Override
public String toString() {
return "order.Orderdetail[orderdetailPK=" + orderdetailPK + "]";
}
}
2.3 订单明细主键类:
package order;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class OrderdetailPK implements Serializable {
@Column(name = "orderid", nullable = false)
private String orderid;
@Column(name = "goodid", nullable = false)
private String goodid;
/** Creates a new instance of OrderdetailPK */
public OrderdetailPK() {
}
public OrderdetailPK(String goodid, String orderid) {
this.goodid = goodid;
this.orderid = orderid;
}
public String getOrderid() {
return this.orderid;
}
public void setOrderid(String orderid) {
this.orderid = orderid;
}
public String getGoodid() {
return this.goodid;
}
public void setGoodid(String goodid) {
this.goodid = goodid;
}
@Override
public int hashCode() {
int hash = 0;
hash += (this.goodid != null ? this.goodid.hashCode() : 0);
hash += (this.orderid != null ? this.orderid.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof OrderdetailPK)) {
return false;
}
OrderdetailPK other = (OrderdetailPK)object;
if (this.goodid != other.goodid && (this.goodid == null || !this.goodid.equals(other.goodid))) return false;
if (this.orderid != other.orderid && (this.orderid == null || !this.orderid.equals(other.orderid))) return false;
return true;
}
@Override
public String toString() {
return "order.OrderdetailPK[goodid=" + goodid + ", orderid=" + orderid + "]";
}
}
3、创建管理实体的会话Bean
在会话Bean中添加如下业务方法:
n 添加订单的方法
n 删除订单的方法
n 查询所有订单的方法
n 为订单添加订单项
3.1 添加业务方法:添加订单
public void addOrder(Ordertable order){
Ordertable newOrder = em.merge(order);
em.persist(newOrder);
}
因为通过参数传递过来的Order实体处理分离状态,所有需要先通过merge操作把该实例转换成被管理的,然后通过persist方法持久化。
注意:在持久化订单的同时,会把与订单关联的订单明细也持久化,这是通过定义管理的时候指定的“cascade”属性完成的,代码如下红色部分:
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "ordertable",fetch=FetchType.EAGER)
private Collection<Orderdetail> orderdetailCollection;
cascade属性的值是CascadeType.ALL,意味着对订单类的操作,都会级联到关联的订单明细,包括下面的订单删除。
3.2 添加业务方法:删除订单
public void removeOrder(String orderid){
Ordertable order = em.find(Ordertable.class,orderid);
em.remove(order);
}
要删除订单,需要查找到该订单,然后再删除。
3.3 添加业务方法:查询所有订单
public List<Ordertable> getAllOrders(){
return em.createQuery("select o from Ordertable o").getResultList();
}
因为订单包括订单明细,所以在查询所有订单的时候,应该把该订单涉及的所有订单明细查询出来,该功能是通过定义关系的时候的fetch属性完成的,代码如下红色部分:
@OneToMany(cascade = CascadeType.ALL,
mappedBy = "ordertable",fetch=FetchType.EAGER)
private Collection<Orderdetail> orderdetailCollection;
如果不需要在加载实体的时候,加载该实体所关联的实体,可以使用FetchType.LAZY。
ManyToOne关系中,fetch属性的默认值是EAGER。
OneToOne关系中,fetch属性的默认值是EAGER。
OneToMany关系中,fetch属性的默认值是LAZY。
ManyToMany关系中,fetch属性的默认值是LAZY。
3.4 添加业务方法:添加订单项
public void addItem(String orderid,String goodsid,int quantity){
Ordertable order = em.find(Ordertable.class,orderid);
Orderdetail item = new Orderdetail(orderid,goodsid);
item.setQuantity(quantity);
if(order.getOrderdetailCollection()==null)
order.setOrderdetailCollection(new Vector<Orderdetail>());
order.getOrderdetailCollection().add(item);
item.setOrdertable(order);
}
4、编写客户端程序进行测试
分别对下面的3个功能进行测试:
n 添加订单
n 删除订单
n 察看订单
4.1 添加订单
添加订单有两种方式:
n 创建订单对象、创建订单项对象、把订单项添加到订单中,然后调用会话Bean完成添加。
n 创建订单对象,调用会话Bean完成添加,然后调用会话Bean的添加订单项方法添加具体的订单项。
下面代码中用到的remote是注入的EJB对象。
4.1.1 第一种方式
Ordertable order = new Ordertable();
String orderid="order2222";
order.setOrderid(orderid);
order.setUserid("lixucheng");
order.setOrderstate('0');
order.setOrderdate(new Date());
Vector v = new Vector();
Orderdetail od1 = new Orderdetail(orderid,"goods111");
Orderdetail od2 = new Orderdetail(orderid,"goods777");
Orderdetail od3 = new Orderdetail(orderid,"goods333");
Orderdetail od4 = new Orderdetail(orderid,"goods999");
Orderdetail od5 = new Orderdetail(orderid,"goods555");
od1.setOrdertable(order);
od2.setOrdertable(order);
od3.setOrdertable(order);
od4.setOrdertable(order);
od5.setOrdertable(order);
v.add(od1);
v.add(od2);
v.add(od3);
v.add(od4);
v.add(od5);
order.setOrderdetailCollection(v);
remote.addOrder(order);
4.1.2 第二种方式
Ordertable order = new Ordertable();
order.setOrderid("order1111");
order.setUserid("lixucheng");
order.setOrderstate('0');
order.setOrderdate(new Date());
remote.addOrder(order);
remote.addItem("order1111","goods111",10);
remote.addItem("order1111","goods222",20);
remote.addItem("order1111","goods333",30);
remote.addItem("order1111","goods444",40);
remote.addItem("order1111","goods555",50);
4.2 删除订单
删除订单需要根据订单编号删除。
remote.removeOrder("order0000");
4.3 查询所有订单及明细
List<Ordertable> list = remote.getAllOrders();
该方法调用就可以得到所有的订单以及订单的明细。
下面是在Servlet中显示订单信息的代码:
Iterator<Ordertable> i = list.iterator();
while(i.hasNext()){
Ordertable tempOrder = i.next();
out.println("订单号:"+tempOrder.getOrderid()
+"订单日期:"+tempOrder.getOrderdate()+" 明细:");
Iterator<Orderdetail> detail=tempOrder.getOrderdetailCollection().iterator();
while(detail.hasNext()){
Orderdetail tempDetail = detail.next();
out.println("["+tempDetail.getOrderdetailPK().getGoodid()
+","+tempDetail.getQuantity()+"]");
}
out.println("<br>");

}

更多内容可以参考《Java EE 5实用教程——基于WebLogic和Eclipse》

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析 本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。 阅读详情

相关推荐

nbiot和2g_浅谈NBIOT

一、什么是NBIOT?1、概念窄带物联网(Narrow Band Internet of Things, NB-IoT),NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,使用License频段,可采取带内、保护带或独立载波等三种部署方式,与现有网络共存。可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。2、NBIOT的特点和目标(1)超强覆盖:相对GPRS来...

weixin_39534100的博客 1704

JPA排序order by教程

一、简介 在本教程中,我们将学习如何使用Spring Data对查询结果进行排序。 2. 测试数据 下面我们有一些示例数据。 问题是,“谁在航空公司的哪个座位上?” 但为了更方便用户使用,我们希望按座位号排序。 名 姓 座位号 吉尔 史密斯 50 前夕 杰克逊 94 弗雷德 博客 22 瑞奇 鲍比 36 思雅 科利西 85 3. 实体类 要创建Spring Data Repository,我们需要提供 实体类 和 id的类型。 在这里,我们将乘客建模为 JPA 实体,但我

hello world 7261

GIS分析-利用K-Means方法进行地震分析

通过“聚类”可以获得有关我们所拥有的数据的各种线索,这是数据挖掘技术之一。分析创建的组有助于决策过程。在这项研究中,我们将使用数据挖掘工具之一的K-Means方法研究安纳托利亚东部地区近100年发生的地震的空间分布,并试图获得有用的信息,以供未来的研究使用。我从局地震目录页面获得了研究所需的地震数据,并从获得了区域边界数据。

gis收藏家的博客 1570

JPA如何使用OrderBy进行快捷排序或者多字段排序(方法名)

摘要:平常使用mysql直接使用sql语句进行书写,可是我们使用JPA就是不想写啊。这里我们使用快捷方法来写排序。 使用sql语句写OrderBy应该如下格式: [ select 字段列表/* from 表名 where 条件 order by 字段名1 asc/desc, 字段名2 asc/desc,…] 数据库中的表信息 1 2 3 4 5 6 ...

馒头花卷儿 2万+

如何把Excel的数据导入python?

Python数据分析——excl导入数据的简单方法(xlrd) 本文的初衷是发现网上很多Excel导入Python都没有结合具体Excel文档进行讲解,所以这篇文档将会呈现一个简单快速的Excel+Python的入门方法。 开发环境 Prerequisites: 在开始用Python导入Excel之前,要配置好自己的开发环境,最好有IDE(terminal也可)+安装相应的数据分析包。 IDE :pycharm,vscode,etc 数据分析包:matplotlib,xlrd,numpy,etc 导入数

qq_40783513的博客 7万+

基于FPGA的DDS信号发生器

之前的博客讲到了DDS的基本原理,现在用Verilog代码实现DDS,能够产生四种波形,方波,三角波,正弦波,锯齿波,用按键来控制频率和选择波形。其中按键消抖模块来自小梅哥的FPGA自学笔记设计与验证这本书。 module DDS_Module( Clk, Rst_n, EN, Fword, Key1, Pword, DA_Clk, DA_Data ); input Clk...

qq_43534451的博客 9950

JPA(order, or, like, left join, 时间筛选,when case,find_in_set )

多字段排序 List<Order> orders=new ArrayList<>(); orders.add(builder.asc(root.join("provider").<String> get("providerCode"))); orders.add(builder.asc(root.<String> get("country"))); query.orderBy(orde

qq_31517427的博客 790

告别瞎猜!用通达信L2资金流向函数,手把手教你识别主力动向(附实战公式)

本文详细解析通达信L2资金流向函数,手把手教你构建主力动向监控系统。通过分档数据解析、委买委卖攻防解读及实战公式应用,帮助投资者精准识别主力建仓与虚假拉升信号,提升股票交易决策效率。

weixin_26908317的博客 2099

springJPA关键字order 冲突问题导致查询失败

错误原因是:实体类数据库的名称都为order 和sql 关键字冲突了 这是我的报错信息 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘order order0_ limit 10’ at line 1 失败写法:select o.id as OrderId,o.createTime as

swiftxx的博客 722

技术解析:ChangeFormer——基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer模型在遥感变化检测中的创新应用,该模型基于Transformer架构和孪生网络(Siamese Network),显著提升了变化检测的精度和效率。通过详细的技术实现和实战经验分享,展示了其在建筑物变化、森林监测等场景中的卓越表现,为相关领域的研究和应用提供了有力工具。

weixin_29102619的博客 497

【Claude Code 源码解析教程】第4章:QueryEngine 查询引擎

本章深入解析 Claude Code 的核心引擎——QueryEngine,它是整个对话系统的"心脏",负责管理会话状态、消息处理流程和多轮对话支持。

rengang66的博客 270

什么是JPA?Java Persistence API简介

作为规范,Java Persistence API关注持久性,它将Java对象的创建过程和具体的创建形式解耦。并非所有Java对象都需要持久化,但大多数应用程序都会保留关键业务对象。JPA规范允许您定义应该保留哪些对象,以及如何在Java应用程序中保留这些对象。 JPA本身不是一个工具或框架; 相反,它定义了一组可以由任何工具或框架实现的概念。虽然JPA的对象关系映射(ORM)模型最初基于Hibe...

Java_fenxiang的博客 1820

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

什么是JPA? Java Persistence API简介

虽然它们的执行不同,但每个JPA实现都提供某种ORM层。为了理解JPA和JPA兼容的工具,我们要知道ORM。作为应用程序体系结构的一部分,ORM层负责管理软件对象的转换,以便与关系数据库中的表和列进行交互。在Java中,ORM层转换Java类和对象,以便可以在关系数据库中进行存储和管理。默认情况下,持久化对象的名称将成为表的名称,字段将成为列。设置表后,每个表行对应于应用程序中的对象。一般来说对象映射是可配置的,不过默认值往往效果很好。分布式技术专题+面试解析+相关的手写和学习的笔记pdf。

2303_77877769的博客 731

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jpa和hibernate_JPA和Hibernate的Java持久性,第1部分:实体和关系

jpa和hibernate Java Persistence API(JPA)是一种Java规范,可在关系数据库和面向对象的编程之间架起桥梁。 这个由两部分组成的教程介绍了JPA,并说明了如何将Java对象建模为JPA实体,如何定义实体关系以及如何在Java应用程序中将JPA的EntityManager和Repository模式一起使用。 请注意,本教程使用Hibernate作为JPA提供程...

cxu0262的博客 254

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringData Jpa、Hibernate、Jpa 三者之间的关系

JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现,JBoss应用服务器底层就以Hibernate作为JPA的实现。 既然JPA作为一种规范——也就说JPA规范中提供的只是一些接口,显然接口不能直接拿来使用。虽然应

一个人的博客 3万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jpa和hibernate_JPA和Hibernate的Java持久性,第2部分:多对多关系

jpa和hibernate 本教程的前半部分介绍了Java Persistence API的基础知识,并向您展示了如何使用Hibernate 5.3.6和Java 8配置JPA应用程序。如果您已阅读该教程并研究了其示例应用程序,那么您将了解在JPA中建模JPA实体和多对一关系。 您还进行了一些使用JPA查询语言(JPQL)编写命名查询的练习。 在本教程的后半部分,我们将更深入地介绍JPA和H...

cxu0262的博客 187

使用EJB3 Java Persistence API标准化Java持久性

持久性对于大多数企业应用程序都非常关键,因为它们需要访问关系数据库(例如Oracle Database 10g)。如果您正在使用Java开发应用程序,您可能需要完成一些常规任务(例如数据库更新和检索),这是通过编写JDBC和SQL来完成的。最近几年,几种对象关系(O-R)映射框架(例如Oracle TopLink、JBoss Hibernate和BEA Kodo)开始流行,因为它们简化了持久性问题

yzhjisji的专栏 651

Java持久性API(The Java Persistence API)-一个简单的实体持久性编程模型

 Java持久性API(The Java Persistence API)-一个简单的实体持久性编程模型 原文连接:http://java.sun.com/developer/technicalArticles/J2EE/jpa/文章索引Java平台企业版(Java EE)第五版本最重要的主题是易于开发。贯穿整个平台的改变使开发企业Java应用程序变得更简单,需要少的多的代码。值得

龙行天下的专栏 1479

Java:使用 JPA 了解 Java 对持久性的支持

Java 平台已经有标准的 API 以 JDBC API 的形式与数据库系统一起工作。这些 API 非常擅长使用数据库,并提供了从 Java 语言方便地与数据库交互所需的方法。

yueqian_edu的博客 149

什么是JPA?Java Persistence API简介(1)

";清单2中的代码是相当自我记录的。该对象可以来自任何地方(前端提交,外部服务等),并设置其ID和name字段。然后,对象上的字段用于提供SQLinsert语句的值。该类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。虽然JDBC允许手动配置附带的控件,但与JPA相比,它很麻烦。要修改数据库,首先需要创建一个SQL查询,该查询从Java对象映射到关系数据库中的表。然后,只要对象签名发生更改,就必须修改SQL。使用JDBC,维护SQL本身就成了一项任务。JPA的数据持久性。

Y1567409的博客 1113
上一篇: Java持久性API(JPA)第5讲——关系建立
下一篇: 最好的Java Web开发的书应该是什么样子?
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值