SSM学习之Spring的事务管理

SSM框架注册功能实战教程 SSM框架是指Spring、SpringMVC和MyBatis这三个框架的组合使用。Spring是一个轻量级的Java开发框架,旨在简化企业级应用开发,通过依赖注入、面向切面编程等功能提供企业应用服务。SpringMVC是基于Spring的一个MVC框架,它把Web层进行分离,提供了一个清晰的视图解析,实现了Web层的组件化管理。MyBatis是一个支持定制化SQL、存储过程以及高级映射的持久层框架。 阅读详情

一、Spring事务管理概述

1、事务管理的核心接口

详细介绍请点击其他

2、事务管理的方式

Spring中的事务管理分为两种方式:一种是传统的编程式事务管理,另一种是声明式事务管理。
编程式事务管理:是通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚。
声明式事务管理:是通过AOP技术实现的事务管理,其主要思想是将事务管理作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”代码织入到业务目标类中。

二、声明式事务管理

1)基于XML方式的声明式事务

基于XML方式的声明式事务管理是通过在配置文件中配置事务规则的相关声明来实现的。
Spring2.0以后,提供了tx命名空间来配置事务,tx命名空间下提供了<tx: advice>元素来配置事务的通知(增强处理)。

<!-- 5. 编写通知:对事物进行通知,需要编写对切入点和具体执行事务细节 -->
     	<tx:advice id="txAdvice" transaction-manager="transactionManager">
     	<tx:attributes>
     		<tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
     	</tx:attributes>
     	</tx:advice>

配置<tx:advice>时,要指定id属性(配置文件中的唯一标识)和transaction-manager属性(用于指定事务管理器)。<tx:advice>中有<tx:attributes>子元素。子元素中有<tx:method>元素,用于配置执行事务的细节。 <tx:method>元素的属性描述如下:

属性是否必须默认值描述
name是与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法如:‘*’、’get*’、’handle*’、’* Order’等等。
propagation否REQUIRED事务传播行为
isolation否DEFAULT事务隔离级别
timeout否-1事务超时的时间(以秒为单位) ,如果为-1,则说明事务超时时间由底层的事务系统所决定
read-only否false事务是否只读
rollback-for否所有运行期异常回滚触发事务回滚的Excepiton,用异常名称的片段进行匹配,可以设置多个,用逗号分开,如Exception1,Exception2
norollback-for否所有检查型异常不回滚不触发事务回滚的Excepiton,用异常名称的片段进行匹配,可以设置多个,用逗号分开,如Exception1,Exception2

案例:通过xml方式实现Spring的声明式事务管理 模拟一个赠送积分的项目,体现事务管理

导入相关JAR包
在这里插入图片描述
在原有数据库中添加jf属性类型设为int(11),所有用户默认1000积分。

在User类中添加jf及其setter、getter方法

private Integer jf;
public Integer getJf() {
	return jf;
}
public void setJf(Integer jf) {
	this.jf = jf;
}

在UserDao接口中添加transfer()方法,三个参数

	public void transfer(String outUser,String inUser,Integer jf);

在UserDaoImpl类中实现并完善方法this关键字用于当前类

	//赠送积分
	public void transfer(String outUser, String inUser, Integer jf) {
	//接收积分
	this.jdbcTemplate.update("update user set jf=jf+? where username=?",jf,inUser);
	//模拟系统运行中突发性问题
	int i=1/0;
	//送出积分
	this.jdbcTemplate.update("update user setjf=jf-? where username=?",jf,outUser);
	}

