分页的实现方法&索引知识

目录

一. SpringBoot项目如何实现分页功能?

二、java中常用的分页插件有哪些

三、pageHelper分页原理及具体实现示例代码?

四、在MyBatis-Plus中如何实现自定义分页查询?

五、自定义排序在MyBatis-Plus中应该如何实现?

六、分页查询是否会影响查询性能?

 七、如何优化分页查询以提高性能?

八、对于数据库优化,除了分页查询外,还有哪些常见的策略?

九、什么是覆盖索引?

十、数据库设计范式

十一、为什么在某些情况下,会牺牲更高的范式以优化性能

十二、数据库表索引的分类?

十三、聚簇索引和非聚簇索引的区别?

十四、主键默认是聚簇索引吗?有没有例外?

十五、如何创建聚簇索引?


一. SpringBoot项目如何实现分页功能?

在Spring Boot项目中实现分页功能通常涉及到Spring Data JPA或者MyBatis Plus等库。这里以Spring Data JPA为例,展示一个简单的步骤:

  1. 添加Spring Data JPA和Web依赖: 在pom.xml文件中添加以下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  2. 创建实体类(Entity)和Repository接口: 假设有一个名为Book的实体类,我们可以创建一个继承自JpaRepository的接口BookRepository,Spring Data JPA会自动生成CRUD方法,包括分页方法。

    @Entity
    public class Book {
        // 实体属性...
    }
    
    public interface BookRepository extends JpaRepository<Book, Long> {
        // 默认提供了分页查询方法,例如:
        Page<Book> findAll(Pageable pageable);
    }
    
  3. 创建Controller: 在Controller中,我们处理HTTP请求并调用Repository的方法来获取分页数据。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class BookController {
    
        @Autowired
        private BookRepository bookRepository;
    
        @GetMapping("/books")
        public Page<Book> getBooks(@RequestParam(defaultValue = "0") int page,
                                    @RequestParam(defaultValue = "10") int size) {
            Pageable pageable = PageRequest.of(page, size);
            return bookRepository.findAll(pageable);
        }
    }
    
  4. 配置数据源: 在application.propertiesapplication.yml配置文件中设置数据源的相关信息。

  5. 运行并测试: 启动应用,访问 /books?page=0&size=10 来查看第一页的10条数据。更改参数值可查看不同页面和大小的数据。

二、java中常用的分页插件有哪些

在Java中,有几个常用的分页插件,可以方便地集成到各种框架中实现分页功能。以下是其中几个主流的分页插件:

  1. PageHelper:这是一个针对MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为MyBatis提供简单便捷的分页方式。它可以在不修改任何MyBatis代码的情况下直接使用。

  2. MyBatis-Plus (MP):MyBatis-Plus是一个MyBatis的扩展插件,简化开发,它提供了动态SQL、自动填充公共字段、分页等功能。它的分页功能是通过内置的AbstractMapper提供的,使用起来很简单。

  3. Spring Data JPA:Spring Data JPA 是 Spring 对 JPA 的支持,它为 CRUD 提供了一种统一的访问方式。Spring Data JPA 自带了对分页的支持,只需要通过 Pageable 接口就可以轻松实现分页。

  4. Hibernate:Hibernate 本身并没有内置分页功能,但可以通过 Criteria API 或者 HQL 中的 firstResult 和 maxResults 方法进行分页。

  5. Querydsl:Querydsl 是一个 Java 查询对象的框架,它可以用于构建静态类型安全的 SQL, JPQL, JDO 和 Criteria 查询。虽然它不是专门为分页设计的,但你可以利用它构建复杂的查询并结合分页API进行分页。

示例代码(使用 MyBatis-Plus 分页):

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import com.example.entity.User;
import com.example.mapper.UserMapper;

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

    public Page<User> getUserByPage(int currentPage, int pageSize) {
        Page<User> page = new Page<>(currentPage, pageSize);
        return userMapper.selectPage(page, null);
    }
}

三、pageHelper分页原理及具体实现示例代码?

