Java框架_Mybatis_day10_注解开发

MTK平台 MT6789 烧录 efuse 3.0 Configuration SOP =====================生成cert1和cert2 key===============================================生成efuse key相关文件===========================================签名DA==========================================================正常编译。=====================Security3.0 的SOP 说明。 阅读详情

十四、Mybatis 注解开发

14.1 入门案例(查询所有)

       当我们使用注解的时候,不要保留 UserDao.xml 文件,否则会冲突。

UserDao.java

package com.cpz.dao;

import com.cpz.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserDao {

    @Select(value = "select * from user")
   public List<User> findAll();
}

对比分析:

namespace      对应         package名+类名

id                      对应        方法名

resultType        对应         List<User>中存放的User

select标签中的sql     对应      @Select中的sql

14.2 注解说明

@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result一起使用,封装多个结果集

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

@SelectProvider: 实现动态SQL映射

14.3 注解实现基本的CRUD

14.3.1 @Select:实现查询

        查询的实现在入门案例里已经完成,这里不再说明。

14.3.2 @Insert:实现新增

UserDao.java

@Insert(value = "insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})")
@SelectKey(keyProperty = "id",keyColumn = "id",before = false,statement = "select last_insert_id()",resultType = Integer.class)
public void saveUser(User user);

         为了能返回添加用户的id,我们添加了一个 @SelectKey 注解

MybatisTest.java

    @Test
    public void saveUser(){
        User user = new User();
        user.setUsername("哪吒");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("天庭");

        System.out.println(user);
        userDao.saveUser(user);
        System.out.println(user);
    }

14.3.3 @Update:实现更新

UserDao.java

@Update(value = "update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}")
public void updateUser(User user);

MybatisTest.java

    @Test
    public void updateUser(){
        User user = new User();
        user.setId(57);
        user.setUsername("杨戬");
        user.setBirthday(new Date());
        user.setSex("男");
        user.setAddress("钱塘关");

        userDao.updateUser(user);
    }

14.3.4 @Delete:实现删除

UserDao.java

@Delete(value = "delete from user where id = #{id}")
public void deleteUser(Integer id);

MybatisTest.java

@Test
public void deleteUser(){
   userDao.deleteUser(58);
}

14.3.5 其他操作

UserDao.java

    // 根据id查询用户
    @Select(value = "select * from user where id=#{id}")
    public User findById(Integer id);

    // 根据用户名称模糊查询
    // @Select(value = "select * from user where username like #{username}")
    @Select(value = "select * from user where username like '%${value}%'")
    public List<User> findByLikeName(String username);

    // 查询总用户数量
    @Select(value = "select count(*) from user")
    public Integer findCount();

    // 传递多个条件:方案一:传递JavaBean使用ognl的方式解析
    @Select(value = "select * from user where username like #{username} and sex = #{sex}")
    public List<User> findByNameAndSex1(User user);

    // 传递多个条件:方案二:传递2个字符串,在Dao中使用@Param
    @Select(value = "select * from user where username like #{username} and sex = #{sex}")
    public List<User> findByNameAndSex2(@Param(value = "username") String username,@Param(value = "sex") String sex);

    // 传递多个条件:方案三:在Dao中使用Map集合的key解析
    @Select(value = "select * from user where username like #{username} and sex = #{sex}")
    public List<User> findByNameAndSex3(Map<String,Object> map);

