MyBatis如何实现分页

文章目录

    • MyBatis分页方式对比
    • 使用数据库厂商提供的分页查询语句
    • 通过自定义 SQL 实现分页逻辑
      • 1. 使用 RowBounds 实现分页
      • 2. 使用 PageHelper 实现分页
    • 数组分页
    • 使用 MyBatis-Plus 进行分页
    • MyBatis物理分页和逻辑分页
    • MyBatis 手写一个 拦截器分页

在 MyBatis 中实现分页通常有两种方式:使用数据库厂商提供的分页查询语句(如 MySQL 的 LIMIT)或者通过自定义 SQL 来实现分页逻辑等

MyBatis分页方式对比

MyBatis提供了多种分页方式,每种方式都有其特定的应用场景和优缺点。以下是对MyBatis中几种常见分页方式的对比:

  1. 基于RowBounds的分页(逻辑分页):
    ○ 原理:执行完整的SQL查询,将结果集全部加载到内存中,然后根据RowBounds指定的偏移量和限制数进行分页处理。
    ○ 优点:减少IO次数,对于频繁访问且数据量较小的情况较为适合。
    ○ 缺点:当数据量非常大时,容易造成内存溢出,性能下降。
  2. 基于数据库的分页(物理分页):
    ○ 原理:在SQL查询语句中使用LIMIT和OFFSET关键字来实现分页,直接在数据库层面进行分页处理。
    ○ 优点:适用于大数据量的情况,避免了内存溢出的风险,性能较好。
    ○ 缺点:需要数据库支持LIMIT和OFFSET语法,不同数据库厂商的语法可能有所不同。
  3. 基于插件的分页:
    ○ 原理:MyBatis提供了插件机制,通过自定义插件来拦截SQL语句的执行,并在查询结果返回之前添加分页逻辑。
    ○ 优点:插件封装了分页的具体实现细节,使用起来简单方便,适用于多种分页需求。
    ○ 缺点:可能需要一定的开发成本来编写和维护插件。
  4. 数组分页:
    ○ 原理:首先查询出全部数据,然后在Java代码的List中截取需要的部分。
    ○ 优点:实现简单。
    ○ 缺点:当数据量很大时,会消耗大量内存,并可能导致性能问题。
    综上所述,选择哪种分页方式取决于具体的应用场景和数据量大小。对于小数据量或频繁访问的场景,逻辑分页(如RowBounds)可能是一个不错的选择。而对于大数据量或需要高效分页的场景,物理分页(如基于数据库的分页)或基于插件的分页可能更为合适。在实际应用中,还需要考虑数据库类型、系统性能、开发成本等因素来做出决策。

使用数据库厂商提供的分页查询语句

许多数据库厂商都提供了用于分页的特定语法,如 MySQL 的 LIMIT、Oracle 的 ROWNUM、SQL Server 的 OFFSET FETCH 等。你可以直接在 SQL 查询语句中使用这些语法来实现分页,然后将分页参数传递给 MyBatis 的方法即可。
示例(MySQL):

<select id="getUserList" resultType="User">SELECT * FROM usersLIMIT #{offset}, #{pageSize}
</select>
List<User> getUserList(@Param("offset") int offset, @Param("pageSize") int pageSize);

通过自定义 SQL 实现分页逻辑

如果你使用的数据库不支持特定的分页语法,或者想要更多灵活性,你可以通过自定义 SQL 实现分页逻辑。通常,你需要通过 RowBounds 或 PageHelper 来实现分页。

1. 使用 RowBounds 实现分页

