从零开始搭建一个SpringBoot项目

目录

  • Spring Boot
    • Spring Boot 项目开发环境
      • 1、快速创建SpringBoot项目
      • 2、pom.xml 添加 Meavn 依赖
      • 3、配置application.yml
      • 4、验证数据库是否连接成功
      • 5、配置 Druid 数据源
    • Spring Boot 整合 MyBatis
      • 1、准备依赖
      • 2、application-dev.yml 配置
      • 3、启动类添加Mapper接口扫描器
      • 4、设置日志log
      • 5、实现 MyBatis 进行增删改查操作
        • 1、数据库创建表格
        • 2、新建实体类和 Mapper 接口
        • 3、创建 Mapper 接口的映射文件
        • 4、新建 UserController
        • 5、功能测试
    • Spring Boot 整合 Lombok
    • Spring Boot 整合 Swagger
      • 1、添加依赖文件
      • 2、创建 Swagger 配置类
      • 3、Swagger 接口测试
    • 接口参数处理和统一响应结果
    • 接口参数处理和统一响应结果

Spring Boot

Spring Boot 项目开发环境

1、快速创建SpringBoot项目

1、打开idea 选择 File => New => Project 选中 Spring Boot 快速创建。

如果是创建JAVA8 需要把 Server URL 地址修改为 阿里云地址 https://start.aliyun.com

在这里插入图片描述
2、Dependencies 依赖 可以直接在这里先勾选,但我们先不选后面通过pom.xml Maven加载
在这里插入图片描述
3、创建后的项目结构如下
在这里插入图片描述

2、pom.xml 添加 Meavn 依赖

1、添加 spring-boot-start-web
使用SpringMVC构建web(包括RESTful)应用程序。使用Apache Tomcat作为默认的嵌入式容器。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

运行项目后,浏览器输入localhost:8080 Web服务正常
在这里插入图片描述
2、添加 Lambok 依赖
Lombok依赖可在编译时,自动添加JavaBean结构。例如常用的getter、setter、toString、构造器和equals等方法。

<!-- lombok 依赖 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

3、单元测试
对单元测试的支持在于提供了一系列注解和工具的集成

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

4、数据库连接依赖

 <!-- mysql驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.14</version></dependency><!-- JDBC数据库连接 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>

3、配置application.yml

将默认 application.properties 修改为 application.yml 添加配置更加直观
在这里插入图片描述
在这里插入图片描述

# application.yml
spring:application:name: SpringBootDemoprofiles:# 使用 application-dev.yml 配置文件启动项目active: dev
# application-dev.yml
spring:datasource:url: jdbc:mysql://localhost:3306/springboot_db?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: Hu903157935
server:# 修改启动端口号port: 8080

4、验证数据库是否连接成功

在这里插入图片描述

// ApplicationTests.java 
package com.learning.springbootdemo;import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;@SpringBootTest
public class ApplicationTests {// 注入数据源对象@Resourceprivate DataSource dataSource;@Testpublic void dataSourceTest() throws SQLException {System.out.println("==============================================================");// 获取数据源类型System.out.println("默认数据源为:" + dataSource.getClass());// 获取数据库连接对象Connection connection = dataSource.getConnection();// 判断连接对象是否为空System.out.println(connection != null);assert connection != null;connection.close();}
}

5、配置 Druid 数据源

默认数据源-Hikari
在springboot2.0之后 , 采用的默认连接池就是Hikari, 号称"史上最快的连接池", 所以我们没有添加依赖也能直接用, springboot的自动配置中含有DataSourceAutoConfiguration配置类, 会先检查容器中是否已经有连接池对象, 没有则会使用默认的连接池, 并根据特定的属性来自动配置连接池对象, 用到的属性值来源于DataSourceProperties对象。

需要添加依赖和配置yml 此时加的是Druid的springboot自动配置包, 里面包含了DruidDataSourceAutoConfigure自动配置类,会自动创建druid的连接池对象, 所以springboot发现已经有连接池对象了,则不会再使用Hikari。(前面配置了,没有自行添加)