PageHelper是MyBatis的一个插件,它实现了数据库的分页查询。其主要原理是在MyBatis的SqlSession执行查询之前,通过拦截器动态地添加分页的SQL语句和参数,使得返回的结果自动进行分页。

下面是一个使用PageHelper进行分页查询的具体实现示例:

(1)添加依赖: 在项目的pom.xml文件中添加PageHelper的依赖:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本号</version>
</dependency>

请替换最新版本号为实际可用的PageHelper版本。

(2)配置PageHelper: 在Spring配置文件(例如:applicationContext.xml)中配置PageHelper插件:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- ... -->
    <property name="plugins">
        <array>
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <value>
                        helperDialect=mysql
                       reasonable=true
                        supportMethodsArguments=true
                        params=count=countSql
                    </value>
                </property>
            </bean>
        </array>
    </property>
</bean>

或者在Spring Boot中,在application.properties中添加以下配置:

mybatis-plus-helper.pagehelper.helper-dialect=mysql
mybatis-plus-helper.pagehelper.reasonable=true
mybatis-plus-helper.pagehelper.support-methods-arguments=true
mybatis-plus-helper.pagehelper.params=count=countSql

(3)页面参数: 在前端页面传递页码(pageNum)和每页大小(pageSize)作为HTTP请求参数。

(4)Service和Mapper方法: 在Service层注入Mapper,并编写分页查询的方法:

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

    public PageInfo<User> getUserList(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize); // 开始分页
        List<User> users = userMapper.selectAll(); // 查询所有用户
        PageInfo<User> pageInfo = new PageInfo<>(users); // 封装分页信息
        return pageInfo;
    }
}

(5)Controller处理请求: 在Controller中接收参数并调用Service方法:

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public Result<PageInfo<User>> getUserList(@RequestParam int pageNum, @RequestParam int pageSize) {
        PageInfo<User> pageInfo = userService.getUserList(pageNum, pageSize);
        return Result.ok(pageInfo);
    }
}

至此,分页功能已完成。当用户访问 /users/list? pageNum=1&pageSize=10 时,会获取第一页,每页10条记录的用户列表。

四、在MyBatis-Plus中如何实现自定义分页查询?

在MyBatis-Plus中实现自定义分页查询可以遵循以下步骤:

1. 引入依赖:
确保你的项目已经引入了MyBatis-Plus的依赖,通常在pom.xml文件中添加如下代码:
   <dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-boot-starter</artifactId>
       <version>版本号</version>
   </dependency>

2. 创建实体类(Entity):
创建代表数据库表的实体类,并使用@TableId注解标记主键字段。

3. 创建Mapper接口:
定义一个继承自BaseMapper<T>的Mapper接口,T是你的实体类类型。例如:
   public interface UserMapper extends BaseMapper<User> {}

4. 创建Service类:
创建服务类,注入对应Mapper接口,并编写自定义分页查询的方法。通常会使用LambdaQueryWrapper来构建查询条件。例如:
   @Autowired
   private UserMapper userMapper;

   public IPage<User> getUserByCustomPage(Page<User> page) {
       LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
       // 添加自定义查询条件
       wrapper.eq(User::getName, "John");
       
       return userMapper.selectPage(page, wrapper);
   }

5. 页面请求处理:
在Controller层,接收用户的分页参数并调用Service中的方法。例如:
   @GetMapping("/users")
   public Result<Page<User>> getUsers(@RequestParam(defaultValue = "1") Integer pageNum,
                                      @RequestParam(defaultValue = "10") Integer pageSize) {
       Page<User> page = new Page<>(pageNum, pageSize);
       IPage<User> resultPage = userService.getUserByCustomPage(page);
       return Result.ok(resultPage);
   }

在这个例子中,Page对象包含了当前页数和每页大小,selectPage方法会执行分页查询并将结果返回给前端。

五、自定义排序在MyBatis-Plus中应该如何实现?

