ORM,JPA,Hibernate,Spring data jpa 之间的缘分

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化 我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注 阅读详情

1. ORM

      ORM——Object Relational Mapping,即对象关系映射,实质是表示内存中的对象与关系型数据库之间的映射关系。

2. JPA

      JPA全称Java Persistence API,可以通过注解或者XML描述对象-关系表之间的映射关系,并将实体对象持久化到数据库中。

3. JPA的功能

      1. 提供ORM映射元数据,JPA支持XML和注解两种元数据的形式,元数据描述对象与表之间的映射关系,ORM框架则根据这种映射关系将实体对象映射到数据库中。

      2. 提供持久层的API,用来操作实体对象,执行CURD操作,ORM框架替开发者完成所有的事情,开发者无需关注JDBC以及SQL代码的编写。

      3. 提供JPQL(Java Persistence Query Language),即Java持久化查询语言,一种面向对象而非面向数据库的查询语言进行数据查询,避免程序的SQL语句紧密耦合。

总结:JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而Hibernate是实现JPA接口的ORM框架。即JPA是ORM规范,Hibernate是实现这种规范的一种ORM框架。

JPA规范与ORM框架之间的关系

4. Spring data jpa

      Spring data jpa是spring提供的一套简化JPA开发的框架,按照约定编写好DAO层接口,就可以在不实现接口的情况下实现对数据库的访问和操作,同时提供了很多处理CURD的功能,如分页,排序,复杂的查询等。Spring data JPA可以理解为JPA规范的再次封装抽象,底层使用的是Hibernate的JPA技术实现。

Spring data jpa,JPA以及ORM框架之间的关系

3.1 按照约定命名规则

Spring data jpa接口约定命名规范
序号关键字方法名称Sql语句where字句(JPQL Snippet)
1AndfindByLastnameAndFirstnamewhere Lastname = ? and Firstname = ?
2OrfindByLastnameOrFirstnamewhere Lastname = ? or Firstname = ?
3Is,EqualsfindByFirstname,findByFirstnIs,findByFirstnameEqualswhere Firstname = ?
4BetweenfindByStartDateBetweenwhere startDate between ? and ? 
5LessThanfindByAgeLessThanwhere age < ?
6LessThanEqualsfindByAgeLessThanEqualswhere age <= ?
7GreaterThanfindByAgeGreaterwhere age > ?
8GreaterThanEqualsfindByAgeGreaterEqualswhere age >= ?
9AfterfindByStartDateAfterwhere startDate > ?
10BeforefindByStartDateBeforewhere startDate < ?
11IsNullfindByAgeIsNullwhere Age is null
12isNotNull,NotNullfindByAge(Is)NotNullwhere Age is not null
13LikefindByFirstnameLikewhere firstname like ?
14NotLikefindByFirstnameeNotLikewhere firstname not like ?
15StartingWithfindByFirstnameStartingWithwhere firstname like "?%"
16EndingWithfindByFirstnameEndingWithwhere firstname like "%?"
17ContainingfindByFirstnameContainingwhere firstname like "%?%"
18OrderByfindByAgeOrderByLastnameDescwhere name age = ? order by Lastname desc
19NotfindByAgeNotwhere age <> ?
20InfindByAgeIn(Collection<Age> ages)where age in (?)
21NotInfindByAgeNotIn(Collection<Age> ages)where age not in (?)
22TruefindByActiveTruewhere active = true
23FalsefindByActiveFalsewhere active = false
24IgnoreCasefindByFirstnameIgnoreCasewhere UPPER(firstname) = UPPER(?)

创建测试数据库

