如何用Hibernate进行对象的持久化

【零基础教程】HEC-RAS 1D/2D全流程模拟指南|从水动力到水质建模一次搞定! HEC-RAS由美国陆军工程兵团水文研究中心研制,具有完整的一二维耦合的水动力及水环境模拟功能,也具有闸、涵洞、桥梁以及泵站等水利构筑物的模拟能力;同时也可以与HEC研制的水文模型(HMS)、洪水淹没风险和损失分析软件(FDA)等耦合,是免费软件中使用最方便、应用最广泛的软件之一。2.HEC-RAS与HEC-HMS的耦合(不详细讲HEC-HMS)3.淹没风险分析软件HEC-FDA与HEC-RAS耦合。案例十八:HEC-RAS与HEC-HMS的耦合。案例十九:HEC-RAS与HEC-FDA的耦合。 阅读详情

 如何用Hibernate进行对象的持久化

Hibernate作为数据持久化层的一种技术应用很广泛。现在就其中的知识点在读书过程中进行记录和总结。
 
这里主要考虑的一种数据的解决方案是: 通过DAO(Data Accss Object)和ORM(Object Relational Mapping)实现数据的持久化操作。在这种数据持久化实现方案中,通过DAO来实现对Java对象与数据库中数据之间的相互转换,同时他还包括了数据库的连接管理、事务管理以及对象的缓冲管理等功能。
 
这种数据持久化解决方案的实现方法的示意图图下业务层--->DAO--->ORM--->数据库
 
首先配置软件开发环境:JDK1.5,Tomcat5.0,MySQL5,Ant1.5,Eclipse3.1相关软件的下载地址见: http://blog.163.com/wyl_jxy/collection/
 
各种工具的配置和使用请参考相应的资料。
 
现在先简单介绍一下运用Hibernate进行Web应用开发的过程,为更深层次利用Hibernate工作打下基础。
 
当然不同的项目可以根据自身情况对设计过程进行适当的剪裁或补充。适合的就是最好的。不必拘泥与某一种方式步骤。
 
这里采用的开发顺序是先进行系统的建模以及实现系统模型的工作,接下来的工作是完成系统的配置文件和HBM文件(即映射文件),然后进行DAO的开发和测试工作,最后完成整个系统的页面处理部分。
 
设计、分析和实现持久层对象需要很多步骤来完成,下面一步一步来说明
 
首先,需要掌握如何确定一个应用程序的业务实体。在分析业务实体的过程中将会创建一系列概念上的模型,用这些模型对象来表示业务实体以及业务实体的属性,这样的模型被称为 域模型。然后,使用Java语言实现这个域模型,也就是为每一个实体创建一个持久层的JAVA对象。
然后,完成映射文件的定义工作。映射文件的主要作用就是描述这些java持久层对象以及他们的属性和数据库中的表以及表中的字段之间的关系。这样,Hibernate才能自动建立java对象与数据库中数据的关联关系,从而实现他们之间的转换。换言之, 映射文件是为了把java对象和数据表以及数据字段关联。配置文件则定义的是如何连接数据库。
接下来的步骤是进行DAO的定义和开发工作。通过DAO,可以完成对数据库进行的各种持久化操作以及在开发中所需实现的部分业务逻辑。
最后的工作是完成JSP页面,通过对DAO的调用完成整个系统的所有功能。
 
映射文件的说明:
映射文件顶层是一个hibernate-mapping元素,定义了当前配置文件中映射关系的基本属性,也可以说它所定义的属性是对映射文件中所有子节点发挥作用的。
 
具体细节以后详述
 
配置文件的说明:
Hibernate配置文件主要用来设置Hibernate的行为。他所描述的信息主要包括以下几个方面:
 
1.  数据库的连接信息:在Hibernate中可以使用两种方式连接数据库。一种是根据JDBC的参数连接数据库,由Hibernate完成连接的过程和连接的管理。另一种方式是通过JNDI完成数据库的连接,Hibernate之间获取数据库的连接。
 