修改applicationContext.xml
1、配置数据源
2、配置jdbc模板
3、定义id为userDao的bean
4、事务管理器,依赖于数据源
5、编写通知:对事物进行通知,需要编写对切入点和具体执行事务细节
6、编写aop,让spring自动对目标生成代理,需要使用AspectJ

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        		http://www.springframework.org/schema/aop
        		http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        		http://www.springframework.org/schema/tx
        		http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
        		http://www.springframework.org/schema/context
        		http://www.springframework.org/schema/context/spring-context-4.3.xsd">
     	<!-- 1、配置数据源 -->	
     	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     		<!-- 数据库驱动 -->
     		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
     		<!-- 连接数据库的url -->
     		<property name="url" value="jdbc:mysql://localhost:3306/db_spring" />
     		<!-- 连接数据库的用户名 -->
     		<property name="username" value="root" />
     		<!-- 连接数据库的密码 -->
     		<property name="password" value="root" />
     	</bean>	
     	<!-- 2、配置jdbc模板 -->
     	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     		<!-- 默认必须使用数据源 -->
     		<property name="dataSource" ref="dataSource" />
     	</bean>
     	<!-- 3.定义id为userDao的bean -->
     	<bean id="userDao" class="com.ssm.jdbc.UserDaoImpl">
     		<property name="jdbcTemplate" ref="jdbcTemplate" />
     	</bean>
     	<!-- 4. 事务管理器,依赖于数据源 -->
     	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
     		<property name="dataSource" ref="dataSource"  />
     	</bean>
     	<!-- 5. 编写通知:对事物进行通知,需要编写对切入点和具体执行事务细节 -->
     	<tx:advice id="txAdvice" transaction-manager="transactionManager">
     	<tx:attributes>
     		<tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false" />
     	</tx:attributes>
     	</tx:advice> 
     	<!-- 6. 编写aop,让spring自动对目标生成代理,需要使用AspectJ -->
     	<aop:config>
     		<aop:pointcut expression="execution(* com.ssm.jdbc.*.*(..))" id="txPointCut" />
     		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
     	</aop:config>
</beans>

定义了id为transactionManager的事务管理器,下面用编写的通知来声明事务,最后用声明aop的方式让Spring自动生成代理。

编写测试类

package com.ssm.jdbc;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TransactionTest {
	@Test
	public void XMLTest(){
		ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao=(UserDao) app.getBean("userDao");
		userDao.transfer("admin1", "HQX", 100);
		System.out.println("赠送积分成功:");
	}
}

在这里插入图片描述
Junit控制台中报出了“/ y zero”的算术异常信息。在执行赠送积分操作后,查看 user表中的数据,即zhangsan和lisi的积分没有发生变化,这说明 Spring中的事务管理配置已经生效。

2)基于Annotation方式的声明式事务

Spring的声明式事务管理还可以通过 Annotation(注解)的方式来实现。这种方式的使用非常简单,开发者只需做两件事情:

(1)在 Spring容器中注册事务注解驱动;
<tx:annotation-driven transaction-manager="transactionManager" />
(2)在需要使用事务的 Spring Bean类或者Bean类的方法上添加注解@Transactional。

@Transactional注解中常用参数说明

参数名称功能描述
value用于需要使用的事务管理器,默认为“”,其别名为transactionManager
propagationpropagation用于指定事务的传播行为,默认值为 REQUIRED
isolationisolation用于指定事务的隔离规则,默认值为DEFAULT
readOnly该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称:@Transactional(rollbackForClassName=“RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,“Exception”})
noRollbackFor该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=“RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,“Exception”})
timeout该属性用于设置事务的超时秒数,默认值为-1表示永不超时

src下新建applicationContext-annotation.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        		http://www.springframework.org/schema/aop
        		http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        		http://www.springframework.org/schema/tx
        		http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
        		http://www.springframework.org/schema/context
        		http://www.springframework.org/schema/context/spring-context-4.3.xsd">
     	<!-- 1、配置数据源 -->	
     	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     		<!-- 数据库驱动 -->
     		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
     		<!-- 连接数据库的url -->
     		<property name="url" value="jdbc:mysql://localhost:3306/db_spring" />
     		<!-- 连接数据库的用户名 -->
     		<property name="username" value="root" />
     		<!-- 连接数据库的密码 -->
     		<property name="password" value="root" />
     	</bean>	
     	<!-- 2、配置jdbc模板 -->
     	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
     		<!-- 默认必须使用数据源 -->
     		<property name="dataSource" ref="dataSource" />
     	</bean>
     	<!-- 3.定义id为userDao的bean -->
     	<bean id="userDao" class="com.ssm.jdbc.UserDaoImpl">
     		<property name="jdbcTemplate" ref="jdbcTemplate" />
     	</bean>
     	<!-- 4. 事务管理器,依赖于数据源 -->
     	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
     		<property name="dataSource" ref="dataSource"  />
     	</bean>
     	<!-- 5. 注册事务管理器驱动 -->
     	<tx:annotation-driven transaction-manager="transactionManager" />
</beans>

添加测试类

@Test
	public void AnnocationTest(){
		ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao=(UserDao) app.getBean("userDao");
		userDao.transfer("admin1", "HQX", 100);
		System.out.println("赠送积分成功:");
	}
}
汇川EASY系列之以太网通讯(MODBUS_TCP做主站) 汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。 阅读详情

相关推荐

CarPlay wired(USB)连接方案

CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,支持USB Host Mode,该模式要求车载设备能够工作在USB device模式下,因为Apple设备在CarPlay中是作为USB Host的。而通常情况下,车载设备USB是工作在USB Host模式的,而外接的USB设备是工作在USB Device模式的,因而在这种情况下的CarPlay wired(USB)连接方案中就需要进行USB的模式切换。模式切换完成后便是Apple设备(USB HOST)的枚

Ke8323的博客 1万+

零基础SSM入门教程(39)–基于TransactionTemplate的编程式事务管理

背景 上一篇实现的基于PlatformTransactionManater的编程式事务管理,是属于非常低级的封装,其实就是将原来的JDBC事务操作封装为一个接口而已,然后由具体的实现类来实现。 本篇通过TransactionTemplate类,实现了对固定流程代码的封装,只需要将视作原子性操作的几个数据库操作放入一个方法中处理即可实现事务。 代码实现 修改配置类,在上一篇注册PlatformTra...

编程副队长 799

Netapp FAS2750更换磁盘后不同步问题处理

netapp fas2750磁盘更换后不同步问题处理

jetliu05的博客 1256

SSM学习笔记10 Spring的声明式事务控制

编程式事务控制相关对象 jdbc中:开启事务,提交事务,回滚事务 基于XML的声明式事务控制 基于注解的声明式事务控制

internetv的博客 171

【Autosar】学习总结-MCAL

一、简介 MCAL:微控制器抽象层;位于BSW层中的最下层; MCAL细分,可将驱动分为:微控制器驱动、存储器驱动、通信驱动、IO驱动: 二、MCAL的配置(EB-Tresos) 1.PORT 我理解的PORT:MCAL层中的IO驱动组中的pin脚总体配置: Port就是芯片上的每个pin脚,可以配置成DIO ADC PWM ICU等单引脚的功能,也能配置成CAN的TX或者RX、SPI的MOSI等等其他功能的单个pin脚功能; 总之,PORT就是芯片上的具体的某个引脚。 配置

zDavid_2018的博客 3万+

从零编写linux0.11 - 第二章 内核初始化

编程环境:Ubuntu Kylin 16.04 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 1.添加内核 进入内核后也不是马上进入main函数,上一章只是暂时设置gdt,此外还要设置idt和其他的一些初始化操作,这些内容也要使用汇编进行编写,此处采用AT&T格式的汇编。 以下为head.s的内容,为了简单起见,内容还是一个死循环。 .globl startup_32 startup_3

皓空Fly的博客 1264

spring—事务控制

编程式事务控制相关对象 PlatformTransactionManager PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。注意: PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类 例如:Dao 层技术是jdbc 或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager Dao

weixin_44560620的博客 275

VS2022跨平台开发实战:SSH远程调试Linux程序全攻略

本文详细介绍了如何使用Visual Studio 2022进行跨平台开发,通过SSH协议远程调试部署在Linux服务器上的C/C++程序。文章提供了从环境搭建、连接配置、项目创建到编译调试的完整实战指南,帮助Windows开发者无缝衔接Linux环境,显著提升问题定位与开发效率。

weixin_28826521的博客 429

Spring事务管理-使用注解配置事务

事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理API与spring数

Evankaka的专栏 1万+

AI 边缘计算控制器GEAC91

AI 边缘计算控制器GEAC91是AI边缘计算控制器是一款基于 NVIDIA Jetson AGX Xavier处理 器、面向智能边缘计算应用场景的解决方案。

weixin_45905610的博客 1197

Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)

在 Android 系统这个庞大而复杂的体系里,RIL(Radio Interface Layer,无线接口层)绝对是个关键角色。简单来讲,它就像一座桥梁,一头连着手机基带,另一头接着上层应用 ,在应用程序和调制解调器(Modem)之间搭建起了信息交流的通道。想象一下,咱们在手机上点击拨号按钮,或者编辑一条短信发送出去,这些操作产生的请求并不会直接到达手机的基带处理器。而是先由 RIL 接手,它把这些来自上层应用程序的请求,像拨号、发送短信这类,巧妙地转换成能够和基带处理器顺畅交互的命令。

大模型大数据攻城狮的专栏 1596

零基础SSM入门教程(38)–基于PlatformTransactionManager的编程式事务管理

编程式事务管理 所谓编程式事务管理,就是使用普通的程序代码来管理事务,像上一篇原生JDBC事务实现就是编程式的。 与编程式事务相对应的就是声明式事务管理,通过对方法或类添加注解的方式,声明该方法或类开启事务。很明显声明式事务代码量更少更加简单,更加高级,平时用的也更多,但是我们还是从最基础的编程式事务开始讲起。 具体实现 PlatformTransactionManager是Spring封装好接口...