MybatisTest.java

    // 根据id查询用户
    @Test
    public void findById(){
        User user = userDao.findById(48);
        System.out.println(user);
    }
    // 根据用户名称模糊查询
    @Test
    public void findByLikeName(){
        //List<User> list = userDao.findByLikeName("%王%");
        List<User> list = userDao.findByLikeName("王");
        for (User user : list) {
            System.out.println(user);
        }
    }
    // 查询总用户数量
    @Test
    public void findCount(){
        Integer count = userDao.findCount();
        System.out.println(count);
    }
    // 传递多个条件:方案一:传递JavaBean使用ognl的方式解析
    @Test
    public void findByNameAndSex1(){
        User user = new User();
        user.setUsername("%王%");
        user.setSex("男");
        List<User> list = userDao.findByNameAndSex1(user);
        for (User u : list) {
            System.out.println(u);
        }
    }
    // 传递多个条件:方案二:传递2个字符串,在Dao中使用@Param
    @Test
    public void findByNameAndSex2(){
        List<User> list = userDao.findByNameAndSex2("%王%","男");
        for (User user : list) {
            System.out.println(user);
        }
    }
    // 传递多个条件:方案三:在Dao中使用Map集合的key解析
    @Test
    public void findByNameAndSex3(){
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("username","%王%");
        map.put("sex","男");
        List<User> list = userDao.findByNameAndSex3(map);
        for (User user : list) {
            System.out.println(user);
        }
    }

14.4 注解实现复杂关系映射

14.4.1 @Result和@ResultMap

       为了使代码效果更好,我们先将User类中的属性修改,使之与数据库的字段不一致

User.java

public class User implements Serializable{
    private Integer userId;
    private String userName;
    private Date userBirthday;
    private String userSex;
    private String userAddress;
    // set、get方法
}

UserDao.java

    @Results(id = "userMap",value = {
            @Result(id = true,property = "userId",column = "id"),
            @Result(property = "userName",column = "username"),
            @Result(property = "userBirthday",column = "birthday"),
            @Result(property = "userSex",column = "sex"),
            @Result(property = "userAddress",column = "address")
    })

    @Select("select * from user")
    public List<User> findAll();

    @Select(value = "select * from user where id = #{id}")
    @ResultMap(value = "userMap")
    public List<User> findById(Integer id);

MybatisTest.java

     @Test
    public void findAll(){
        List<User> list = userDao.findAll();
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public void findById(){
        List<User> list = userDao.findById(48);
        for (User user : list) {
            System.out.println(user);
        }
    }

总结:

@Results注解代替的是标签<resultMap>

       该注解中可以使用单个@Result注解,也可以使用@Result集合

   @Results({@Result(),@Result()})或@Results(@Result()) 

@Result注解代替了 <id>标签和<result>标签

@Result 中 属性介绍:

       id   boolean类型,是否是主键,默认是false(非主键)

       column   数据库的列名

       property   对象中需要装配的属性名

       one   需要使用的@One注解(@Result(one=@One)()))

       many   需要使用的@Many注解(@Result(many=@many)()))

14.4.2 @One

@One注解(一对一)代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

@One注解属性介绍:

       select    指定用来多表查询的 sqlmapper

       fetchType   会覆盖全局的配置参数  lazyLoadingEnabled。。

       @Result(column=" ",property="",one=@One(select="")) 

首先,我们要创建一个 Account 实体类和 AccountDao.java 接口

Account.java

public class Account {
    private Integer id;
    private Integer uid;
    private String money;
    private User user;

    //set、get方法
    //toString
}

AccountDao.java

package com.cpz.dao;

import com.cpz.domain.Account;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface AccountDao {

    @Results(id = "accountUserMap",value = {
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "uid",column = "uid"),
            @Result(property = "money",column = "money"),
            @Result(property = "user",column = "uid",one = @One(select = "com.cpz.dao.UserDao.findById",fetchType = FetchType.LAZY))
    })

    @Select(value = "select * from account")
    public List<Account> findAccountUser();
}

MybatisTest.java

    @Test
    public void findAccountUser(){
        List<Account> list = accountDao.findAccountUser();
        for (Account account : list) {
            System.out.println(account);
        }
    }

总结:总的来说相比于前面讲延迟加载时所使用的的代码并无太大不同,只是将 select = "com.cpz.dao.UserDao.findById"

放入 @One 注解里。

14.4.3 @Many

@Many注解(一对多)代替了<collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。