<!-- pom.xml -->
<!-- druid -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.14</version>
</dependency>
# application-dev.yml
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource

Spring Boot 整合 MyBatis

1、准备依赖

<!--mybatis集成到SpringBoot中的依赖-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

2、application-dev.yml 配置

Spring Boot 整合 MyBatis 时几个比较需要注意的配置参数:

mybatis.config-location配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性,如果项目中配置了 mybatis-config.xml文件需要设置该参数。mybatis.mapper-locations配置 Mapper 文件对应的 XML 文件路径。mybatis.type-aliases-package配置项目中实体类包路径

我们只配置 mapper-locations 即可,最终的 application-dev.yml文件如下:

mybatis:
#  config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*Dao.xml
#  type-aliases-package: com.learning.springboot.springbootdemo

3、启动类添加Mapper接口扫描器

在启动类中添加对 Mapper 包扫描 @MapperScan,Spring Boot 启动的时候会自动加载包路径下的 Mapper 接口:

@SpringBootApplication
@MapperScan("com.learning.springbootdemo.dao") // 添加 @Mapper 注解
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}
}

当然也可以直接在每个 Mapper 接口上面添加 @Mapper 注解,但是如果 Mapper 接口数量较多,在每个 Mapper 加注解是挺繁琐的,建议使用扫描注解。

4、设置日志log

logging:level: root: infofile:name:springboot-site.log

5、实现 MyBatis 进行增删改查操作

1、数据库创建表格

首先创建了springboot_db 的数据库,之后在数据库中新建了一个名称为 tb_user 的数据表,表中有 id , name , password 三个字段,在测试时可以直接将以上 SQL 拷贝到 MySQL 中执行即可。

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `springboot_db` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `springboot_db`;
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '登录名',`password` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '密码',PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2、新建实体类和 Mapper 接口

1、在 entity 包下新建 User 类,将 tb_user 中的字段映射到该实体类中:

package com.learning.springbootdemo.entity;public class User {private Integer id;private String name;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

2、在 dao 包中新建 UserDao 接口,并定义增删改查四个接口:

package com.learning.springbootdemo.dao;import com.learning.springbootdemo.entity.User;import java.util.List;public interface UserDao {/*** 返回数据列表*/List<User> findAllUsers();/*** 添加*/int insertUser(User User);/*** 修改*/int updUser(User User);/*** 删除*/int delUser(Integer id);
}
3、创建 Mapper 接口的映射文件

在 resources/mapper 目录下新建 Mapper 接口的映射文件 UserDao.xml,之后进行映射文件的编写。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 配置文件头 不加会报错 文档根元素 "mapper" 必须匹配 DOCTYPE"null"-->
<!-- 1、首先,定义映射文件与 Mapper 接口的对应关系,比如该示例中,需要将 UserDao.xml 的与对应的 UserDao 接口类之间的关系定义出来: -->
<mapper namespace="com.learning.springbootdemo.dao.UserDao"><!-- 2、配置表结构和实体类的对应关系:--><resultMap type="com.learning.springbootdemo.entity.User" id="UserResult"><result property="id" column="id"/><result property="name" column="name"/><result property="password" column="password"/></resultMap><!-- 3、针对对应的接口方法,编写具体的 SQL 语句,最终的 UserDao.xml 文件如下: --><select id="findAllUsers" resultMap="UserResult">select id,name,password from tb_userorder by id desc</select><insert id="insertUser" parameterType="com.learning.springbootdemo.entity.User">insert into tb_user(name,password)values(#{name},#{password})</insert><update id="updUser" parameterType="com.learning.springbootdemo.entity.User">update tb_usersetname=#{name},password=#{password}where id=#{id}</update><delete id="delUser" parameterType="int">delete from tb_user where id=#{id}</delete>
</mapper>
4、新建 UserController

为了对 MyBatis 进行功能测试,在 controller 包下新建 UserController 类,并新增 4 个方法分别接收对于 tb_user 表的增删改查请求,代码如下:

package com.learning.springbootdemo.controller;import com.alibaba.druid.util.StringUtils;
import com.learning.springbootdemo.dao.UserDao;
import com.learning.springbootdemo.entity.User;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class UserController {@ResourceUserDao userDao;// 查询所有记录@GetMapping("/users/mybatis/queryAll")public List<User> queryAll() {return userDao.findAllUsers();}// 新增一条记录@GetMapping("/users/mybatis/insert")public Boolean insert(String name, String password) {if (StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {return false;}User user = new User();user.setName(name);user.setPassword(password);return userDao.insertUser(user) > 0;}// 修改一条记录@GetMapping("/users/mybatis/update")public Boolean insert(Integer id, String name, String password) {if (id == null || id < 1 || StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {return false;}User user = new User();user.setId(id);user.setName(name);user.setPassword(password);return userDao.updUser(user) > 0;}// 删除一条记录@GetMapping("/users/mybatis/delete")public Boolean insert(Integer id) {if (id == null || id < 1) {return false;}return userDao.delUser(id) > 0;}
}
5、功能测试

1、启动 Spring Boot 项目
2、浏览器输入测试地址

查询:http://localhost:8080/users/mybatis/queryAll
新增:http://localhost:8080/users/mybatis/insert?name=mybatis1&password=1233333
修改:http://localhost:8080/users/mybatis/update?id=3&name=mybatis2&password=1233222
删除:http://localhost:8080/users/mybatis/delete?id=3

Spring Boot 整合 Lombok

Lombok 项目是一个第三方的 Java 工具库,它会自动插入编辑器和构建工具中,Lombok 提供了一组非常有用的注释,用来消除 Java 类中的大量样板代码,比如 setter getter 方法、构造方法等等, 仅仅在原来的 JavaBean 类上使用 @Data 注解就可以替换数百行代码从而使代码变得更加清爽、简洁且易于维护。

注意:Lombok 它并不是一个必要的插件。暂时先跳过。

Spring Boot 整合 Swagger

Swagger 是一款 RESTful 接口的文档在线自动生成+功能测试功能软件

它可以轻松的整合到 Spring Boot 中并生成 RESTful API 文档,既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明,另外 Swagger 也提供了强大的页面测试功能来调试每个 API 接口。

1、添加依赖文件

首先,在 pom.xml 中加入 Swagger 的依赖信息,如下:

<!-- swagger --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version></dependency>

2、创建 Swagger 配置类

新建 config 包,在 config 包中新增 Swagger2Config.java,代码如下:

package com.learning.springbootdemo.config;import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SpringDocConfig {// 扫描路径private static final String basePackage = "com.learning.springbootdemo.controller";// 请求头名称private static final String headerName = "token";@Beanpublic GroupedOpenApi group01() {return GroupedOpenApi.builder().group("group01").addOperationCustomizer((operation, handlerMethod) -> {operation.addSecurityItem(new SecurityRequirement().addList(headerName));return operation;}).packagesToScan(basePackage).build();}@Beanpublic OpenAPI customOpenAPI() {Components components = new Components();//添加右上角的统一安全认证components.addSecuritySchemes(headerName,new SecurityScheme().type(SecurityScheme.Type.APIKEY).scheme("basic").name(headerName).in(SecurityScheme.In.HEADER).description("请求头"));return new OpenAPI().components(components).info(apiInfo());}private Info apiInfo() {Contact contact = new Contact();contact.setName("Wannaer");return new Info().title("Swagger文档").version("1.0").contact(contact).license(new License().name("Apache 2.0").url("http://springdoc.org"));}
}

group01() 方法用于返回生成 Swagger API 时的接口摘要信息,也是在该方法中指定需要扫描的控制器包路径,只有此路径下的 Controller 类才会自动生成 Swagger API 文档。如果想要根据不同的包对 API 文档进行分组,可以配置多个 GroupedOpenApi 实例,比如再写一个方法 group02,扫描的包是 cn.lanqiao.springboot3.controller2。

apiInfo() 方法中主要是配置一些基础信息,包括配置页面展示的基本信息包括,标题、描述、版本、服务条款、联系方式等。

配置完成之后启动项目,在浏览器中输入网址 /swagger-ui/index.html,即可看到 Swagger 页面,效果如下:
在这里插入图片描述
此时只有基础的配置信息,并没有文档信息,接下来我们需要在我们的 Controller 类。

@Tag(name = "用户模块接口")
@RestController
public class UserController {// 查询所有记录@Operation(summary = "查询所有记录")@GetMapping("/users/mybatis/queryAll")public List<User> queryAll() {return userDao.findAllUsers();}
}

在项目启动成功后,查看swagger接口文档页面 包括参数信息、请求方法、注意事项等等我们已经在代码中定义的信息都会在接口文档中显示。
在这里插入图片描述

// 完整 UserController 代码
package com.learning.springbootdemo.controller;import com.alibaba.druid.util.StringUtils;
import com.learning.springbootdemo.dao.UserDao;
import com.learning.springbootdemo.entity.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@Tag(name = "用户模块接口")
@RestController
public class UserController {@ResourceUserDao userDao;// 查询所有记录@Operation(summary = "查询所有记录")@GetMapping("/users/mybatis/queryAll")public List<User> queryAll() {return userDao.findAllUsers();}// 新增一条记录@Operation(summary = "新增用户", description = "根据User对象新增用户")@GetMapping("/users/mybatis/insert")public Boolean insert(String name, String password) {if (StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {return false;}User user = new User();user.setName(name);user.setPassword(password);return userDao.insertUser(user) > 0;}// 修改一条记录@GetMapping("/users/mybatis/update")public Boolean insert(Integer id, String name, String password) {if (id == null || id < 1 || StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {return false;}User user = new User();user.setId(id);user.setName(name);user.setPassword(password);return userDao.updUser(user) > 0;}// 删除一条记录@GetMapping("/users/mybatis/delete")public Boolean insert(Integer id) {if (id == null || id < 1) {return false;}return userDao.delUser(id) > 0;}
}

3、Swagger 接口测试

首先我们点进列表接口,接口的右上方有 Try it out 按钮,点击它来尝试发送请求。
在这里插入图片描述
之后页面上会出现 Execute 按钮,点击它之后会实际的向后端发送用户列表请求,请求成功后可以在页面中看到请求信息,以及返回数据,在 Response body 信息框中我们可以看到两条用户数据,接口请求成功且数据如预期中的数据一致,证明这个接口是没有问题的,结果如下图所示。
在这里插入图片描述

接口参数处理和统一响应结果

关于传参的规范和返回结果的统一,尽可能的使得控制层业务层处理的数据格式统一化,保证了接口和编码规范的统一性。
规范的参数定义和结果响应极大程度的降低了开发成本及沟通成本。

接口参数处理和统一响应结果

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

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

相关文章

BWVS 靶场测试

一、PHP弱类型 is_numeric() 输入&#xff1a;127.0.0.1/BWVS/bug/php/code.php # 1、源代码分析 如果num不是数字&#xff0c;那么就输出num&#xff0c;同时如果num1&#xff0c;就输出flag。即num要是字符串又要是数字 # 2、函数分析&#xff1a; is_numeric()函数&…

《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 各种自动化框架都会有脚本录制功能&#xff0c; playwright这么牛叉当然也不例外。很早之前的selenium、Jmeter工具&#xff0c;发展到每种浏览器都有对应的录制插件。今天我们…

牛客NC392 参加会议的最大数目【中等 贪心+小顶堆 Java/Go/PHP 力扣1353】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651 https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/description/ 思路 贪心优先级队列Java代码 import java.util.*;public class Solution {/**…

java面试高级篇(JVM、Mysql、Redis、Kafka)

文章目录 面试专题-java高级篇1. JVM有做过jvm的调优吗?常用的jvm参数调优有哪些?如果jvm持续一段时间频繁的发生Young GC (轻GC) 可能原因有哪些? 2. Mysql2.1. 基本功(见为知笔记)2.2. 什么是索引2.3. 索引的优劣势2.4. MySQL的索引结构2.4.1. B-Tree索引2.4.2. BTree索引…

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天&#xff0c;小编将详细介绍外卖系统源码的开发全攻略&#xff0c;从需求分析到设计与实现&#xff0c;为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心&#xff0c;需满足以下基本需求&#xff1a; -浏览菜单并下单 -实时追踪订单 -多种支付方…

每日一题——博弈论(枚举与暴力)

博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…

ESP32烧录AT固件并进行MQTT通讯

首先下载AT固件 发布的固件 - ESP32 - — ESP-AT 用户指南 latest 文档 下载烧录工具 下载指导 - ESP32 - — ESP-AT 用户指南 latest 文档 烧录后注意usb的串口是不能发AT指令的 需要用16和17脚 用AT指令确认OK后连WIFI ATCWMODE1 //设置客户端模式 ATCWLAP …

mysql误删后使用binlog恢复数据

1 预期效果 使用 binlog 恢复数据的预期效果是将误删的数据还原到误删之前的状态&#xff0c;以减少或消除数据丢失的影响。通过正确解析和执行 binlog 中的操作记录&#xff0c;可以重新执行误删操作之后的插入、更新或删除操作&#xff0c;从而恢复被误删的数据。 数据恢复&…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

springboot+mysql在线考试系统-计算机毕业设计源码82584

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…

Websocket助手

功能介绍 WS助手是WebSocket调试的开发工具&#xff0c;该客户端工具可以帮助开发人员快速连接到测试/生产环境&#xff0c;它可以帮助您监视和分析 Websocket 消息&#xff0c;并在开发过程中解决问题&#xff1b;可以模拟客户端实现与服务器的数据交互&#xff0c;并完成批量…

论文精读:HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face

HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in Hugging Face Status: Reading Author: Dongsheng Li, Kaitao Song, Weiming Lu, Xu Tan, Yongliang Shen, Yueting Zhuang Institution: 微软亚洲研究院&#xff08;Microsoft Research Asia&#xff09;, 浙江…

uniapp 对接 微信App/支付宝App 支付

相关文档&#xff1a;uni.requestPayment(OBJECT) | uni-app官网 示例代码&#xff1a; import qs from qsasync aliPay(){const { provider } await uni.getProvider({ service:payment })if(provider.includes(alipay)){uni.request({url:后端接口地址,data:{ //传参 },suc…

⌈ 传知代码 ⌋ 基于扩散模型的无载体图像隐写术

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

前端---闭包【防抖以及节流】----面试高频!

1.什么闭包 释放闭包 从以上看出&#xff1a;一般函数调用一次会把内部的数据进行清除--但是这种操作却可以一起保留局部作用域的数据 // 优点:1、可以读取函数内部的变量 2、让这些变量始中存在局部作用域当中 2.闭包产生的两种业务场景&#xff1a;防抖、节流 2.1防抖 举…

QGraphicsView实现简易地图16『爆炸效果』

前文链接&#xff1a;QGraphicsView实现简易地图15『测量面积』 一种简单的爆炸波扩散效果 动态演示效果&#xff1a; 静态展示图片&#xff1a; 核心代码&#xff1a; #pragma once #include "../AbstractGeoItem.h" #include "DataStruct/GeoData.h"…

sysbench压测mysql性能测试命令和报告

sysbench压测mysql性能测试命令和报告 一、安装sysbench工具二、创建测试数据库三、基于sysbench构造测试表和测试数据四、数据库性能测试1、数据库读写性能测试2、数据库读性能测试3、数据库删除性能测试4、数据库更新索引字段性能测5、数据库更新非索引字段性能测试6、数据库…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

十、通配符和正则表达式

10.1 通配符 通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符 时&#xff0c;shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配&#xff1a;若符合要求的匹配存在&#xff0c;则进 行代换(路径扩展)&#xff1b;否则就将该通配…

Qt for android 获取USB设备列表(一)Java方式 获取

简介 QtActivity 作为 Qt 应用程序的入口点&#xff0c;负责启动和配置 Qt 应用程序的信息&#xff0c; 后面我们继承 QtActivity 做自定义控制&#xff0c;了解一下 Activity 生命周期概念&#xff0c; 因为 QtActivity 继承自Android的activity&#xff0c;使用周期函数完成我…