在MyBatis-Plus中实现自定义排序可以通过以下步骤:

  1. 在实体类(Entity)上使用@TableField注解指定排序字段:

    public class User {
        // ...
        @TableField(order = 1)
        private String name;
        @TableField(order = 2)
        private Integer age;
        // ...
    }
    

    order属性用于设置字段的排序优先级。

  2. 在Mapper接口中编写查询方法,使用@OrderBy注解指定排序方式:

    public interface UserMapper {
        List<User> selectUsersByOrder(@OrderBy("name asc, age desc") String condition);
    }
    

    @OrderBy注解指定了排序方式,如示例中的name asc, age desc表示先按名字升序排序,然后按年龄降序排序。

  3. 在Service类中调用Mapper接口:

    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        public List<User> getUsersByCustomOrder() {
            return userMapper.selectUsersByOrder(null); // 这里可以根据需要传入查询条件
        }
    }
    
  4. Controller层处理请求:

    @RestController
    public class UserController {
        @Autowired
        private UserService userService;
    
        @GetMapping("/users/custom-order")
        public Result<List<User>> getUsersByCustomOrder() {
            List<User> users = userService.getUsersByCustomOrder();
            return Result.ok(users);
        }
    }
    

现在,当调用getUsersByCustomOrder方法时,查询的结果将按照自定义的排序方式进行排序。

六、分页查询是否会影响查询性能?

分页查询确实可能影响查询性能,尤其是在数据量非常大的情况下。以下是几个关键点:

  1. 全表扫描:如果不使用索引,数据库可能需要遍历整个表来找到指定页的数据,这会导致全表扫描,效率低下。

  2. 索引利用:如果查询条件可以利用到索引,性能通常会更好。但分页查询可能导致索引部分覆盖,从而降低索引的利用率。

  3. 额外计算:分页查询时,数据库需要额外计算总行数(除非使用估算),这可能涉及多次查询或复杂计算。

  4. 内存消耗:对于大数据集,即使只是处理一部分数据,也可能占用大量内存,尤其是当结果被缓存或加载到内存中时。

  5. 数据库支持:不同的数据库系统对分页有不同的优化策略,比如MySQL的LIMIT/OFFSET语法可能会导致性能下降,而一些数据库支持更高效的窗口函数来实现分页。

综上所述,合理的分页策略(如限制最大返回行数、使用合适的索引等)有助于减少性能影响。但过度的大规模分页操作可能会导致显著的性能损耗。

 七、如何优化分页查询以提高性能?

优化分页查询的方法主要包括以下几个方面:

  1. 限制查询结果数量:避免一次性加载大量数据,通过设置合理的每页条数限制数据量。

  2. 利用索引:确保查询条件能利用到索引,避免全表扫描。特别是对于主键或唯一索引,分页效果最佳。

  3. 避免OFFSETOFFSET 会在MySQL等数据库中造成性能问题,因为它需要跳过很多行。考虑使用 ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) 窗口函数(PostgreSQL, SQL Server等支持)或者 LIMIT 与 ID 范围查询(例如,获取第n页数据时先找出前一页最后一个元素的ID)。

  4. 预估总数:如果不需要精确的总记录数,可以用估算方法代替实际计数,例如,查询一定比例的数据以近似估计。

  5. 缓存:对查询结果进行缓存,减轻数据库压力,但需注意数据一致性问题。

  6. 批量更新/删除:分批执行更新或删除操作,而不是一次性处理所有数据。

  7. 数据库特定优化:根据所使用的数据库系统,了解并利用其提供的特定优化手段。

八、对于数据库优化,除了分页查询外,还有哪些常见的策略?