CREATE DATABASE testDB;
CREATE TABLE `test_jpa`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `last_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `email` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(12) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

示例代码:

public interface TestJpaRepositories extends JpaRepository<TestJpa,Integer> {

    //根据firstName与LastName查找(两者必须在数据库有)
    TestJpa findByFirstNameAndLastName(String firstName, String lastName);

    //根据firstName或LastName查找(两者其一有就行)
    TestJpa findByLastNameOrFirstName(String lastTestName,String firstName);

    //根据firstName查找它是否存在数据库里<类似与以下关键字>
    //TestJpa findByFirstName(String firstName);
    TestJpa findByFirstNameIs(String firstName);

    //在Age数值age到age2之间的数据
    List<TestJpa> findByAgeBetween(Integer age, Integer age2);

    //小于指定age数值之间的数据
    List<TestJpa> findByAgeLessThan(Integer age);

    //小于等于指定age数值的数据
    List<TestJpa> findByAgeLessThanEqual(Integer age);

    //大于指定age数值之间的数据
    List<TestJpa> findByAgeGreaterThan(Integer age);

    //大于或等于指定age数值之间的数据
    List<TestJpa> findByAgeGreaterThanEqual(Integer age);

    //在指定age数值之前的数据类似关键字<LessThan>
    List<TestJpa> findByAgeAfter(Integer age);

    //在指定age数值之后的数据类似关键字<GreaterThan>
    List<TestJpa>  findByAgeBefore(Integer age);

    //返回age字段为空的数据
    List<TestJpa> findByAgeIsNull();

    //返回age字段不为空的数据
    List<TestJpa> findByAgeNotNull();

    /**
     * 该关键字我一度以为是类似数据库的模糊查询,
     * 但是我去官方文档看到它里面并没有通配符。
     * 所以我觉得它类似
     * TestJpa findByFirstName(String firstName);
     * @see https://docs.spring.io/spring-data/jpa/docs/2.1.5.RELEASE/reference/html/#jpa.repositories
     */
    TestJpa findByFirstNameLike(String firstName);

    //同上
    List<TestJpa> findByFirstNameNotLike(String firstName);

    //查找数据库中指定类似的名字(如:输入一个名字"M" Jpa会返回多个包含M开头的名字的数据源)<类似数据库模糊查询>
    List<TestJpa> findByFirstNameStartingWith(String firstName);

    //查找数据库中指定不类似的名字(同上)
    List<TestJpa> findByFirstNameEndingWith(String firstName);

    //查找包含的指定数据源(这个与以上两个字段不同的地方在与它必须输入完整的数据才可以查询)
    List<TestJpa> findByFirstNameContaining(String firstName);

    //根据age选取所有的数据源并按照LastName进行升序排序
    List<TestJpa> findByAgeOrderByLastName(Integer age);

    //返回不是指定age的所有数据
    List<TestJpa> findByAgeNot(Integer age);

    //查找包含多个指定age返回的数据
    List<TestJpa> findByAgeIn(List<Integer> age);
}

基于Junit4的单元测试(测试有效)

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class TestJpaRepositoriesTest {

    @Autowired
    private TestJpaRepositories repositories;

    @Test
    public void findByFirstNameAndLastName() {
        TestJpa testJpa = repositories.findByFirstNameAndLastName("May", "Eden");
        Assert.assertEquals(testJpa.getFirstName(),"May");
    }

    @Test
    public void findByLastNameOrFirstName() {
        TestJpa testJpa = repositories.findByLastNameOrFirstName("Geordie", "Eden");
        Assert.assertNotEquals(testJpa.getLastName(),"Eden");
    }

    @Test
    public void findByFirstNameIs() {
        TestJpa testJpa = repositories.findByFirstNameIs("amy");
        Assert.assertNull(testJpa);
    }

    @Test
    public void findByAgeBetween() {
        List<TestJpa> testJpaList = repositories.findByAgeBetween(15, 17);
        Assert.assertEquals(3,testJpaList.size());
    }

    @Test
    public void findByAgeLessThan() {
        List<TestJpa> testJpaList = repositories.findByAgeLessThan(17);
        Assert.assertEquals(2,testJpaList.size());
    }

    @Test
    public void findByAgeLessThanEqual() {
        List<TestJpa> testJpaList = repositories.findByAgeLessThanEqual(17);
        Assert.assertEquals(3,testJpaList.size());
    }

    @Test
    public void findByAgeGreaterThan() {
        List<TestJpa> testJpaList = repositories.findByAgeGreaterThan(17);
        Assert.assertEquals(2,testJpaList.size());
    }

    @Test
    public void findByAgeGreaterThanEqual() {
        List<TestJpa> testJpaList = repositories.findByAgeGreaterThanEqual(17);
        Assert.assertEquals(3,testJpaList.size());
    }

    @Test
    public void findByAgeAfter() {
        List<TestJpa> testJpaList = repositories.findByAgeAfter(17);
        Assert.assertEquals(2,testJpaList.size());
    }

    @Test
    public void findByAgeBefore() {
        List<TestJpa> testJpaList = repositories.findByAgeBefore(17);
        Assert.assertEquals(2,testJpaList.size());
    }

    @Test
    public void findByAgeIsNull() {
        List<TestJpa> testJpaList = repositories.findByAgeIsNull();
        Assert.assertEquals(0,testJpaList.size());
    }

    @Test
    public void findByAgeNotNull() {
        List<TestJpa> testJpaList = repositories.findByAgeNotNull();
        Assert.assertEquals(5,testJpaList.size());
    }

    @Test
    public void findByFirstNameLike() {
        TestJpa testJpa = repositories.findByFirstNameLike("May");
        Assert.assertNotNull(testJpa);
    }

    @Test
    public void findByFirstNameNotLike() {

    }

    @Test
    public void findByFirstNameStartingWith() {
        List<TestJpa> testJpaList = repositories.findByFirstNameStartingWith("May");
        Assert.assertEquals(2,testJpaList.size());
    }

    @Test
    public void findByFirstNameEndingWith() {
        List<TestJpa> testJpaList = repositories.findByFirstNameEndingWith("Evil");
        Assert.assertEquals(0,testJpaList.size());
    }

    @Test
    public void findByFirstNameContaining() {
        List<TestJpa> testJpaList = repositories.findByFirstNameContaining("hack");
        Assert.assertEquals(0,testJpaList.size());
    }

    @Test
    public void findByAgeOrderByLastName() {
        List<TestJpa> testJpaList = repositories.findByAgeOrderByLastName(18);
        for (TestJpa testJpaL : testJpaList){
            log.info("数据结果"+testJpaL.toString());
        }
    }

    @Test
    public void findByAgeNot() {
        List<TestJpa> testJpaList = repositories.findByAgeNot(20);
        Assert.assertEquals(5,testJpaList.size());
    }

    @Test
    public void findByAgeIn() {
        List<TestJpa> testJpaList = repositories.findByAgeIn(Arrays.asList(15, 16));
        Assert.assertEquals(2,testJpaList.size());
    }
}

总结:ORM是一种架构思想,JPA基于ORM思想定义的一个规范,Hibernate是基于ORM思想,按照JPA规范的一种(框架)实现方式,Spring data JPA可以理解为JPA规范的再次封装抽象,底层使用的是Hibernate的JPA技术实现。

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012 摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提 阅读详情

相关推荐

Fastwhisper + Pyannote 实现 ASR + 说话者识别

最近在研究ASR相关的业务,也是调研了不少模型,踩了不少坑,ASR这块,目前中文普通话效果最好的应该是阿里的modelscope上的中文模型了,英文的话,还是非whisper莫属了,而且whisper很变态,粤语效果也还不错,因此,如果实际业务中需要涉及到不同的语言,还是更推荐whisper多一点faster-whisper是使用CTranslate2对OpenAI的Whisper模型的重新实现,CTranslate2是一个用于Transformer模型的快速推理引擎。

qq_44193969的博客 1万+

在JPA中处理Java的LocalDateTime

几天前,我在处理JPA中的LocalDateTime属性时遇到问题。 在这篇博客文章中,我将尝试创建一个示例问题来说明该问题以及我使用的解决方案。 考虑以下实体,该实体为特定公司的员工建模– @Entity @Getter @Setter public class Employee { @Id @GeneratedValue private Long id; priv...

最佳 Java 编程 3728

第3章 zynq MII转GMII的配置和EMIO UART0的配置

本文介绍了在Vivado工程中实现MII转GMII接口适配的过程,同时配置EMIO UART0接口。主要内容包括:修改PS IP核添加UART0接口,使用concat IP核进行信号整合,调整GMII信号引脚连接,添加约束文件定义引脚映射,并最终生成bit流文件。通过详细的操作截图和TCL约束代码,展示了从硬件配置到生成可编程文件的完整流程,为Zynq平台开发提供了实用参考。

qq_36517072的博客 903

JPA ----( java persistent api) java持久化接口规范

JPA(Java Persistence API)是 Java 官方的 ORM 规范,提供了一套用于对象关系映射(Object-Relational Mapping)的标准。JPA 定义了如何将 Java 对象(实体)持久化到关系数据库中,但它本身没有具体的实现,常见的实现包括 Hibernate、EclipseLink 等。

qq_55272229的博客 5819

E-Prime脑电实验打mark全攻略:从端口查询到串并口实战(附常见问题解决)

本文提供了E-Prime脑电实验打mark的完整实战指南,涵盖端口查询、并口与串口配置的核心步骤及常见问题解决。文章深入解析了mark原理,并详细介绍了通过E-Basic脚本和Serial设备对象发送信号的两种方法,帮助研究者实现E-Prime与脑电设备的高精度时间同步,确保实验数据可靠性。

4k5l6j7h8的博客 355

【实战指南】利用CAN适配器高效调试CAN总线通信

本文提供了一份利用CAN适配器高效调试CAN总线通信的实战指南。文章从硬件连接、终端电阻配置、软件参数设置等基础环节入手,详细解析了CAN适配器作为关键调试工具的工作原理与使用方法,并针对常见的通信故障提供了系统化的问题排查思路,帮助工程师快速打通通信链路,提升调试效率。

weixin_28285943的博客 416

JPA教程(第二章)

转载自:https://www.cnblogs.com/vincentren/p/9512012.html 第二章 库表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `school_id...