使用JDBC进行连接方式,需要对下列参数进行配置:
hibernate.dialect指定数据库使用的SQL方言
hibernate.connection.driver_class  指定数据库的驱动程序
hibernate.connection.url指定数据库的URL
hibernate.connection.username指定连接数据库的用户名
hibernate.connection.password指定连接数据库的口令
hibernate.show_sql如果为true,表示程序在运行时,会在控制台输入SQL语句,这有利于跟踪Hiberante的运行状态,默认为false。在应用开发和测试阶段,可以设这个属性为true,以便跟踪和测试程序,在应用开发阶段,应该把这个属性设为false,以便减少应用的输出信息,提高性能
2 .数据库连接池的信息;
3 .可选的配置项;
4 .HBM(映射文件)列表;
 
 
使用Hibernate进行数据持久化操作的过程
 
 使用Hibernate进行持久化操作主要需要以下步骤:
STEP 1:创建Configuration对象。在这一步中主要为了进行配置文件的装载操作,读取所有的配置文件并进行解析
STEP 2: 创建SessionFactory对象。通过创建好的Configuration对象可以创建一个sessionFactory对象的实例,同时是生成Session对象实例的工厂,他在整个应用中应该是唯一的。
STEP 3:创建Session对象。 Session对象类似于数据库的连接对象,可以理解为与数据库建立的一个连接,但是他的功能要比JDBC中的Connection对象丰富很多。
STEP 4:开始一个事务。在Java中定义一个事务操作的开始,这是使用Hibernate进行持久化操作必不可少的步骤
STEP 5:进行持久化操作。在这个步骤中可以读取或者保存Java对象。
STEP 6:结束事务。在操作完成之后还要进行显式的结束事务的操作。
STEP 7:关闭Session。类似于释放数据库的连接。
 
下面说最后一项DAO层的实现
DAO层的实现
 
在完成了域模型的定义和配置工作之后,接下来要完成的工作就是 定义DAO接口,并使用Hibernate来实现所定义的DAO接口
 
当然直接使用Hibernate来访问数据库也是完全可以的,但是这种结构的系统会具有更好的灵活性。通过这种使用接口的编程方法,可以在方法的调用者和方法的实现者之间建立一个屏障,即他们之间不存在任何关联,一边的修改不会影响到另外一边的正确运行。例如现在所选择的持久化组件为Hibernate,过一段时间可能会有更好的持久化层组件出现,或者想直接采用JDBC来实现持久化层的操作,那么只需要修改具体的实现方法就可以了,而不需要对调用持久化层的业务处理方法进行任何修改。
 
DAO接口和DAO实现之间的关系:HibernateDAO,IUerDAO,UserDAO
上述的三个*DAO是中 (1)HibernteDAO是基础类,它包含了使用Hibernate进行持久化操作的一些基础方法。实现具体业务方法的DAO方法,通过继承这个类,可以在很大程度上简化持久化操作的步骤,减少代码的重复量 。(2)IUerDAO是接口,定义了对对象User进行持久化操作的各种方法。只有接口定义,没有实现。 具体有什么样的方法,完全取决于对象User。User是前面工作中定义的持久化对象。 注意:一个持久化对象对应一个DAO接口 (3)UserDAO  这个才是真正的DAO实现类。他集成了基础类,实现了DAO接口。一个实现类要实现对应的接口。
 
下面贴出几段代码可以根据上面的说明自己理解DAO:
 
提示:在Hibernate软件包的etc目录下,有一个hibernate.properties文件,它提供了连接各种关系数据库的配置代码样例
 
 
 
体系结构图
上面的这个图是 Hiberante应用程序的结构
对上图中各项的说明如下:(1)Application:应用 (2)Persistent Object:持久化对象(3)hibernate.properties:Hibernate属性文件/Hibernate配置文件 (4)XML Mapping:Hibernate映射文件 (5)Database:数据库
 
由上图可以看出,Hibernate是通过一系列的配置文件和数据库来实现持久化对象的持久化操作的。
 