数据库优化有多种策略,以下是其中一些常见的方式:

  1. 索引优化

    • 选择合适的索引类型(如B-Tree、Hash、全文索引)
    • 为常用查询字段创建索引
    • 避免在索引列上使用不等运算符和NULL值
    • 使用覆盖索引(Covering Indexes)
  2. 查询优化

    • 减少嵌套查询
    • 避免子查询,转为连接查询
    • 使用EXPLAIN分析SQL执行计划
    • 尽可能减少SELECT列的数量
  3. 存储优化

    • 数据归档和清理不再需要的数据
    • 合理设计表结构和数据类型
    • 利用分区表和分片提高大数据处理速度
  4. 配置优化

    • 根据服务器资源调整数据库参数
    • 内存分配合理化(如缓冲池大小)
    • 设置适当的并发连接数
  5. 数据库设计和规范化

    • 遵循数据库设计范式
    • 适当反规范化以提升性能
  6. 读写分离

    • 主从复制实现读写分离,降低主库压力
  7. 缓存策略

    • 使用Redis、Memcached等缓存系统
    • 在应用程序层面实现缓存
  8. 数据库维护

    • 定期做分析和重建索引
    • 保持数据库备份和恢复策略

九、什么是覆盖索引?

覆盖索引(Covering Index)是一种特殊的索引使用方式,它允许数据库引擎仅通过索引来完成查询,而无需回表到数据行获取信息。当索引包含了满足查询需求的所有列时,就称为覆盖索引。

覆盖索引的工作原理:

  1. 创建一个包含查询所需所有列的索引。
  2. 当查询执行时,数据库可以通过扫描该索引找到所需的数据,而不需要访问原始数据行。
  3. 这样可以显著减少I/O操作,提高查询效率。

示例: 假设有一个表employees,包含以下列:id(主键)、namesalarydepartment_id。如果经常有如下查询:

SELECT id, name FROM employees WHERE department_id = some_value;

在此情况下,我们可以创建一个包含department_idid, 和 name的复合索引。这样,查询就可以直接从这个索引中得到结果,而不需要访问主表。

十、数据库设计范式

数据库设计范式是数据库设计中的一系列规范,用于确保数据的逻辑结构合理、无冗余且易于维护。主要的数据库范式有以下几种:

  1. 第一范式(1NF,First Normal Form):

    • 数据表中的每一列都不可再分,即列值为原子性。
    • 确保每列都是单一属性,避免组合属性。
  2. 第二范式(2NF,Second Normal Form):

    • 已满足1NF。
    • 表格消除非关键列对部分关键列的依赖,即不存在部分函数依赖
    • 如果一个非主键字段完全依赖于整个主键,则符合2NF。
  3. 第三范式(3NF,Third Normal Form):

    • 已满足2NF。
    • 消除非关键列之间的传递函数依赖。
    • 即如果A依赖于B,B又依赖于C,那么A间接依赖于C,需要将A与C的关系独立出来。
  4. BCNF(Boyce-Codd Normal Form):

    • 基于第三范式,解决了3NF中可能出现的关键字选择不当导致的问题。
    • 任何非平凡的函数依赖X → Y,其中X和Y都不包含超键,X必须是超键。
  5. 第四范式(4NF,Fourth Normal Form):

    • 已满足BCNF。
    • 避免多值依赖,即消除多对多关系引起的冗余。
  6. 第五范式(5NF,Project-Join Normal Form 或 Prime Attribute Normal Form):

    • 最高级别的范式,更专业,较少提及,在实际应用中并不常见。

数据库设计范式举例说明