lizhengyu891231的博客 185

攻克+86手机号Discord验证墙:从“无效”到“成功”的实战指南

本文提供了一份针对+86手机号在Discord注册时频繁遭遇“手机号无效”问题的实战解决指南。文章系统分析了问题根源,并分步详解了从打造纯净网络环境、尝试多种手机号格式(如+86前加0),到更换iOS等客户端设备的有效方法,旨在帮助用户成功完成Discord手机号验证。

mac99的博客 1122

如何快速一键搞定JPA中所有findBy语法规则

JPA中findBy基本语法规则 1.首先先新建一个数据库,名字叫做jpatest 2.新建一个SpringBoot项目(如果新手还不会,请先阅读idea中如何快速创建SpringBoot项目) 这边需要引入jpa+mysql+web的相关依赖,如果创建的时候没有引入就需要在pom.xml进行配置 新建一个controller包(控制类所在地),entity

林老师带你学编程 7万+

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 894

基于Jeecgboot3.9.0的文档管理系统(四)

基于Jeecgboot3.9.0的文档管理系统(四)

宁波阿成的博客 252

JPA中所有findBy语法规则(举例)

JPA中findBy基本语法规则: 1.首先先新建一个数据库,名字叫做jpatest 2.新建一个SpringBoot项目(如果新手还不会,请先阅读idea中如何快速创建SpringBoot项目) 这边需要引入jpa+mysql+web的相关依赖,如果创建的时候没有引入就需要在pom.xml进行配置 新建一个controller包(控制类所在地),entity包(实体类所在地),repository包(dao类所在地) 3.application.properties配置文件中..

