MyBatis的基本使用与mybatis-plus的基本使用

在Spring Boot项目中使用MyBatis需要几个步骤,包括添加依赖、配置数据源、创建Mapper接口和XML文件、以及使用Mapper。下面是一个具体的例子,包括必要的代码和注释。

### 步骤1: 添加MyBatis和数据库依赖

首先,在`pom.xml`中添加MyBatis Spring Boot Starter和数据库驱动的依赖。以下是一个使用MySQL数据库的例子:

```xml
<dependencies>
    <!-- Spring Boot MyBatis Starter -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>
```

### 步骤2: 配置数据源

在`application.properties`或`application.yml`中配置数据库连接信息:

```properties
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.model
```


一些解释:

这段配置是Spring Boot项目中`application.properties`或`application.yml`文件的一部分,用于设置MyBatis框架的相关属性。下面是对这两行配置的解释:

### mybatis.mapper-locations

```properties
mybatis.mapper-locations=classpath:mapper/*.xml
```

这行配置指定了MyBatis的XML映射文件的位置。`classpath`表示这些文件位于项目的类路径下,这是Maven或Gradle等构建工具默认放置编译后的Java类文件和其他资源文件的地方。`mapper/*.xml`是一个通配符模式,表示在`src/main/resources/mapper`目录下的所有XML文件都将被包含。

MyBatis使用这些XML文件来定义SQL映射,即如何将Java对象和数据库表之间的交互映射到具体的SQL语句。每个XML文件通常包含一组相关的SQL语句,例如针对特定数据库表的所有CRUD(创建、读取、更新、删除)操作。

### mybatis.type-aliases-package

```properties
mybatis.type-aliases-package=com.example.model
```

这行配置指定了MyBatis类型别名的包路径。类型别名是为Java类型(通常是实体类)指定的简短名称,用于在MyBatis的XML映射文件或注解中引用这些类型。这样做可以避免使用完整的类名(包括包名),使SQL映射文件和代码更加清晰和易于维护。

在这个例子中,`com.example.model`表示所有位于`com.example.model`包下的所有类都将被MyBatis自动识别为类型别名的候选类。这意味着,如果你有一个名为`User`的实体类位于`com.example.model`包下,你可以在XML映射文件中直接使用`User`作为别名,而不需要每次都写完整的类名`com.example.model.User`。

总结一下,这两行配置是MyBatis在Spring Boot项目中的基本设置,它们告诉MyBatis在哪里查找XML映射文件,以及如何识别实体类的类型别名。正确配置这些属性是使用MyBatis进行数据库操作的重要步骤。

MyBatis的XML映射文件是一种XML格式的配置文件,它用于定义Java对象与数据库表之间的映射关系以及SQL语句。这些映射文件是MyBatis框架的核心组成部分,它们使得开发者能够通过配置文件来管理SQL语句,而不是将SQL语句硬编码在Java代码中。

### 作用:

1. **SQL与Java代码分离**:XML映射文件允许将SQL语句与Java代码分离,这有助于保持代码的清晰和易于维护。开发者可以在XML文件中编写和管理所有的SQL语句,而不是散布在Java类中。

2. **动态SQL**:MyBatis支持动态SQL,即根据某些条件构建不同的SQL语句。XML映射文件中的`<if>`、`<choose>`、`<when>`、`<otherwise>`等标签可以用来创建复杂的动态SQL。

3. **参数映射**:XML映射文件定义了如何将Java对象的属性映射到SQL语句中的参数。这包括基本类型、POJO(Plain Old Java Object)以及集合类型。

4. **结果映射**:MyBatis使用XML映射文件来定义如何将数据库查询的结果集映射回Java对象。这包括处理简单的结果映射和复杂的关联映射(一对多、多对一等)。

5. **事务管理**:虽然MyBatis本身不提供事务管理,但XML映射文件可以与Spring等容器集成,使用容器提供的事务管理功能。

### 一个简单的XML映射文件例子:

```xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

  <!-- 实体类与数据库表的映射 -->
  <resultMap id="userResultMap" type="com.example.model.User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <result property="email" column="email"/>
  </resultMap>
  
  <!-- 查询所有用户 -->
  <select id="selectAllUsers" resultMap="userResultMap">
    SELECT user_id, username, email FROM users
  </select>
  
  <!-- 根据ID查询用户 -->
  <select id="selectUserById" parameterType="int" resultMap="userResultMap">
    SELECT user_id, username, email FROM users WHERE user_id = #{id}
  </select>
  
  <!-- 插入用户 -->
  <insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO users (username, email) VALUES (#{username}, #{email})
  </insert>
  
  <!-- 更新用户 -->
  <update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET username = #{username}, email = #{email} WHERE user_id = #{id}
  </update>
  
  <!-- 删除用户 -->
  <delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE user_id = #{id}
  </delete>
  
</mapper>
```