为了使用Hibernate,需要创建与数据库中的表对应的持久化对象,然后再通过影射文件将持久化对象中的 属性与数据库表中的 字段对应起来。这样才能通过持久化对象完成对数据库表中的数据的增加、修改、查询和删除操作。
 
Hibernate主要包括三个组件:
  (1)连接管理组件:它提供了高效的数据库连接管理。数据库连接是和数据库进行交互的唯一渠道,建立和关闭一个连接需要耗费大量的资源。所以现在的应用程序都采用连接池的方法来管理与数据库的连接,避免频繁的建立和关闭数据库连接
  (2)事务管理组件:通过事务,一次可以执行多个SQL语句,而且能够保证这些语句执行成功或者都不成功
   (3)对象/关系映射组件:对象/映射技术可以实现从对象模型到数据库中关系模型的映射工作。通过这一技术,Hibernate实现了对象的持久化操作。
 
       Hinernate的体系结构(运行时)
由于Hibernate非常灵活,而且提供了多种运行 时的结构组成方案,这里介绍的时一个“最全面”的体系结构,它最大程度的完成了对持久层功能的封装,也就使得在开发中要完成的工作量最少,是在 发中最经常使用的一种方式。这种方式把JDBC/JTA都交由Hibernate去完成,而不需要对这一部分进行任何处理。     
  
“重量级”体系结构
     各个部分的主要功能如下 
 
提示1:Hibernate支持四种数据库连接池的组件
SessionFactory:它保存了对当前数据库配置的所有映射关系,它是将某个数据库的映射关系经过编译之后全部保存在内存中的。 它还是生成Session的工厂,它在进行实例化的过程中将会用到ConnectionProvider。 一个SessionFactory对应一个数据库连接,当数据库连接改变时需要修改SessionFactory
Sesion:是进行持久化操作的基础,所有的持久化操作都是在Session的基础上进行的。它相当与JDBC中的Connection。它是Hibernate的持久化管理器的核心,提供了一系列的持久化操作方法。另外,它还持有一个针对持久化对象的一级缓存,在遍历持久化对象或者根据持久化标识查找对象的时候会用到。
Transaction:功能上和数据库中的事务完全一样,通过它实现对数据库中事务的控制。Transation对象是Session对象产生的,所以他的生命周期比Session短。一个Session的生命周期中可以有多个Transaction对象。
ConnectonProvider:主要作用是生成与数据库建立了连接的JDBC对象,同时他还作为数据库连接的缓冲池。通过ConnectionProvider实现了应用程序和底层的DataSource和DriverManager的隔离。
T ransactionFactory:是生成Transaction对象的工厂,通过TransactionFactory实现了事务的封装,使其具体的实现方法与应用程序无关。
 
         Hibernate对象的生命周期
 
一共有三种生命周期:
1)瞬态:表示该实体对象在内存中是自由存在的,也就是说 数据库中的数据没有任何的关联。即,该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有:
               与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录
              与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。
(2)持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对象的实例相关的。 处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate持久化到数据库中。处于持久态的对象具有的特征为:
               每个持久态对象都于一个Session对象关联
               处于持久态的对象是于数据库中的记录相关联的
               Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录
(3)游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。。游离态对象的特征有:
                游离态对象一定是由持久态对象转换而来
                游离态实体不再于Session关联
               游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据
               游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)
 
判断一个实体对象是否处于瞬态:
 
               该实体对象的<id>属性(如果存在)的值为空
               如果在映射文件中为<id>设置了unsaved-value属性,并且实体对象的id属性的值与unsaved-value属性的值相同
              如果这个实体对象配置version属性,并且version属性的值为空
               在映射文件中为version属性设置了unsaved-value属性,并且version属性的值与unsaved-value属性的值相同。
               如果设置了interceptor,并且interceptor的isUnsaved()方法的返回值为true
满足上述条件的实体对象就处于瞬态,否则为游离态(前提是不处于持久态)
 