HD243608836的博客 9483

Open3D KD-tree的使用【2025最新版】

Open3d使用FLANN构建KDTree以便进行快速最近邻检索。博客长期更新,本文最近一次更新时间为:2025年1月1日,代码已同步更新至Open3D 0.18.0版本。

点云侠的博客 40万+

Spring Boot实战:基于状态机与Redis实现用户触发式关系系统

在后端系统开发中,状态机(FSM)是管理复杂业务逻辑流转的核心设计模式,它通过定义有限状态和状态间的转换规则,确保业务流程的清晰与可控。结合Redis实现高速缓存与分布式锁,能有效提升系统并发处理能力和数据一致性。这种技术组合在需要精确控制流程、处理用户行为触发事件的场景中价值显著,例如社交互动、游戏任务、订单流程等。本文以构建一个“缘分匹配”系统为例,具体演示如何运用Spring Boot整合JPA、Redis及状态机模式,实现一个包含条件触发、概率判定和状态流转的完整后端服务,其中涉及用户画像匹配与事件

weixin_34007886的博客 335

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Data Repository有趣的定义query方法

学习了Spring的一个小tutorial: Accessing Data with GemFire。我们为自定义的数据对象建立Repository,作为管理数据对象的接口。通常,我们继承Spring框架的CrudRepository接口,它为我们的Repository提供了基本的CRUD(增删改查)功能。 自定义的Repository如下:public interface PersonRepos