注意:聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList)但是注解中可以不定义;

     @Result(property="",column="",many=@Many(select="")) 

User.java

public class User implements Serializable{
    private Integer userId;
    private String userName;
    private Date userBirthday;
    private String userSex;
    private String userAddress;

    private List<Account> accounts;

    // set、get方法
    // toString
}

UserDao.java

    @Select(value = "select * from user")
    @Results(id = "userAccountMap",value = {
            @Result(id = true,property = "userId",column = "id"),
            @Result(property = "userName",column = "username"),
            @Result(property = "userBirthday",column = "birthday"),
            @Result(property = "userSex",column = "sex"),
            @Result(property = "userAddress",column = "address"),
            @Result(property = "accounts",column = "id",many = @Many(select = "com.cpz.dao.AccountDao.findById",fetchType = FetchType.LAZY))
    })
    public List<User> findUserAccount();

AccountDao.java

    @Select(value = "select * from account where uid = #{id}")
    public List<Account> findById(Integer uid);

MybatisTest.java

    @Test
    public void findUserAccount(){
        List<User> list = userDao.findUserAccount();
        for (User user : list) {
            System.out.println(user);
        }
    }

@Many:相当于<collection>的配置

    select 属性:代表将要执行的sql语句 

    fetchType 属性:代表加载方式,一般如果要延迟加载都设置为LAZY的值 

    column = "id":表示拿主键作为参数,去Account表去查询。

14.5 使用注解配置二级缓存

配置UserDao.java:@CacheNamespace(blocking = true) 

3 路由引入 在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。 阅读详情

相关推荐

HackRF实战:用Portapack扩展板玩转GPS信号模拟(附固件刷写教程)

本文详细介绍了如何使用HackRF与Portapack扩展板进行GPS信号模拟,包括固件刷写、信号生成与发射配置等实战操作。通过专业工具和优化技巧,读者可以掌握软件无线电的高级应用,解决手机定位难题,同时强调安全合规使用的重要性。

weixin_28717431的博客 363

java——mybatis——Mybatis注解开发——@Select查询——查询所有条数