原理:通过RowBounds实现分页和通过数组方式分页原理差不多,都是一次获取所有符合条件的数据,然后在内存中对大数据进行操作,实现分页效果。只是数组分页需要我们自己去实现分页逻辑,这里更加简化而已。
存在问题:一次性从数据库获取的数据可能会很多,对内存的消耗很大,可能导师性能变差,甚至引发内存溢出。
适用场景:在数据量很大的情况下,建议还是适用拦截器实现分页效果。RowBounds建议在数据量相对较小的情况下使用。
RowBounds分页是Mybatis提供的一种分页方式,其原理主要是在执行SQL查询后,将返回的所有结果集加载到内存中,然后在内存中根据指定的偏移量(offset)和限制数(limit)进行分页处理。
具体来说,当我们在Mybatis的Mapper接口中调用查询方法时,可以传入一个RowBounds对象作为参数。这个RowBounds对象包含了分页所需的信息,比如当前页码、每页显示的记录数等。在执行查询时,Mybatis会首先执行完整的SQL查询语句,获取到所有满足条件的结果集。然后,Mybatis会根据RowBounds对象中指定的偏移量和限制数,在内存中对这些结果集进行截取,从而得到当前页需要展示的数据。
需要注意的是,RowBounds分页方式是一种逻辑分页,即在内存中进行分页处理。当数据量非常大时,这种方式可能会导致内存溢出的问题。因此,对于大数据量的分页需求,建议使用物理分页方式,即在SQL查询语句中添加LIMIT和OFFSET子句,直接在数据库层面进行分页处理。
此外,Mybatis还提供了另一种分页插件PageHelper,它使用拦截器的方式实现了物理分页。PageHelper插件会在Mybatis执行SQL查询之前,自动根据传入的分页参数改写SQL语句,添加LIMIT和OFFSET子句,从而实现物理分页。这种方式可以更有效地处理大数据量的分页需求,避免内存溢出的问题。
List getUserList(RowBounds rowBounds);
RowBounds rowBounds = new RowBounds(offset, pageSize);
List users = sqlSession.selectList(“getUserList”, rowBounds);

2. 使用 PageHelper 实现分页

PageHelper的分页原理主要基于MyBatis的插件机制。具体来说,PageHelper内部实现了一个PageInterceptor拦截器,这个拦截器会在MyBatis执行SQL查询之前进行拦截。
当我们在代码中调用PageHelper的startPage方法时,它会在当前线程上下文中设置一个ThreadLocal变量,用于保存分页的参数,如当前页码、每页显示的数量等。
随后,当MyBatis执行SQL查询时,PageInterceptor拦截器会拦截到这一操作。拦截器会从ThreadLocal中获取到分页参数,并根据这些参数来改写原始的SQL语句,添加LIMIT和OFFSET子句,以实现分页查询。
改写后的SQL语句会被发送到数据库执行,数据库返回的结果集就是根据分页参数查询得到的结果。
最后,PageInterceptor拦截器会将ThreadLocal中的分页参数清除,避免对后续操作产生影响。
通过这种方式,PageHelper实现了对MyBatis查询结果的分页处理,而无需修改原有的SQL语句、Mapper接口和XML文件,因此具有无侵入性和易用性。同时,由于分页操作是在数据库层面进行的,因此也具有较高的性能。
需要注意的是,PageHelper使用了ThreadLocal来保存分页参数,因此分页参数是与线程绑定的,这意味着不同的线程之间不会共享分页参数,从而保证了分页的准确性和独立性。
总的来说,PageHelper通过拦截MyBatis的SQL查询操作,并在查询语句中添加LIMIT和OFFSET子句,实现了对查询结果的分页处理,从而简化了分页操作的实现过程,提高了开发效率。
PageHelper 是一个 MyBatis 的分页插件,可以简化分页操作。
首先,在 MyBatis 的配置文件中配置 PageHelper 插件:

<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/></plugin>
</plugins>
然后,在需要分页的查询方法中添加分页参数:
List<User> getUserList(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.getUserList(pageNum, pageSize);
这两种方式都可以实现分页查询,你可以根据实际需求选择合适的方式。

数组分页

使用数组进行分页通常意味着在数据库中获取所有数据,然后在应用程序中对数据进行分割和展示。这种方法在数据量较小且不频繁变化时比较适用,但在数据量较大时可能会影响性能。下面是一个简单的 Java 代码示例,演示如何使用数组进行分页:

import java.util.ArrayList;
import java.util.List;public class PaginationWithArrayExample {// 模拟从数据库中获取数据的方法,返回所有数据public List<String> fetchDataFromDatabase() {// 这里假设从数据库中获取了一些数据,实际情况根据需求修改List<String> dataList = new ArrayList<>();for (int i = 1; i <= 100; i++) {dataList.add("Data " + i);}return dataList;}// 根据页码和每页显示数量,从数据集中获取指定页的数据public List<String> getDataForPage(List<String> dataList, int pageNumber, int pageSize) {int startIndex = (pageNumber - 1) * pageSize;int endIndex = Math.min(startIndex + pageSize, dataList.size());if (startIndex >= endIndex) {return new ArrayList<>(); // 如果起始索引大于等于结束索引,返回空列表}return dataList.subList(startIndex, endIndex);}// 示例用法public static void main(String[] args) {PaginationWithArrayExample example = new PaginationWithArrayExample();List<String> dataList = example.fetchDataFromDatabase(); // 模拟从数据库中获取数据int pageNumber = 2; // 第2页int pageSize = 10; // 每页显示10条数据List<String> pageData = example.getDataForPage(dataList, pageNumber, pageSize);// 输出当前页的数据System.out.println("Page " + pageNumber + " data:");for (String data : pageData) {System.out.println(data);}}
}

在这个示例中,fetchDataFromDatabase 方法模拟从数据库中获取数据,返回一个包含了所有数据的列表。然后,getDataForPage 方法根据传入的页码和每页显示数量,从数据集中获取指定页的数据,返回一个包含了当前页数据的子列表。在示例的 main 方法中,演示了如何使用这两个方法来获取指定页的数据,并将其打印输出。

使用 MyBatis-Plus 进行分页

MyBatis-Plus进行分页的原理主要依赖于其内置的分页插件和Page对象。
首先,MyBatis-Plus提供了分页插件,该插件会在MyBatis执行SQL查询之前进行拦截。当使用MyBatis-Plus进行分页查询时,分页插件会自动识别分页相关的参数,并对原始的SQL语句进行改写,添加LIMIT和OFFSET子句,以实现物理分页。
其次,MyBatis-Plus中的Page对象用于表示分页信息。这个对象包含了当前页码、每页记录数、总记录数等信息。在进行分页查询时,可以通过传递Page对象给MyBatis-Plus的查询方法,来告诉MyBatis-Plus需要进行分页查询以及分页的具体参数。
当MyBatis-Plus执行分页查询时,它会根据Page对象中的信息生成对应的分页SQL语句,并通过数据库执行这个语句。数据库会根据LIMIT和OFFSET子句返回指定范围的结果集。
最后,MyBatis-Plus将查询结果封装到Page对象中,并返回给调用者。这个Page对象不仅包含了实际的查询结果列表,还包含了分页相关的信息,如总记录数、总页数等。这使得分页操作更加方便,同时也提高了代码的可维护性。
需要注意的是,MyBatis-Plus的分页实现是基于物理分页的,即直接在数据库层面进行分页处理,而不是在内存中处理。这种方式在处理大数据量时性能较好,避免了内存溢出的风险。
总结来说,MyBatis-Plus进行分页的原理是通过分页插件和Page对象来实现物理分页,通过在SQL语句中添加LIMIT和OFFSET子句来获取指定范围的结果集,并将结果封装到Page对象中返回给调用者。
MyBatis-Plus 是 MyBatis 的增强工具包,提供了很多便捷的功能,其中包括了分页功能。MyBatis-Plus 的分页功能可以轻松地实现物理分页,让分页操作变得更加简单。
首先,你需要在项目中引入 MyBatis-Plus 的依赖。在 Maven 项目中,你可以在 pom.xml 文件中添加如下依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>latest_version</version>
</dependency>

接下来,假设你有一个 UserMapper 接口,用于操作用户信息。你可以在该接口中直接定义分页查询的方法,无需额外编写 XML 映射文件。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;public interface UserMapper extends BaseMapper<User> {Page<User> selectUserPage(Page<User> page);
}

在该方法中,我们使用了 MyBatis-Plus 提供的 Page 类来实现分页。Page 类继承自 MyBatis 的 RowBounds 类,它除了包含分页信息外,还包含了分页查询返回的数据列表。
然后,你可以在 Service 层中调用这个方法来进行分页查询:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public Page<User> getUserPage(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);return userMapper.selectUserPage(page);}
}