在这个例子中,`<mapper>`标签定义了这个XML文件对应的Mapper接口的完全限定名。`<resultMap>`标签定义了如何将数据库查询的结果集映射到`User`实体类的属性上。`<select>`、`<insert>`、`<update>`和`<delete>`标签分别定义了查询、插入、更新和删除操作的SQL语句。

MyBatis的XML映射文件提供了一种灵活且强大的方式来配置和管理SQL语句,使得数据库交互更加高效和可维护。

### 步骤3: 创建实体类

创建一个实体类`User`,它映射数据库中的`users`表:

```java
package com.example.model;

public class User {
    private Integer id;
    private String username;
    private String email;
    // 省略构造函数、getter和setter
}
```

### 步骤4: 创建Mapper接口

创建一个Mapper接口`UserMapper`,定义数据库操作的方法:

```java
package com.example.mapper;

import com.example.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users")
    List<User> findAll();
    
    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(Integer id);
    
    // 其他数据库操作方法...
}
```

### 步骤5: 创建XML映射文件(可选)

如果你更喜欢使用XML配置方式,可以创建一个XML映射文件`UserMapper.xml`:

```xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findAll" resultType="com.example.model.User">
        SELECT * FROM users
    </select>
    <select id="findById" parameterType="java.lang.Integer" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    <!-- 其他SQL语句... -->
</mapper>
```


注意:

在MyBatis中,你可以选择使用注解方式或者XML方式来定义SQL映射,但不能混用。换句话说,如果你在一个项目中使用注解(如`@Select`)在Mapper接口中定义SQL语句,那么你就不需要在XML映射文件中再次定义相同的SQL语句;反之亦然,如果你选择在XML文件中定义SQL映射,那么Mapper接口中的注解就不需要了。

### 只使用注解的方式:

如果你选择使用注解,你的Mapper接口将直接包含所有的SQL语句,如下所示:

```java
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users")
    List<User> findAll();

    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(Integer id);

    // 其他数据库操作方法...
}
```

### 只使用XML的方式:

如果你更喜欢XML的方式,你将不在Mapper接口中使用任何注解,而是在XML映射文件中定义所有的SQL语句,如下所示:

```xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findAll" resultType="com.example.model.User">
        SELECT * FROM users
    </select>
    <select id="findById" parameterType="java.lang.Integer" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    <!-- 其他SQL语句... -->
</mapper>
```

### 选择哪种方式?

这取决于你的个人偏好和项目需求。一些开发者更喜欢注解,因为它使得代码更加简洁,并且不需要额外的XML文件。另一些开发者则偏好XML方式,因为它提供了更多的灵活性和强大的动态SQL功能。

无论选择哪种方式,MyBatis都会根据你的配置来执行相应的SQL语句。重要的是保持一致性,选择一种方式并在整个项目中坚持使用。




 

### 步骤6: 使用Mapper

在服务层或控制器中注入`UserMapper`并使用它:

```java
package com.example.service;

import com.example.model.User;
import com.example.mapper.UserMapper;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public List<User> findAllUsers() {
        return userMapper.findAll();
    }
    
    public User findUserById(Integer id) {
        return userMapper.findById(id);
    }
    
    // 其他业务方法...
}
```

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

让我们详细解释一下这段代码的作用:

  1. 依赖注入:通过将UserMapper作为参数传递给UserService的构造器,我们使用了依赖注入(Dependency Injection)的原则。这是一种设计模式,用于解耦组件之间的依赖关系。在这个例子中,UserMapperUserService的依赖,UserService不需要知道如何创建或实现UserMapper,它只需要知道如何使用它。

  2. 设置成员变量this.userMapper = userMapper; 这行代码将传入的UserMapper实例赋值给UserService类的成员变量userMapper。这样,UserService就可以在其方法中使用userMapper来进行数据库操作。

  3. 封装和抽象:通过使用UserMapper接口,UserService类不需要直接处理数据库连接、SQL执行等底层细节。它只需要调用UserMapper提供的方法。这样做提高了代码的可维护性和可测试性,因为UserMapper可以在不改变UserService的情况下被替换或修改。

  4. 准备使用:一旦UserService类的实例被创建,它就拥有了执行数据库操作所需的所有信息。这意味着UserService现在可以用来处理用户相关的业务逻辑,如创建用户、查找用户、更新用户信息等。

这个构造器是Spring框架中依赖注入的一个典型应用。Spring容器会在创建UserService的bean时自动注入UserMapper的实例。这样,当UserService需要与数据库交互时,它可以通过userMapper成员变量调用相应的Mapper方法。这种设计模式使得代码更加模块化,易于管理和测试。