陀思妥耶夫斯基和海德格尔伴我勇敢存在 1万+

数学建模模型总结

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

Springboot之JPA常用查询方法

Index Keyword Sample JPQLsnippet 1 And findByLastnameAndFirstname …wherex.lastname=?1andx.firstname=?2 2 Or findByLastnameOrFirstname …wherex.lastname=?1or...

小白一个 5314

WINCC7.3破解文件

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

Spring Data JPA 查询方法支持的关键字

Table2.3.Supported keywords inside method names KeywordSampleJPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstna...

weixin_30780221的博客 856

Jpa使用说明

jpa使用说明

tianyaleixiaowu的专栏 7106

JPA声明式查询关键字及使用方法

分享知识 传递快乐 使用JPA自定义声明式查询方法 凡是继承了JpaRepository的或继承其子接口的,都可以使用自定义的声明式查询方法。 声明式查询方法可以分3大类: 计数类:以count开头,返回数值类型。 查询类:以get/find/stream/query/read开头,返回实体类或其集合。 删除类:以delete/remove开始,返回int类型。 示例: pu...

旷野历程 2974

基于JPA获取查询中的单条记录

引言:JPA与SpringData中提供了诸多非常便利的方法,这里以如何以不书写SQL的方式来实现单条记录的查询。repositories.limit-query-result这个标题为Spring Data提供了内置功能,这些查询方法需要使用first/top等关键词,这两个关键词是彼此可以替代的。 可选的数字值用以表示最大可以返回的记录条数,一般都是放在first/top的右边。Example

木小鱼的笔记 3万+

Spring Data JPA的方法命名规则

Spring Data JPA是个非常强大的ORM持久化解决方案,免去了mybatis或spring jdbcTemplate的开发人员编写脚本的无趣工作。 通过简单明了地约定好接口方法的规则,来自动生成相应的JPQL语句,映射成PO对象,能大幅节省开发人员的编码量。 接口方法的命名规则也很简单,明白And、Or、Is、Equal、Greater、StartingWith等英文单词的含义,就可...

china_3的专栏 1万+

SpringBoot学习笔记(五) --- SpringBoot整合JPA

工具:idea 2019.1 gradle: 5.2.1 SpringBoot 2.1.5 JPA的功能十分强大,并且使用简单,将很多常用的SQL语句都封装了起来,并且,它还可以根据你方法的名称来执行相应的SQL语句。接下来就来看一下,JPA在SpringBoot中怎么使用吧。 1. 新建项目 新建立一个SpringBoot项目,在build.gradle 里面添加相应的依赖,web包和JPA包 ...

程序猿小河 393

MongoRepository接口介绍

与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使 用Repository的功能,先继承MongoRepository TD>接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以 使用,无需实现里面的方法,spring会根据定

  1万+

Jpa findBy用法

项目GitHub地址 https://github.com/1913045515/JPA 代码 package com.lzq.jpa.entity.repository; import com.lzq.jpa.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util...

如雨随行的博客 1万+

jpa基本语法

&#13; 详细语法官网去学习 --&gt;&gt;http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference 摘抄2018.02.19版本:http://www.cnblogs.com/wangdaijun/p/...

LuckyTHP 1万+

keyword in Jpa

Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname … where x.lastname = ?1 or x.fi

1133
上一篇: Blockchain Automation Framework’s Features
下一篇: Java中的构造方法
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值