数据库设计范式是规范数据库结构的一种方法,目的是消除冗余数据和依赖关系,以提高数据的一致性、减少更新异常和插入异常。以下是几个常见的数据库设计范式,以及简单的例子来解释它们:

  1. 第一范式(1NF):确保每个字段都原子化,不可再分。这意味着表格的每一列都只能包含单一的值,而不能是一个列表或其他复合数据类型。

    例子:一个“员工”表原本有一个“联系方式”列,包含电话和邮箱,不符合1NF。改设计后,分为两个单独的列:“联系电话”和“电子邮箱”。

  2. 第二范式(2NF):满足1NF,并且没有部分函数依赖。即所有非主键列完全依赖于整个主键,而不是主键的一部分。

    例子:假设有一个“订单详情”表,主键是“订单ID”,还有一个“产品ID”。如果还有“产品类别”列,它实际上依赖于“产品ID”,而非整个主键,应将其移至另一个关联的“产品”表。

  3. 第三范式(3NF):满足2NF,并且没有传递函数依赖。这意味着除了主键以外,其他任何列都不能基于其他非主键列的值来决定。

    例子:继续“订单详情”表的例子,如果有“供应商ID”列,但它可以通过“产品ID”推断出来,那么应该将“供应商ID”移动到“产品”表,使得“订单详情”表只包含与订单直接相关的数据。

  4. 第四范式(4NF):满足3NF,并消除了多值依赖。它针对的是那些包含多重键值对的表。

    这个范式在实践中相对少见,因为达到3NF通常已经足够处理大部分关系数据库设计。

  5. 第五范式(5NF,也称为投影-连接范式,PJ/NF):数据仅依赖于原始数据,不存在任何依赖于派生数据的情况。涉及更复杂的关系理论,通常用于非常特定的情况。

    这个范式不是所有的数据库设计都需要达到的,因为它可能会导致过度正常化的表格,增加了查询的复杂性。

十一、为什么在某些情况下,会牺牲更高的范式以优化性能

在数据库设计中,更高的范式通常意味着更低的数据冗余和更高的数据一致性。然而,在某些情况下,我们可能会牺牲更高的范式来优化性能,原因包括:

  1. 减少联接操作:更高范式的表格可能导致更多的联接操作来获取完整信息。这会增加查询复杂性和时间,尤其是在大数据量时。

  2. 提高查询速度:通过适当的数据冗余,可以避免复杂的联接,从而加快查询速度。例如,创建汇总表存储计算好的统计数据,以提高报告查询效率。

  3. 简化更新过程:在一些场景下,为了保证数据一致性,需要复杂的触发器和业务逻辑。适当的数据冗余可能使更新操作更为简单直接。

  4. 空间和磁盘I/O优化:虽然更高的范式减少了冗余,但有时存储优化比减少冗余更重要,特别是在存储成本较低或者I/O性能瓶颈的情况下。

  5. 读写比例:对于读取密集型的应用,优化读取性能可能优先于防止数据不一致。在这些情况下,牺牲一定的规范化可能是合理的。

十二、数据库表索引的分类?

数据库表索引的主要分类包括以下几种:

  1. 唯一索引(Unique Index):保证索引项的唯一性,不允许有重复的值。一个表可以有多个唯一索引,但主键索引必须是唯一的。

  2. 主键索引(Primary Key Index):是一种特殊的唯一索引,用于标识表中的每一条记录。一张表只有一个主键,主键索引不允许有NULL值。

  3. 聚簇索引(Clustered Index):决定了数据行在磁盘上的物理存储顺序。一个表只能有一个聚簇索引,因为数据本身已经按照这个索引的顺序排列。

  4. 非聚簇索引(Non-clustered Index):索引项独立于数据行的物理存储顺序,非聚簇索引的叶子节点保存了指向实际数据行的指针。

  5. 复合索引(Composite Index):由多个列组成,索引的排序基于这些列的组合。

  6. 覆盖索引(Covering Index):索引包含了SQL查询所需要的所有列,这样查询可以直接从索引中获取数据,而不需要回表查找。

  7. 全文索引(Full-text Index):用于全文搜索,支持对文本数据进行模糊匹配和关键词检索。

  8. 空间索引(Spatial Index):用于地理空间数据,加速对地理位置的查询。

  9. 位图索引(Bitmap Index):在数据稀疏时使用,用位图表示索引项的值,适合用于多值列或者低选择性的场景。

十三、聚簇索引和非聚簇索引的区别?

以下是聚簇索引和非聚簇索引的关键区别:

数据存储方式:

  • 聚簇索引:数据行的物理存储顺序与索引顺序相同。这意味着一个表只能有一个聚簇索引,因为它定义了数据的实际布局。
  • 非聚簇索引:索引结构独立于数据行的物理存储顺序。非聚簇索引的叶子节点通常包含指向数据行的指针。