### 步骤7: 运行和测试

现在,你可以运行Spring Boot应用程序并测试`UserService`中的方法是否按预期工作。例如,你可以创建一个控制器来处理HTTP请求并调用服务层的方法:

```java
package com.example.controller;

import com.example.model.User;
import com.example.service.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/")
    public List<User> getAllUsers() {
        return userService.findAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Integer id) {
        return userService.findUserById(id);
    }
    
    // 其他API方法...
}
```

通过以上步骤,我们在Spring Boot项目中成功集成了MyBatis,并创建了一个简单的用户管理功能。我们定义了一个`User`实体类,一个`UserMapper`接口来映射数据库操作,以及一个服务层`UserService`来封装业务逻辑。最后,我们创建了一个`UserController`来提供HTTP API供客户端调用。


解释一下Mapper接口:

"Mapper"在MyBatis框架中是一个关键概念,它指的是一个Java接口,用于映射SQL语句和操作数据库的行为。Mapper接口中的方法通常与数据库中的表、字段和SQL语句相对应。MyBatis会根据这些映射关系来执行数据库操作,从而简化数据库访问层的代码。

在MyBatis中,并没有官方的"Mapper4"这个术语。如果你是在谈论一个特定的库或框架中的"Mapper4",请提供更多的上下文信息,以便我能够给出准确的解释和例子。

然而,如果你是在谈论MyBatis中的Mapper,我可以给出一个具体的例子来解释它的作用和如何使用它。

### 例子:使用MyBatis的Mapper接口

假设我们有一个名为`User`的数据库表,它包含用户信息。我们想要创建一个Mapper接口来处理与这个表相关的数据库操作。

1. **创建Mapper接口**:

```java
package com.example.mapper;

import com.example.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM User")
    List<User> findAllUsers();
    
    @Select("SELECT * FROM User WHERE id = #{id}")
    User findUserById(int id);
    
    // 其他数据库操作方法...
}
```

在这个例子中,`UserMapper`接口定义了两个方法:`findAllUsers`用于查询所有用户,`findUserById`用于根据用户ID查询特定用户。方法中的`@Select`注解指定了要执行的SQL语句。

2. **创建对应的XML映射文件**(如果使用XML配置方式):

```xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findAllUsers" resultType="com.example.model.User">
        SELECT * FROM User
    </select>
    <select id="findUserById" parameterType="int" resultType="com.example.model.User">
        SELECT * FROM User WHERE id = #{id}
    </select>
    <!-- 其他SQL语句... -->
</mapper>
```

在这个XML映射文件中,我们定义了与`UserMapper`接口中方法相对应的SQL语句。`namespace`属性指定了Mapper接口的完全限定名,`id`属性对应方法名,`parameterType`属性指定了传入参数的类型,`resultType`属性指定了结果集的类型。

3. **在MyBatis配置文件中注册Mapper**:

```xml
<configuration>
    <!-- 注册Mapper接口 -->
    <mappers>
        <mapper class="com.example.mapper.UserMapper"/>
    </mappers>
</configuration>
```

注意:
 

在Spring Boot项目中,MyBatis的Mapper接口通常不需要显式注册,因为Spring Boot集成了MyBatis和Spring Boot的Starter,它会自动扫描并注册Mapper接口。这意味着,如果你遵循了Spring Boot的默认配置,你不需要手动在MyBatis配置文件中注册Mapper接口。

为了使Spring Boot自动扫描和注册Mapper接口,你需要确保以下几点:

1. 你的Mapper接口位于Spring Boot的组件扫描路径下。默认情况下,Spring Boot会扫描主应用程序类所在的包及其子包。

2. 你的Mapper接口使用了`@Mapper`注解。这个注解告诉Spring Data MyBatis,该接口应该被视为一个Mapper接口,因此应该被扫描并注册为一个Bean。

如果你需要自定义Mapper扫描路径或者不使用默认的注解驱动配置,你可以在Spring Boot的配置文件(如`application.properties`或`application.yml`)中指定Mapper接口的位置:

```properties
# application.properties
mybatis.mapper-locations=classpath:mapper/*.xml  # 如果你使用了XML映射文件
mybatis.type-aliases-package=com.example.model  # 实体类所在的包
mybatis.type-enums-package=com.example.enums  # 枚举类所在的包

# 或者使用Spring Boot的配置类
# @MapperScan("com.example.mapper")
```

如果你使用了XML映射文件,你可以指定XML文件的位置:

```properties
# application.properties
mybatis.mapper-locations=classpath:mapper/*.xml
```