下面通过一段代码来说明状态问题:
 
public class LifeCycle
{
 public static final SessionFactory sessionFactory;
 
 static
 {
  sessionFactory = new Configuration().configure().buildSessionFactory();
 }
 
 public static void main(String[] args)
 {
  LifeCycle.lifecycle();
 }
 
 public static void lifecycle()
 {
  // 创建游离态实体对象User
  User user = new User();
  user.setName( "abc" + String.valueOf( Math.random() ) );
  // 为了避免两次运行的用户名重复,所以增加了随机数
  user.setPassword( "def" );
  // user仍然处于游离态
  Session session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();
  // 此时user对象仍然是Transient状态
  session.save( user );
  // 此时,user对象已经被纳入了Hibernate的实体管理容器中,并转变为Persistent状态
  System.out.println( "User 1:" + user );
  // 此时的id已经有值了。
  get( user.getId() );
  // 但并未真正的执行数据库的操作,所以无法得到对象的值
  tx.commit();
  // 事务被提交后,将向数据库的用户表中插入一条记录
  System.out.println( "Transaction 1 commit!" );
  get( user.getId() );
  // 这时可以由数据库中得到刚才插入的user对象了。
  
  Transaction tx2 = session.beginTransaction();
  user.setPassword( "mmmmmmmmmmmmm" );
  tx2.commit();
  // 虽然这个事务中并没有调用Session的save()方法来保存user对象
  // 但由于user对象处于Persistent状态,所以对user对象所做的任何修改都将被持久化到数据库中
  // 那么数据库中的用户密码也应该变为了def。
  System.out.println( "Transaction 2 commit!" );
  session.close();
  get( user.getId() );
  // 此时密码已经变为新的值了
 }
 
 public static User get( String id )
 {
  Session session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();
  
  User user = (User)session.get( User.class, id );
  // Hibernate在返回User对象之间会将其纳入到Hibernate的实体管理容器中
  // 所以,这时的user对象是Persistent状态的
  display( user );
  
  tx.commit();
  session.close();
  
  return user;
 }
 
 public static void display( Object obj )
 {
  System.out.println( obj );
 }
}
 
 
 
(1)C3P0。这是Hiberante自身提供的。其文档地址见: www.mchange.com/projects/c3p0/index.html;有关Hibernte中配置c3p0的文档参考: www.hibernate.org/214.html
 (2)DBCP:它是Apache软件基金组织的一个开源项目。由于在Hibernte3中不再提供DBCConnectionProvider类来直接使用DBCP建立数据库的连接池,在这里提供两种方法解决这个问题。一种是仿照Hibernate2中的DBCPConnectionProvider类自己实现一个使用DBCP并实现了ConnetcitonProvider接口的连接池类。另一种是让应用服务器通过JNDI的方式来提供数据库的连接,Hibernate通过JNDI得到数据库的连接。DBCP的详细信息见: http://jakarta.apache.org/commons/dbcp/。关于自己实现ConnectionProvider接口的方法见 http://wiki.apache.org/jakarta-commons/DBCP/Hibernate
(3)Proxool:也是开放源代码的提供数据库连接池的组件。其官方网站为: http://proxool.sourceforge.net。有关配置的详细参数见官方网站
基于STM32、HAL库的ZMOD4510AI4R气体传感器驱动程序设计 ZMOD4510AI4R是Renesas公司推出的一款数字空气质量传感器,主要用于检测臭氧(O₃)和总挥发性有机化合物(TVOC)浓度。(status & 0x80)) // 检查数据就绪位。// 等待测量完成 (实际应用中应该使用非阻塞方式)// 转换为ppb (简化转换,实际应根据传感器文档校准)* @param hzmod: ZMOD4510句柄。* @param tvoc: TVOC浓度(ppb)* @param ozone: 臭氧浓度(ppb)* @param hi2c: I2C句柄。 阅读详情

相关推荐

hibernate数据持久化组件