在这个示例中,我们创建了一个新的 Page 对象,并传入了当前页码和每页显示数量。然后调用 selectUserPage 方法进行分页查询,并将结果返回。
最后,在 Controller 层中调用 Service 方法并将结果返回给前端即可完成分页查询的操作。

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users")public Page<User> getUserPage(@RequestParam(defaultValue = "1") int pageNum,@RequestParam(defaultValue = "10") int pageSize) {return userService.getUserPage(pageNum, pageSize);}
}

通过 MyBatis-Plus,你可以很方便地实现分页查询,而无需编写繁琐的 SQL 语句或者额外的 XML 映射文件。

MyBatis物理分页和逻辑分页

MyBatis中的物理分页和逻辑分页是两种不同的分页方式,它们在实现方式和性能上有显著的区别。
物理分页:
物理分页是在数据库层面上实现的分页,它依赖于数据库自身提供的分页功能。在MyBatis中,物理分页通常是通过在SQL语句中添加LIMIT和OFFSET子句来实现的。这种方式在查询数据库时,数据库会根据指定的偏移量和限制数直接返回分页后的结果,而不需要加载全部数据到内存中。因此,物理分页在处理大数据量时性能较好,避免了内存溢出的风险。然而,需要注意的是,不同的数据库可能具有不同的分页语法,因此在使用物理分页时需要考虑到数据库方言的问题。
逻辑分页:
逻辑分页则是在应用层面上实现的分页,它依赖于查询结果集。逻辑分页首先会查询出全部的数据,然后将这些数据加载到内存中,再根据分页要求筛选出合适的数据进行分页。这种方式在数据量较小时可能比较方便,但在处理大数据量时,会消耗大量的内存,并可能导致性能问题。因此,逻辑分页通常适用于数据量较小或对数据实时性要求不高的场景。
在实际应用中,选择物理分页还是逻辑分页需要根据具体的需求和场景来决定。对于大数据量或对数据性能要求较高的场景,建议使用物理分页以提高性能和避免内存溢出。而对于数据量较小或对数据实时性要求不高的场景,可以选择逻辑分页以简化实现过程。
此外,MyBatis还提供了分页插件如PageHelper来简化分页操作的实现。这些插件内部实现了物理分页的逻辑,使得开发者可以更方便地进行分页操作,而无需手动编写复杂的分页SQL语句。然而,在使用分页插件时,仍然需要注意插件的性能和兼容性等问题。

MyBatis 手写一个 拦截器分页

MyBatis 拦截器可以用于在 SQL 执行前后进行一些额外的处理,例如实现分页功能。下面我会给出一个简单的示例,包含了 DAO 层和业务层的代码。