在大多数情况下,当你遵循Spring Boot的默认规则时,你不需要在MyBatis配置文件中手动注册Mapper接口。Spring Boot会自动处理这些注册工作,让你能够更快速、更简便地开发应用程序。

4. **使用Mapper接口**:

在Spring Boot应用中,你可以通过注入Mapper接口来使用它:

```java
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> findAllUsers() {
        return userMapper.findAllUsers();
    }
    
    public User findUserById(int id) {
        return userMapper.findUserById(id);
    }
    
    // 其他业务方法...
}
```

在这个例子中,`UserService`服务类注入了`UserMapper`接口,并调用其方法来执行数据库操作。MyBatis会自动将接口方法调用转换为相应的SQL执行,并将结果映射回Java对象。




接下来介绍springboot中使用mybatis—plus:



 

MyBatis-Plus 是一个增强版的 MyBatis,它简化了 MyBatis 的使用,提供了更多的便利特性,如 ActiveRecord 模式、分页插件、代码生成器等。以下是在 Spring Boot 项目中使用 MyBatis-Plus 的一个具体例子,包括必要的代码和注释。

### 步骤 1: 添加 MyBatis-Plus 依赖

在 `pom.xml` 中添加 MyBatis-Plus 的依赖和数据库驱动依赖:

```xml
<dependencies>
    <!-- MyBatis-Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.x.x</version> <!-- 使用最新版本 -->
    </dependency>
    <!-- 数据库驱动,以 MySQL 为例 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>
```

### 步骤 2: 配置数据源

在 `application.properties` 或 `application.yml` 中配置数据库连接信息:

```properties
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# MyBatis-Plus 配置
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.example.model
mybatis-plus.global-config.db-config.id-type=auto
```

### 步骤 3: 创建实体类

创建一个实体类 `User`,它映射数据库中的 `users` 表:

```java
package com.example.model;

import com.baomidou.mybatisplus.annotation.TableName;

@TableName("users")
public class User {
    private Long id;
    private String username;
    private String email;
    // 省略构造函数、getter 和 setter
}
```

### 步骤 4: 创建 Mapper 接口

创建一个 Mapper 接口 `UserMapper`,MyBatis-Plus 会自动根据实体类和表名创建相应的 CRUD 方法:

```java
package com.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.model.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // MyBatis-Plus 会自动提供方法实现,无需手动编写
}

```

### 步骤 5: 使用 Mapper

在服务层或控制器中注入 `UserMapper` 并使用它:

```java
package com.example.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.model.User;
import com.example.mapper.UserMapper;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public List<User> findAllUsers() {
        return userMapper.selectList(new QueryWrapper<>());
    }
    
    public User findUserById(Long id) {
        return userMapper.selectById(id);
    }
    
    // 其他业务方法...
}
```

### 步骤 6: 运行和测试

现在,你可以运行 Spring Boot 应用程序并测试 `UserService` 中的方法是否按预期工作。例如,你可以创建一个控制器来处理 HTTP 请求并调用服务层的方法:

```java
package com.example.controller;

import com.example.model.User;
import com.example.service.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/")
    public List<User> getAllUsers() {
        return userService.findAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.findUserById(id);
    }
    
    // 其他API方法...
}
```

通过以上步骤,我们在 Spring Boot 项目中成功集成了 MyBatis-Plus,并创建了一个简单的用户管理功能。我们定义了一个 `User` 实体类,一个 `UserMapper` 接口来映射数据库操作,以及一个服务层 `UserService` 来封装业务逻辑。最后,我们创建了一个 `UserController` 来提供 HTTP API 供客户端调用。MyBatis-Plus 简化了许多常见操作,使得开发过程更加高效。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的使用Mybatis Plus函数的示例: 假设我们有一个表名为user,包含以下字段:id、name、age、email。 1. 首先,在pom.xml文件中添加Mybatis Plus的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>latest version</version> </dependency> ``` 2. 在Mapper接口中定义查询方法,例如根据年龄age查询: ``` import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserMapper extends BaseMapper<User> { List<User> selectByAge(@Param("age") Integer age); } ``` 3. 在Service实现类中调用函数查询方法,例如查询年龄大于20的用户: ``` import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.List; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public List<User> getByAge(Integer age) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.gt("age", age); // 使用Mybatis Plus的gt函数,查询年龄大于age的用户 List<User> userList = baseMapper.selectList(queryWrapper); return userList; } } ``` 这样就可以使用Mybatis Plus的函数查询数据了。除了gt函数,Mybatis Plus还提供了很多其他的函数,例如eq、ne、like、between等,具体可以参考官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tin9898

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

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

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

打赏作者

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

抵扣说明:

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

余额充值