存储效率:

  • 聚簇索引:由于数据按索引顺序存储,对于范围查询可能更快,但插入速度可能会慢,尤其是当新数据需要被移到已有数据之后时。
  • 非聚簇索引:插入速度快,因为无需移动已有的数据行,但查询效率取决于是否能直接使用索引还是需要回表查找。

索引结构:

  • 聚簇索引:索引的叶子节点就是数据行。
  • 非聚簇索引:索引的叶子节点通常包含键值和对应的行位置指示器。

索引类型限制:

  • 聚簇索引:一张表只能有一个聚簇索引,因为数据行的物理存储顺序不能有两个版本。
  • 非聚簇索引:同一张表上可以有多个非聚簇索引。

表行为影响:

  • 聚簇索引:更新索引字段时可能导致整行移动,影响性能。
  • 非聚簇索引:更新索引字段通常只影响索引,不会移动数据行。

十四、主键默认是聚簇索引吗?有没有例外?

在关系型数据库中,主键通常会创建一个唯一且非空的索引,但这并不意味着主键默认就是聚簇索引。是否为主键建立聚簇索引取决于数据库管理系统(DBMS)的具体设计和配置。例如:

  • 在MySQL的InnoDB引擎中,主键默认是聚簇索引,数据行按照主键的值存储。
  • 而在Oracle中,没有明确的"聚簇索引"概念,但是有一个类似于主键聚簇的功能,可以通过创建CLUSTERED INDEX来实现。
  • SQL Server也允许选择是否将主键作为聚簇索引,如果不指定,系统可能会选择一个非聚簇索。

十五、如何创建聚簇索引?

创建聚簇索引的过程通常涉及数据库管理系统(DBMS)和SQL语句。以下是创建聚簇索引的基本步骤,以MySQL为例:

1)选择要索引的表:首先,你需要确定要在哪个表上创建聚簇索引。假设我们有一个名为Employees的表。

CREATE TABLE Employees (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    Department VARCHAR(50),
    Salary DECIMAL(10,2)
);

在这个例子中,ID是默认的主键,但还没有定义为聚簇索引。

2)创建聚簇索引:使用ALTER TABLE命令并指定CLUSTERED关键字来创建聚簇索引。请注意,一个表只能有一个聚簇索引。

ALTER TABLE Employees 
MODIFY COLUMN ID INT PRIMARY KEY CLUSTERED;

在这个例子中,我们改变了ID列的定义,使其成为聚簇索引。现在,表中的数据将按照ID列的值排序和存储。

相关推荐

  1. 实现方法&索引知识

    2024-04-13 08:46:07       19 阅读
  2. mysql原理、php实现

    2024-04-13 08:46:07       39 阅读
  3. 使用Redis LIst 实现数据库快速查询方法

    2024-04-13 08:46:07       32 阅读
  4. 5-实现

    2024-04-13 08:46:07       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-13 08:46:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-13 08:46:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 08:46:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 08:46:07       20 阅读

热门阅读

  1. 打包 docker 容器镜像到另一台电脑

    2024-04-13 08:46:07       14 阅读
  2. 解锁区块链技术的潜力:实现智能合约与DApps

    2024-04-13 08:46:07       19 阅读
  3. C++常考面试题(第一篇)

    2024-04-13 08:46:07       35 阅读
  4. K8S Deployment HA以及详细使用介绍

    2024-04-13 08:46:07       14 阅读
  5. 【回溯】Leetcode 39. 组合总和【中等】

    2024-04-13 08:46:07       18 阅读
  6. 蓝桥杯---数组分割

    2024-04-13 08:46:07       21 阅读
  7. 蓝桥杯考前准备— — c/c++

    2024-04-13 08:46:07       16 阅读
  8. 数据库:SQL分类之DML详解

    2024-04-13 08:46:07       17 阅读
  9. Scanner类的使用步骤

    2024-04-13 08:46:07       16 阅读