假设你有一个 UserDao 接口,其中定义了获取用户列表的方法:
public interface UserDao {List<User> getUserList();
}
接下来,我们创建一个拦截器来实现分页功能:
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;import java.util.Properties;@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class PaginationInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object[] args = invocation.getArgs();MappedStatement mappedStatement = (MappedStatement) args[0];Object parameter = args[1];RowBounds rowBounds = (RowBounds) args[2];// 判断是否需要进行分页if (rowBounds != RowBounds.DEFAULT) {BoundSql boundSql = mappedStatement.getBoundSql(parameter);String sql = boundSql.getSql();// 自己实现分页逻辑,这里简单起见,直接拼接 LIMITsql += " LIMIT " + rowBounds.getOffset() + ", " + rowBounds.getLimit();BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), sql, boundSql.getParameterMappings(), boundSql.getParameterObject());MappedStatement newMappedStatement = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql));args[0] = newMappedStatement;args[2] = RowBounds.DEFAULT;}return invocation.proceed();}private MappedStatement copyFromMappedStatement(MappedStatement ms, BoundSqlSqlSource newSqlSource) {MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());builder.resource(ms.getResource());builder.fetchSize(ms.getFetchSize());builder.statementType(ms.getStatementType());builder.keyGenerator(ms.getKeyGenerator());builder.keyProperty(ms.getKeyProperty());builder.timeout(ms.getTimeout());builder.parameterMap(ms.getParameterMap());builder.resultMaps(ms.getResultMaps());builder.cache(ms.getCache());builder.flushCacheRequired(ms.isFlushCacheRequired());builder.useCache(ms.isUseCache());return builder.build();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {// 这里可以接收配置参数,但我们这里不需要配置参数}private static class BoundSqlSqlSource implements org.apache.ibatis.mapping.SqlSource {private final BoundSql boundSql;public BoundSqlSqlSource(BoundSql boundSql) {this.boundSql = boundSql;}@Overridepublic BoundSql getBoundSql(Object parameterObject) {return boundSql;}}
}然后,在你的 MyBatis 配置文件中配置该拦截器:<plugins><plugin interceptor="your.package.name.PaginationInterceptor"/>
</plugins>
最后,在业务代码中使用分页功能:
import org.apache.ibatis.session.RowBounds;public class UserService {private final UserDao userDao;public UserService(UserDao userDao) {this.userDao = userDao;}public List<User> getUsersByPage(int pageNum, int pageSize) {// 计算 offsetint offset = (pageNum - 1) * pageSize;// 使用 RowBounds 进行分页RowBounds rowBounds = new RowBounds(offset, pageSize);return userDao.getUserList(rowBounds);}
}

这样,当调用 getUsersByPage 方法时,会自动进行分页查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据恢复软件能不能恢复已经删除的监控视频

随着安防意识的日益增强&#xff0c;监控视频已成为众多场所不可或缺的安全保障。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了一些重要的监控视频。面对这种情况&#xff0c;许多人都会想到使用数据恢复软件来尝试找回这些丢失的视频。那么&#xff0c;数…

堆放砖块-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第47讲。 堆放砖块&#xf…

[xboard]real6410-3 S3C6410光盘资料与功能测试

文章目录 1 real6410官方资源1网盘分享2 镜像测试uboot烧录uboot信息应用功能测试2 ok6410a资源网盘分享3 友善6410资源网盘分享4 友坚网盘分享参考1 real6410官方资源 1网盘分享 real6410 v6.2 链

Redis 常用的基本命令

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

群联AI云防护中的防盗链技术原理及其作用探析---

一、引言 随着云计算和AI技术的快速发展&#xff0c;云防护方案已经成为现代企业防范网络攻击和保护数字资产的重要手段之一。群联科技作为存储解决方案和技术服务的领导者&#xff0c;已将其AI技术应用于云端防护系统中&#xff0c;并特别强化了防盗链功能&#xff0c;以帮助…

MQTT协议特点及数据包结构详解(值得珍藏)

点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》 1. 前言 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。 MQTT最大优点在…

SVD图像处理(MATLAB)

使用SVD处理图像模拟演示 参考文献 https://github.com/matzewolf/Image_compression_SVD/blob/master/svd_compress.m MATLAB代码 clc; clearvars; close all;A_orgimread("lena256.bmp"); compr20; A_orgdouble(A_org);A_red svd_compress( A_org, compr ); s…

Android 内存泄露与解决方案

内存泄漏原因 内存泄漏是指程序在申请内存后&#xff0c;无法被释放或归还给系统的现象。在Android中&#xff0c;内存泄漏导致的后果会使得应用Crash。 常见的内存泄漏场景有&#xff1a;全局集合类强引用没清理会造成内存泄漏(特别是static修饰的集合)、静态成员变量、单例…

yolov7的改进工地安全帽佩戴检测系统-协同双注意力机制CDAM2(教程+代码)

研究的背景和意义 随着工业化和城市化的快速发展&#xff0c;建筑工地的安全问题日益凸显。在建筑工地中&#xff0c;工人的安全是至关重要的&#xff0c;而工地安全帽的佩戴是保障工人安全的重要措施之一。然而&#xff0c;由于工地环境复杂多变&#xff0c;工人的佩戴情况往…

为什么企业都用企微文档?真的好用吗?

现在很多企业都在使用企微文档&#xff0c;还没开始使用的企业难免会产生疑惑&#xff0c;企微文档真的好用吗&#xff1f;其实企业选择使用企微文档的原因有很多&#xff0c;主要的原因是企微文档能够满足企业在文件管理和协作方面的多种需求&#xff0c;从而提高办公效率。 下…

未来客服行业的趋势与展望:构建更高效、个性化的客户体验

客服行业是商业领域中的重要组成部分&#xff0c;它直接影响着企业的品牌形象和客户满意度。随着科技的飞速发展&#xff0c;客服行业也正在经历深刻的变革。今天将描绘未来客服行业的发展趋势&#xff0c;帮助我们更好地理解这个行业的未来走向。 1. 人工智能和机器学习的广泛…

汽车充电桩主板在出厂前需要做哪些检测?

充电桩主板作为核心组件承载着充电桩的关键功能&#xff0c;其性能和稳定性直接影响着用户充电体验、桩企产品合规和市场竞争力&#xff0c;以及主板厂商的品牌知名度。因此&#xff0c;对充电桩主板进行全面的测试尤为重要。 下面将详细介绍充电桩主板检测的内容&#xff0c;包…

信息素养与终身学习解锁题目搜索之道的新引擎【文末送书】

文章目录 信息素养&#xff1a;搜索前的准备终身学习&#xff1a;搜索后的深化新引擎的构建与运行 搜索之道&#xff1a;信息素养与终身学习的新引擎【文末送书】 随着互联网的快速发展和信息技术的日益成熟&#xff0c;搜索已经成为获取知识和信息的主要途径之一。然而&#x…

STM32CubeIDE基础学习-舵机控制实验

STM32CubeIDE基础学习-舵机控制实验 文章目录 STM32CubeIDE基础学习-舵机控制实验前言第1章 硬件介绍第2章 工程配置2.1 基础工程配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 SG90、MG996舵机在机器人领域用得非常多&#xff0c;因为舵机有内置控制电…

基于51单片机的数字时钟与日历显示控制设计

**单片机设计介绍&#xff0c; 基于51单片机的数字时钟与日历显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的数字时钟与日历显示控制设计是一个结合了硬件与软件技术的综合性项目。以下是该设计的概要…

【AI 测试】二:数据结构理解之线性数据结构

** 数据结构理解** 线性数据结构 数组链表(单向链表、双向链表、循环链表)栈队列树形数据结构 二叉树AVL树红黑树B树B+树堆(二叉堆、斐波那契堆)图形数据结构 邻接矩阵邻接表概念 线性数据结构是一种简单且基础的数据组织形式,其中数据元素之间按照线性顺序进行排列。下面…

CentOS 7挂载命令详解

CentOS 7挂载命令详解 在CentOS 7系统中,挂载(Mount)是一个将文件系统连接到Linux系统目录结构的过程。通过挂载,用户能够访问存储设备(如硬盘分区、USB驱动器、CD-ROM等)上的数据。本文将详细介绍CentOS 7中的挂载命令及其选项和格式。 一、挂载命令的基本格式 在Cen…

SpringBoot中application.yml引入多个YML文件

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先,你要了解SpringBoot配置文件加载顺序,加载位置(代码内,Nacos等)…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

python制造虚拟姓名电话保存到mysql数据库

#启动命令:1、python test.py import os # 开始-需要安装的模块列表 #需要安装的库 libs ["requests","mysql-connector-python"] #循环遍历安装 for lib in libs:os.system("pip install -i https://pypi.tuna.tsinghua.edu.cn/simple " lib…