DAO接口: package com.sunxl.dao; import com.sunxl.pojo.User; import org.apache.ibatis.annotations.*; import java.util.List; public interface UserDao { @Select("select * from users") List&lt...

小白龙白龙马的博客 1650

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2249

select * 和select 1,select count(*)和select count(1)

1、select * 和select 1的区别 如果要返回数据,使用select * ,如果要判断有没有结果使用select 1; 2、select count(*)和select count(1)的区别 一般情况下,select count(*)和select count(1)两个返回的结果是一样的。

m0_63725962的博客 1万+

材料力学小白必看:纯弯曲正应力计算全解析(附实例演示)

本文详细解析了材料力学中纯弯曲正应力的计算原理与工程应用,通过实例演示帮助初学者掌握关键公式和计算流程。内容涵盖纯弯曲的基本假设、正应力分布规律、截面特性计算,以及现代工具如Excel、ANSYS和Python在应力分析中的应用,特别适合材料力学小白系统学习。

sea99的博客 1232

【IIC通信】Chap.1(I2C)IIC通信原理、IIC读写时序详解

IIC通信以两根连线SDA、SCL实现了完善的全双工同步数据传送, 可以方便地构成多机系统和外围器件扩展系统。

Jie_MSD的博客 2万+

精讲 Select count(*) Select count(1) Select count(字段) 的区别

首先要知道COUNT(1)和COUNT(*)表示的是直接查询符合条件的数据库表的行数,而COUNT(列名/字段)表示的是查询符合条件的列的值不为NULL的行数。 所以这里得出一个结论: COUNT(1)和COUNT(*):包括对NULL的统计 COUNT(字段):不包括对NULL的统计 其次有很多关于COUNT(1)和COUNT(*)性能不同的说法(COUNT(1)比COUNT(*)性能好),但实际上,这两种查询方式在实现上没有区别,而且效率一样。 总结: COUNT(1)和COUNT...

小树じ的博客 1012

模型预测控制(MPC)解析(六):有约束的MPC简介

本文为阅读笔记,仅供学习交流使用!!! 先从一个例子开始,说明当原始设计的控制信号满足操作约束时,控制系统的性能会显著恶化。并且只要稍加修改,如果在控制器的实现中加入约束,则性能恶化的程度可以降低,从而产生约束控制的思想。 在学习有约束控制之前,先看一个控制系统在控制信号饱和和不饱和的情况下运行的例子。 例:无阻尼振荡器的数学模型如下: 采样周期为Δt=0.1\Delta{t}=0.1Δt=0.1,对应的离散时间状态空间模型为: 设计目标是:设计一个预测控制系统,使得系统输出跟踪单位阶跃响应越快越好。预

行者无疆的博客 6655

select count(1)、count(*)、count(column)

count(*):先把星号翻译为具体字段名字,多了一步翻译,效率差点 count(1):计算有多少符合条件的行,可以理解为每行数据存在某个值固定的字段,计算有多少个固定值 从结果来说: count(*) 和 count(1) 没区别,都不会过滤 NULL count(column) 会过滤 NULL 从速度来说: 如果只有一列,count(*) 效率最高 多列时,count(1) 效率高于 count(*) 如果列为主键,count(column) 效率最高 如果列不为主键,count(1) 效率比

m0_57015193的博客 953

FATFS挂载多个存储设备(2):功能配置及功能测试

本文介绍了基于FATFS文件系统实现多存储设备挂载的方法,包含底层设备驱动函数编写、功能配置、功能测试。

kevin1499的博客 2585

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7092

MyBatis Mapper中 @Select注解调用静态常量

Java项目在使用MyBatis技术,辟邪mapper SQL时,如果在其中的ognl表达式或者sql中直接使用一些数字或者字符串的话,会造成难以维护的问题。在Java编码中,我们通常会把这些数字或者字符串定义在常量类或者接口中,可以直接在mapper中也可以使用这些常量就比较好。MybBatis@Select注解标签直接编写SQL,也是支持这样的需求的。包名:com.yt.nbdt.adcenter.controller.vo。mapper @Select注解使用。

java李阳勇的博客 1625

Linux kernel crypto的介绍和代码导读

在Linux kernel的module_init阶段会将algif_type_skcipher、algif_type_aead、algif_type_hash、algif_type_rng 四种算法注册.在userspace通过netlink调用了,kernel种的af_alg模块收到消息后, 根据上层传来的算法种类名字来选择走哪一个结构体(alg_type_xxx)的ops函数。也就是添加到af_alg维护的alg_types链表种. alg_types链表种仅有这四个数据.

baron-周贺贺-代码改变世界ctw 321

【Java_EE】Day05 MyBatis注解开发

除了前四节我们使用XML的映射方式进行开发,其实我们更常用的方式是通过Mybatis的注解实现POJO实体对象和数据表,一般我们直接把他写在接口上。这样的好处在于相对来讲更简单,而且不会增加开销。MyBatis提供了@Select@Insert@Update@Delete以及@Param等用于增删改查,以及传递参数的常用注解。

HLJ_Student的博客 1097

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

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

day62 JavaWeb框架阶段—— Mybatis的注解开发&SSM框架整合(原始方式整合&Spring整合MyBatis& MyBatis的注解实现复杂映射开发)

2.Mybatis的注解开发 2.1 MyBatis的常用注解 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与...

qq_38454176的博客 422

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Day48】MyBatis 注解开发:替代 XML 映射文件

在 MyBatis 的传统开发模式中,XML映射文件是核心,但随着项目复杂度提升,大量 XML 文件会增加维护成本。MyBatis 提供的注解开发模式,可直接在 Mapper 接口方法上标注注解来编写 SQL,无需编写 XML 映射文件,极大简化了开发流程。本文将全面讲解 MyBatis 注解开发的核心用法,包括基础 CRUD、动态 SQL、关联查询,对比 XML 模式的差异,让你快速掌握注解开发的精髓。

maihuohuo的博客 1119

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【JAVA_EE】Day01 MyBatis框架

MyBatis框架是一个支持普通SQL操作、存储及高级映射的持久层框架,通过使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射为数据库中的记录,使开发人员可以使用面向对象的编程思想和方式来操作数据库。

HLJ_Student的博客 1008

MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】

MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】

upward 726

Mybatis注解开发

Mybatis注解开发 1 mybatis注解开发的环境搭建 mybatis 的常用注解说明,如下所示 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result一起使用,封装多个结果集 @ResultMap:实现引用@Results 定义的封装 @One:实现一对一结果集封装 @Many:实现一对多结果集封装 @SelectProvider: 实现动态SQL映射 @Cach

weixin_40055163的博客 466

MyBatis注解开发

文章目录1. 创建项目2. 在 pom.xml 文件中完成工程配置3. 完成环境配置3.1 实体类创建3.2 与实体类对应的接口的创建3.3 主配置文件3.4 外部配置文件3.5 配置完成后的目录结构4. 进行注解开发4.1 在IUserDao.java中进行注解开发4.2 在测试类中进行测试4.3 运行结果4.4 注意事项5. 注解开发进行CRUD操作5.1 在接口IUserDao.java进行注解开发5.2 在测试类中进行测试5.3 目录结构6. 建立实体类属性和数据库表中列的对应关系6.1 实体类6.

weixin_44086832的博客 222

MyBatis---- Mybatis 注解开发(一)

上一篇????:MyBatis---- Mybatis 缓存 文章目录1、注解开发的环境搭建2、注解开发测试使用注意事项 ????大家好!我是近视的脚踏实地,这篇文章主要来学习Mybatis的注解开发      唯有行动  才能解除你所有的不安 1、注解开发的环境搭建 这几年来注解开发越来越流行,Mybatis 也可以使用注解开发方式,这样我们就可以减少编写 Mapper 映射文件了。本次我们先围绕一些基本的 CRUD 来学习,再学习复杂映射关系及延

Monster丶ZF的博客 669

MyBatis-学习笔记12【12.Mybatis注解开发】

MyBatis-学习笔记12【12.Mybatis注解开发】

upward 723

java学习 day10 mybatis

然后这个接口不用写实现类,他会在容器自动创建对象(也就是ioc控制反转),然后把数据可以通过这个定义好的list方法拿到,倒是如果要使用这个对象,我们可以直接通过(依赖注入的方式拿到)也就是@ autowired 然后调用他的方法就拿到数据了,然后这些字段名必须得和们数据库里面一致,所以最后才能顺利拿到。然后我们需要写一个实体类(User),这个实体类可以看作,数据库查询之后的不是有一排数据吗,这个类就可以看作其中一行(字段),里面有id,name ,age,gender,和phone的值,如图所示。

2301_79267486的博客 305

黑马mybatis框架笔记day01

第一天 1、什么是框架? 他是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。 2、三层架构 表现层:用于展示数据的 业务层:处理业务需求 持久层:和数据库交互的 3、持久层技术解决方案 jdbc技术: Connection PreparedStatement ResultSet ...

weixin_43353418的博客 638

MyBatis框架——First Day

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

m0_63138660的博客 346

Java框架学习——Mybatis注解开发实现多表查询

一创建数据库 使用Mysql数据库user表、account表 ①user表 create table `user` ( `id` double , `username` varchar (39), `birthday` date , `sex` varchar (3), `address` varchar (75) ); insert into `user` (`id`, `username`, `birthday`, `sex`, `address`) values('1','tom','2

weixin_37719485的博客 404
上一篇: Java框架_Mybatis_day09_缓存
下一篇: Java高级_多线程_day02_线程安全问题
chipeize
博客等级 码龄10年 23粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值