a.内存是暂时存储设备,断电后数据易丢失 b.网络传输无法传输内存中的对象,需要将对象外化 c.内存中数据查询,组织不方便 d.内存只能存储少量数据

JAVAWEB开发之Hibernate详解(二)——Hibernate持久化类状态与转换、以及一级缓存详解、关联关系的映射(一对多、多对多、级联)...

持久化对象的状态 Hibernate持久化对象存在三种状态: 瞬时态 transient:(临时态) 不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为是瞬时状态,失去引用将被JVM回收。特点:无持久化标识OID,未与Session关联。 持久态 persistent:存在持久化标识OID,与当前Session有关联,并且相关联的Session没有关闭,并且事务未提交...

iteye_18817的博客 1492

1-上市企业加权平均资本成本WACC(2005-2023年)-社科数据.zip

上市企业的加权平均资本成本(WACC)是衡量企业资本成本的重要指标,它通过企业各种资本所占总资本的比重为权数,对长期资金的资本成本进行加权平均计算得出。WACC的主要作用在于帮助企业确定平均风险投资项目所需的收益率,并评估公司的资本结构和融资决策。对于投资者而言,WACC也是评估公司投资价值和风险的关键指标之一。WACC的计算公式为:WACC = (E/V) × Re + (D/V) × Rd × (1 - Tc),其中E代表股权资本,D代表债务资本,V为公司市场价值(E + D),Re为股权成本,Rd为债务成本,Tc为公司税率。该数据集覆盖了2005至2023年间上市企业的WACC数据,提供了证券代码、证券名称以及对应的WACC值。这些数据对于理解企业资金成本和投资决策具有重要价值。

使用Hibernate完成对象持久化

 使用Hibernate完成对象持久化一、 为什么要使用Hibernate先来回顾一下以前通过DAO怎么操作数据库。增加学生信息:public int addStudent(Student stu) {Connection con = null;PreparedStatement pstmt = null;int rowCount = 0; 

朝军的博客 1292

hibernate如何实现持久化

面试被问到,也许了解但说的不清楚 hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中。 hibernate要做的事,就是让对象投影到关系数据库中,然后实施持久化。其具体实现: 建立对象到关系数据库的映射。 example:建立User类到数据库的映射...

174

Hibernate对象状态管理

瞬间态:刚被new出来的对象,还没和session关联,没有通过数据库关联,也没有被分配ID,只在运行内存中存在 持久态:被save和load的对象,具有数据库一致的信息且具有ID,数据还是在session环境中,没有永久保存在数据库中,如果此时hibernate关闭,session和db中的数据都会消失,此时无法对数据执行update和delete操作; 游离态:持久态的数据遭遇到sessio

qq_31887677的博客 569

Hibernate对象的管理

对象的状态(生命周期) 1、瞬时状态(瞬态,临时状态,Transient) User user = new User(); user.setUid(1001); user.setName("张三");//T 在此之前该对象都是Transient session.save(user);//P session.close(); user.setName("李四");//D 临时创建出...

v5browser 156

Hibernate学习之持久化对象

持久化对象

qq_41827511的博客 242

hibernate持久化对象的三个状态

Hibernate中的对象有3种状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象)。这三个状态的主要区别在两方面:1、session;2、数据库

变是永远不变的...... 2942

Hibernate——持久化对象状态

持久化对象的状态: 瞬时对象(Transient Objects):使用new操作符初始化的对象不是立刻就持久化的。他们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),他们的状态将会丢失,并由垃圾回收机制回收。 临时对象的特征。临时对象具有以下特征: (1) 不处于Session的缓存中,也可以说,不被任何一个Session实例关联。

JAVA那些事 397

Hibernate持久化对象的三种状态

文章目录1. 持久化对象三种状态的概述2. 持久化对象的三种状态案例3. 三种状态的转换3.1 瞬时态转换到其他状态3.2 持久态对象转换到其他状态3.3 脱管态对象转换到其他状态4. 持久化对象能够自动更新数据库 1. 持久化对象三种状态的概述 Hibernate为了更好的来管理持久化类,特将持久化类分成了三种状态。在Hibernate持久化对象可以划分为三种状态,分别是瞬时态、持久态和脱管...