编程副队长 3449

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

SSM框架学习——Spring事务管理

如果多个事务同时操作同一批数据,则会引发并发异常,设置不同的隔离级别可以解决这些问题。事务的隔离级别如下隔离界别从小到大,安全性越高,但效率就越低。事务的传播行为是指在同一个方法中,不同操作前后所使用的事务。传播行为可以控制是否需要创建事务以及如何创建事务,Spring默认传播行为是REQUIRED。为了解耦,我们一般用后者。

CairBin的博客 1230

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SSM学习(五)---Spring AOP&事务管理

SSM学习(五)---Spring AOP&事务管理

weixin_47109902的博客 284

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

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

SSM(spring mvc+spring+mybatis)学习路径——1-2、spring事务管理

目录 1-2 Spring事务管理 概念介绍 事务回顾 事务的API介绍 Spring 事务管理 转账案例 编程式事务管理 声明式事务管理 使用XML配置声明式事务 基于tx/aop 使用注解配置声明式...

weixin_30512043的博客 159

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SSM 学习记录 第二部分 Spring整合Mybatis&Junit AOP核心概念 Spring事务管理 SpringMVC 请求与响应 Rest风格

本文详细介绍了Spring框架的核心技术整合与应用,主要内容包括: Spring整合MyBatis,Spring整合JUnit,AOP面向切面编程,Spring事务管理,SpringMVC框架,RESTful风格开发

2401_88612756的博客 446

SSM整合可以作为学习借鉴

SSM整合概念说明 整合思路 编写Spring配置文件 测试是否成功 编写SpringMVC配置文件 测试是否成功 整合Spring和SpringMVC 测试 编写Mybati配置文件 整合mybatis和Spring 测试 SSM三个一起整合 测试 点击Finish完成 可以看见文件目录结构,这里idea的bug原因,没有java跟resources目录,为了符合maven目录结构 选择其中的java跟resources目录,右键 创建一个Test包,这里,注意是在<font

Adger 336

SpringMVC-学习笔记07【SSM整合案例】

SpringMVC-学习笔记07【SSM整合案例】

upward 1280

SSM框架入门学习(Spring篇)

讲解了Spring的核心内容,相信在学习后对Spring有不错的认识

2302_77423520的博客 1433

11.spring 事务管理

本文内容为Java中的SSM框架的搭建过程和知识点介绍,源文件已经上传到我的资源中,有需要的可以去看看, 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以去 我的主页了解更多计算机学科的精品思维导图整理 本文可以转载,但请注明来处,觉得整理的不错的小伙伴可以点赞关注支持一下哦! 1.回顾事务 2.事务管理介绍 3.案例:转账 3.1.搭建环境 3.2.手动管理事务(了解) 3.3.工厂Bean生成代理(半自动) 3.4.AOP配.

孤柒的博客 807

SSM框架学习总纲

MyBatis框架学习 MyBatis学习总结-01:环境搭建 MyBatis学习总结-02:CRUD操作和配置解析 MyBatis学习总结-03:ResultMap及分页 MyBatis学习总结-04:使用注解开发 MyBatis学习总结-05:一对多和多对一 MyBatis学习总结-06:动态SQL MyBatis学习总结-07:缓存 Spring框架学习 ...

CXX88888888的博客 316

2024年去一线大厂面试先过SSM框架源码这一关!,海康java面试几轮

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管 理,可以通过Spring的注入来完成此功能。

2401_84023482的博客 850

【java】【SSM框架系列】【一】Spring

前言:本课程学习能让你收货基于SpringBoot实现基础SSM框架整合,掌握第三方技术与SpringBoot整合思想。

春天的波菜 600

Spring面试题

SSM面试题个人笔记SpringMVC什么是Spring MVC?简单介绍下你对Spring MVC的理解?SpringMVC的请求流程SpringMVC中常用注解SpringMVC参数传递Spring1.谈谈你对spring的理解Spring的优点Spring的核心模块IOC的理解AOP的理解BeanFactory和ApplicationContext有什么区别?Spring Bean的生命周期Spring支持的几种bean的作用域Spring框架中的单例Beans是线程安全的吗?Spring基于xml注

weixin_44787883的博客 3447

SSM框架测试题整理(下)

在Mybatis映射文件中,

m0_62909831的博客 1040
上一篇: SSM学习(四)--Spring数据库开发
下一篇: SSM【Mybatis篇-mybatis入门】
点份炸鸡778
博客等级 码龄8年 28粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点份炸鸡778

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值