qq_34614914的博客 705

Hibernate】——对象持久化状态

前言     在之前的那篇博客中有对Hibernate进行概述,其中一个很重要的特性就是持久化,对于持久化这里做了一点小研究,所以来总结总结。 持久化      在日常生活中,我们都会有一些方法来保持食物的新鲜,如速冻水饺,水果罐头,鲜肉冷藏,这些都是日常持久化的例子。      在我们平时的计算机和手机的使用中也有很多持久化的例子,如我们关闭应用程序后,再打开,会发现之前

你若盛开,清风自来 462

Hibernate框架基础——Java对象持久化概述

Java对象持久化概述应用程序的分层体系结构基于B/S的典型三层架构 说明: 展现层:提供与用户交互的界面。 业务逻辑层:实现各种业务逻辑。 数据访问层:负责存放和管理应用程序的持久化业务数据。 更详细的三层架构如下图所示: 软件的层必须具备如下特征: 每个层由一组相关的类或组件构成,共同完成特定的功能。 层与层之间存在自上而下的依赖关系,即上层组件访问下层组件的 API,而下层组件不应该依

李阿昀的博客 2587

Hibernate框架】对象的三种持久化状态

Hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象)、PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线对象)。

Davie's Happy Life 1214

Hibernate旅程(三)Hibernate持久化对象的三个状态

Hibernate中的对象有3中状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象)。 下图3.1显示了瞬时对象持久化对象和离线对象之间的关系以及它们之间的转换。 图3.1 临时状态:由java的new命令开辟内存空间的java对象也就是普通

Xinghf 3万+

Hibernate操作持久化对象

一、什么是[对象]持久化?         Java对象的状态可分为3类,如下图,即瞬时状态,持久化持久化状态。           简单说,在使用new关键字创建出一个对象时,就是瞬时状态;使用JDBC完成数据在持久和瞬时状态的转化;存储到数据库里面的数据,就是持久状态了。显而易见,Java对象持久化,就是把瞬时对象,存储到数据库,变成数据库关系表中对应的一条条记录。 二、对象持久化

ljheee的博客 4045

Hibernate持久化对象

Hibernate是一个纯粹的O/RMapping框架,通过Hibernate的支持,程序开发者只需要管理对象的状态,无须理会底层数据库系统的细节。相当于常见的JDBC持久层方案中需要手工管理SQL语句,Hibernate采用完全面向对象的方式来操作数据库。对于程序开发者而言,眼里只有对象、属性,无须理会底层数据表、数据列等概念。 1. 持久化类的要求 虽然Hibernate对持久类滑太远的要

owen_william的博客 787

Hibernate持久化对象状态的方法

1. 持久化实体 为了让瞬态对象转换为持久化状态,HibernateSession提供了如下几个方法。 1)        Serialzable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。 2)        void persist(Object obj):将obj对象转化为持久化状态,该对象的属性将被保存到数据库。 3)       

owen_william的博客 1240

Hibernate持久化对象的状态及状态之间的转换

hibernate持久化对象的三种状态,瞬态,持久化,托管 ; 三种状态之间的的状态转换图 ; save(),persist()的区别与联系 ; load() 和 get()方法的区别与联系; update()和updateOrSave()方法的用法 ; 更新持久化实体 ; 更新脱管实体 ; 删除持久化实体 。。。

小超人的专栏 5493

hibernate进阶】hibernate持久化对象的三种状态

Hibernate持久化对象的三种状态:瞬时对象(Transient Objects),持久化对象(Persist Objects),离线对象(Detached Objects)。 三种状态:    瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不在引用这些对象(不

陈晓婵 7833
上一篇: JNDI的学习
下一篇: struts+spring+hibernate快速入门
sumongh_pan
博客等级 码龄20年 9粉丝 53原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值