如何使用 RestTemplate 进行 Spring Boot 微服务通信示例
概述
下面我们将学习如何创建多个 Spring boot 微服务以及如何使用 RestTemplate 类在多个微服务之间进行同步通信。
微服务通信有两种风格:
- 同步通讯
- 异步通信
同步通讯
在同步通信的情况下,客户端发送请求并等待服务的响应。这里重要的一点是协议(HTTP/HTTPS)是同步的,客户端代码只有在收到 HTTP 服务器响应时才能继续其任务。
例如,Microservice1 作为客户端发送请求并等待 Microservice2 的响应。
我们可以使用 RestTemplate 或 WebClient 或 Spring Cloud Open Feign 库来同步通信多个微服务。
异步通信
在异步通信的情况下,客户端发送请求并且不等待服务的响应。客户端将继续执行其任务 - 它不会等待服务的响应。
例如, 微服务1 作为客户端发送请求,并不等待 微服务2 的响应。
我们可以使用RabbitMQ和Apache Kafka等消息代理在多个微服务之间进行异步通信。
我们需要做什么
下面我们将创建两个微服务,例如部门服务和用户服务,并且我们将从用户服务到部门服务进行 REST API 调用以获取特定的用户部门。
并且每个微服务创建一个单独的 MySQL 数据库。
在 IntelliJ IDEA 中创建并设置两个 Spring boot 项目作为两个微服务。
1.创建DepartmentService微服务
首先 在 IntelliJ IDEA 中创建并设置部门服务Spring boot 项目
1.在IntelliJ IDEA中创建并设置spring boot项目(部门服务)
我们使用 springinitializr创建一个 Spring boot 项目。
请查看下面的屏幕截图,在使用 springinitializr创建 Spring Boot 应用程序时输入详细信息 :
点击“GENERATE”按钮以 zip 文件形式下载 Spring boot 项目。解压zip文件并在IntelliJ IDEA中导入Spring boot项目。
pom.xml文件供参考:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.wz</groupId>
<artifactId>department-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>department-service</name>
<description>department-service</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
DepartmentService - 配置 MySQL 数据库
由于我们使用 MySQL 作为数据库,因此我们需要配置 URL、用户名和密码,以便 Spring boot 在启动时可以与数据库建立连接。
打开 src/main/resources/application.properties
文件并向其中添加以下属性:
spring.datasource.url=jdbc:mysql://localhost:3306/department_db
spring.datasource.username=root
spring.datasource.password=Mysql@123
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
这里注意修改的MySQL密码,另外在 MySQL 中创建一个名为Department_db的数据库 。
不需要创建任何表。Hibernate 将根据我们将在下一步中定义的Department实体自动创建这些表 。这是通过属性 spring.jpa.hibernate.ddl-auto = update 自动实现的。
DepartmentService - 创建部门 JPA 实体
package io.wz.departmentservice.entity;
import javax.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "departments")
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String departmentName;
private String departmentAddress;
private String departmentCode;
}
DepartmentService - 创建 Spring Data JPA 存储库
package io.wz.departmentservice.repository;
import io.wz.departmentservice.entity.Department;
import org.springframework.data.jpa.repository.JpaRepository;
public interface DepartmentRepository extends JpaRepository<Department, Long> {
}
DepartmentService - 创建服务层
DepartmentService
package io.wz.departmentservice.service;
import io.wz.departmentservice.entity.Department;
public interface DepartmentService {
Department saveDepartment(Department department);
Department getDepartmentById(Long departmentId);
}
DepartmentServiceImpl 类
package io.wz.departmentservice.service.impl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import io.wz.departmentservice.entity.Department;
import io.wz.departmentservice.repository.DepartmentRepository;
import io.wz.departmentservice.service.DepartmentService;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
@Slf4j
public class DepartmentServiceImpl implements DepartmentService {
private DepartmentRepository departmentRepository;
@Override
public Department saveDepartment(Department department) {
return departmentRepository.save(department);
}
@Override
public Department getDepartmentById(Long departmentId) {
return departmentRepository.findById(departmentId).get();
}
}
DepartmentService - 创建Controller层
DepartmentController
package io.wz.departmentservice.controller;
import lombok.AllArgsConstructor;
import io.wz.departmentservice.entity.Department;
import io.wz.departmentservice.service.DepartmentService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("api/departments")
@AllArgsConstructor
public class DepartmentController {
private DepartmentService departmentService;
@PostMapping
public ResponseEntity<Department> saveDepartment(@RequestBody Department department){
Department savedDepartment = departmentService.saveDepartment(department);
return new ResponseEntity<>(savedDepartment, HttpStatus.CREATED);
}
@GetMapping("{id}")
public ResponseEntity<Department> getDepartmentById(@PathVariable("id") Long departmentId){
Department department = departmentService.getDepartmentById(departmentId);
return ResponseEntity.ok(department);
}
}
DepartmentService - 启动 Spring Boot 应用程序
我们可以通过两种方式启动独立的 Spring boot 应用程序。
- 从应用程序的根目录并键入以下命令来运行它 -
$ mvn spring-boot:run
- 从 IDE 中,将
DepartmentServiceApplication.main()
方法作为独立 Java 类运行,该方法将在端口 8080 上启动嵌入式 Tomcat 服务器并将浏览器指向 http://localhost:8080/。
DepartmentService - 使用 Postman 客户端测试 REST API
保存部门 REST API:
获取单个部门 REST API:
2.创建UserService微服务
我们首先在 IntelliJ IDEA 中创建并设置UserService
Spring boot 项目
1.在IntelliJ IDEA中创建并设置spring boot项目(用户服务)
使用 springinitializr创建一个 Spring boot 项目。
请参阅下面的屏幕截图,在使用 springinitializr创建 Spring Boot 应用程序时输入详细信息 :
单击“GENRATE”按钮以 zip 文件形式下载 Spring boot 项目。解压zip文件并在IntelliJ IDEA中导入Spring boot项目。
pom.xml 文件供参考:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.wz</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>user-service</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
UserService - 配置 MySQL 数据库
打开 src/main/resources/application.properties
文件并向其中添加以下属性:
spring.datasource.url=jdbc:mysql://localhost:3306/employee_db
spring.datasource.username=root
spring.datasource.password=Mysql@123
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
这里注意修改的MySQL密码,另外在 MySQL 中创建一个名为employee_db的数据库 。
不需要创建任何表。Hibernate 将根据我们将在下一步中定义的User实体自动创建这些表 。这是通过属性 spring.jpa.hibernate.ddl-auto = update 自动实现的。
UserService - 更改服务器端口
注意,部门服务 Spring boot 项目运行在默认的 tomcat 服务器端口 8080 上。
对于用户服务,我们需要使用以下属性将嵌入式 tomcat 服务器端口更改为 8081:
server.port = 8081
UserService - 创建用户 JPA 实体
package io.wz.userservice.entity;
import javax.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "users")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
@Column(nullable = false, unique = true)
private String email;
private String departmentId;
}
UserService - 创建 Spring Data JPA 存储库
package io.wz.userservice.repository;
import io.wz.userservice.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
UserService - 创建 DTO 类
DepartmentDto
package io.wz.userservice.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class DepartmentDto {
private Long id;
private String departmentName;
private String departmentAddress;
private String departmentCode;
}
UserDto
package io.wz.userservice.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private Long id;
private String firstName;
private String lastName;
private String email;
}
ResponseDto
package io.wz.userservice.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class ResponseDto {
private DepartmentDto department;
private UserDto user;
}
UserService - 将 RestTemplate 配置为 Spring Bean
将 RestTemplate 类配置为 Spring bean,以便我们可以注入并使用它。
package io.wz.userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
UserService - 创建服务层
用户服务接口
package io.wz.userservice.service;
import io.wz.userservice.dto.ResponseDto;
import io.wz.userservice.entity.User;
public interface UserService {
User saveUser(User user);
ResponseDto getUser(Long userId);
}
UserServiceImpl class
package io.wz.userservice.service.impl;
import lombok.AllArgsConstructor;
import io.wz.userservice.dto.DepartmentDto;
import io.wz.userservice.dto.ResponseDto;
import io.wz.userservice.dto.UserDto;
import io.wz.userservice.entity.User;
import io.wz.userservice.repository.UserRepository;
import io.wz.userservice.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
private RestTemplate restTemplate;
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
@Override
public ResponseDto getUser(Long userId) {
ResponseDto responseDto = new ResponseDto();
User user = userRepository.findById(userId).get();
UserDto userDto = mapToUser(user);
ResponseEntity<DepartmentDto> responseEntity = restTemplate
.getForEntity("http://localhost:8080/api/departments/" + user.getDepartmentId(),
DepartmentDto.class);
DepartmentDto departmentDto = responseEntity.getBody();
System.out.println(responseEntity.getStatusCode());
responseDto.setUser(userDto);
responseDto.setDepartment(departmentDto);
return responseDto;
}
private UserDto mapToUser(User user){
UserDto userDto = new UserDto();
userDto.setId(user.getId());
userDto.setFirstName(user.getFirstName());
userDto.setLastName(user.getLastName());
userDto.setEmail(user.getEmail());
return userDto;
}
}
请注意,以上我们使用RestTemplate对部门服务进行 REST API 调用:
ResponseEntity<DepartmentDto> responseEntity = restTemplate
.getForEntity("http://localhost:8080/api/departments/" + user.getDepartmentId(),
DepartmentDto.class);
UserService - 创建控制器层:UserController
package io.wz.userservice.controller;
import lombok.AllArgsConstructor;
import io.wz.userservice.dto.ResponseDto;
import io.wz.userservice.entity.User;
import io.wz.userservice.service.UserService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("api/users")
@AllArgsConstructor
public class UserController {
private UserService userService;
@PostMapping
public ResponseEntity<User> saveUser(@RequestBody User user){
User savedUser = userService.saveUser(user);
return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
}
@GetMapping("{id}")
public ResponseEntity<ResponseDto> getUser(@PathVariable("id") Long userId){
ResponseDto responseDto = userService.getUser(userId);
return ResponseEntity.ok(responseDto);
}
}
UserService - 启动 Spring Boot 应用程序
我们可以通过两种方式启动独立的 Spring boot 应用程序。
- 从应用程序的根目录并键入以下命令来运行它 -
$ mvn spring-boot:run
- 在 IDE 中,将
UserServiceApplication.main()
方法作为独立 Java 类运行,该方法将在端口 8080 上启动嵌入式 Tomcat 服务器并将浏览器指向http://localhost:8081/
。
UserService - 使用 Postman 客户端测试 REST API
保存用户 REST API:
获取用户 REST API:
请注意,响应包含用户的部门。这说明我们已成功从 UserService 到 DepartmentService 进行 REST API 调用。
结论
在本教程中,我们学习了如何创建多个 Spring boot 微服务以及如何使用RestTemplate类在多个微服务之间进行同步通信。
从 5.0 开始, RestTemplate 类处于维护模式,很快就会被弃用。因此 Spring 团队推荐使用 org.springframework.web.reactive.client.WebClient
,它具有现代 API 并支持同步、异步和流场景,下一篇文章继续讲解
相关文章:

win10 通过wmic命令行设置系统环境变量
而通过编程修改系统环境变量,需要调用注册表API或调用wmi API接口,都有些过于麻烦。此时,如果通过system函数,直接调用批处理文件,则只需要一行代码。批处理中,分别给出了创建环境变量,修改环境变量,删除环境变量的demo。可以根据需要调整批处理文件。在系统维护或编写程序过程中,经常需要对系统环境变量进行设置、修改、删除炒作。注:修改系统环境变量,需要有管理员权限。

c#操作mongodb数据库工具类
新建c#项目,在nuget中引入MongoDB.Driver驱动,然后新建一个MongoDBToolHelper类,将下面代码复制进去 using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; using

Redis查看集群状态有节点显示fail,连接失败
现有6台redis,为集群,3主3从,由于两台服务器故障重装系统之后进行重新安装2台redis,安装完成之后。查询当前redis状态,发现有存留的节点,但连接为fai。将新建的两台redis启动,保证配置文件一致。查询fail节点的node_id。将新建的两台redis设为从节点。登录新建的两台redis服务器。先通过ID删掉无用的节点。

SpringBoot整合Kafka (二)
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

SpringBoot整合Kafka (一)
Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

深入详解高性能消息队列中间件 RabbitMQ
在进行系统设计的时候,各个模块、服务器之间为了实现数据的交互,通常是建立连接通过发送消息来进行。如果将他们一一建立连接,就会出现链路太多,每一条链路都必须感知对端等问题。此场景下消息将非常混乱,后期维护也将非常痛苦。

ModuleNotFoundError: No module named ‘config‘
当你在Python代码中看到类似"ModuleNotFoundError: No module named 'config'"的错误消息时,意味着你尝试导入一个名为'config'的模块,但Python无法找到该模块

【云原生基础】了解云原生,什么是云原生?
云原生(Cloud-Native)是一种软件开发和部署方法论,旨在利用云计算、容器化、微服务架构和持续交付等现代技术和最佳实践,以构建、部署和运行可伸缩、高可用、弹性和易于管理的应用程序。云原生应用程序旨在充分发挥云计算的潜力,以更好地满足快速发展的数字业务需求。容器化:云原生应用程序通常使用容器技术(如Docker)进行封装,使应用程序及其依赖项可以在不同环境中一致运行。容器化提供了隔离、可重复部署和快速部署的好处。

【微服务】mysql + elasticsearch数据双写设计与实现
在很多电商网站中,对商品的搜索要求很高,主要体现在页面快速响应搜索结果。这就对服务端接口响应速度提出了很高的要求。

Python异常处理:try、except、else 和 finally 的使用指南
Python异常处理:try、except、else 和 finally 的使用指南

HarmonyOS 数据管理与应用数据持久化(二)
文章浏览阅读31次。关系型数据库基于 SQLite 组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。

HarmonyOS数据管理与应用数据持久化(一)
文章浏览阅读599次。一.

Ubuntu系统下怎么安装Docker(linux安装docker教程)
更新系统软件包 在安装 Docker 前,首先需要更新系统软件包,确保系统上的软件都是最新的版本

python实战讲解之使用Python批量发送个性化邮件
通过上述Python脚本,我们可以批量发送个性化的邮件。我们首先设置发件人邮箱和密码,然后指定SMTP服务器和端口号。接下来,我们读取包含员工信息的Excel文件,并获取唯一的员工姓名列表和对应的邮箱地址。然后,我们遍历员工数据,并为每个员工创建邮件,附带相应的附件。最后,我们通过SMTP服务器发送邮件,并在发送完成后删除生成的员工数据文件。

什么是加密?浅谈MD5加密
文章浏览阅读108次。加密解密是一种通过使用密码算法对信息进行转换,以使其在传输或存储过程中变得不可读或难以理解,从而保护信息的安全性和隐私性的过程。加密是将明文(原始文本)转换为密文(加密后的文本)的过程。在加密过程中,使用密钥和特定的算法来改变原始文本的形式,使其在未经授权的情况下无法理解。只有持有正确密钥的人才解密是将密文转换回明文的过程。数字摘要算法(Digital Digest Algorithm)是一种加密算法,用于将任意长度的数据转换为固定长度的摘要(也称为哈希值)。

Python自动化处理Excel数据
需求描述:数据格式如下所示,需要分离出2023年7月1号之后的数据明细 数据核对与处理:从Excel文件中提取特定日期后的签收数据 1. 引言 在实际数据处理和分析过程中,经常会遇到需要从大量数据中提取出特定日期范围内的信息的需求。本文将介绍如何使用Python的pandas库来处理Excel文件,

Linux 环境下 安装 Elasticsearch 7.13.2
文章浏览阅读42次。借公司的 centos 7 服务器,搭建一个 Es,正好熟悉熟悉 Linux 下的安装流程。
基于 MySQL 多通道主主复制的机房容灾方案
文章中介绍了多种 MySQL 高可用技术,并介绍了根据自身需求选择多通道主主复制技术的过程和注意事项。

C#利用一段字节序列构建一个数组对象
《.NET中的数组在内存中如何布局? 》介绍了一个.NET下针对数组对象的内存布局。既然我们知道了内存布局,我们自然可以按照这个布局规则创建一段字节序列来表示一个数组对象,就像《以纯二进制的形式在内存中绘制一个对象》构建一个普通的对象,以及《你知道.NET的字符串在内存中是如何存储的吗?》构建一个字

【卷积神经网络】YOLO 算法原理
文章浏览阅读128次。在计算机视觉领域中,目标检测(Object Detection)是一个具有挑战性且重要的新兴研究方向。目标检测不仅要预测图片中是否包含待检测的目标,还需要在图片中指出它们的位置。2015年,Joseph Redmon, Santosh Divvala 等人提出第一个 YOLO 模型,该模型具有实时性高、支持多物体检测的特点,已成为目标检测领域热门的研究算法。本文主要介绍 YOLO 算法及其基本原理。

C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序
文章浏览阅读27次。C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序

MyBatis-Plus 实战教程四 idea插件
文章浏览阅读269次。在未引入分页插件的情况下,MybatisPlus是不支持分页功能的,IService和BaseMapper中的分页方法都无法正常起效。其中缺少的仅仅是分页条件,而分页条件不仅仅用户分页查询需要,以后其它业务也都有分页查询的需求。在刚才的代码中,从PageQuery到MybatisPlus的Page之间转换的过程还是比较麻烦的。这里用到了分页参数,Page,即可以支持分页参数,也可以支持排序参数。在查询出分页结果后,数据的非空校验,数据的vo转换都是模板代码,编写起来很麻烦。

测开不得不会的python之类(class)的定义和使用
文章浏览阅读147次。我们经常讲‘物以类聚,人以群分’,这里的类指相同属性的一类东西,而python中的类(class)也可以这么理解为相同属性的一些函数聚在一起,而通过__init__()初始化方法可以传入不同参数得到不同的实例对象,进而每个不同实例对象的一些属性值会不同。比如很多书籍经常讲到的例子Car类,他们属性可以有颜色,品牌,性价比等。

STM32F3系列 ADC采样单端采样模式(基于LL库)
STM32F3系列 ADC 单端采样(基于LL库) 芯片型号:STM32f303RBT6 开发软件:MDK5 & CubeMX & VS Code 目录 目录STM32F3系列 ADC 单端采样(基于LL库)目录引言1 基础知识1.1ADC转换基本流程1.2 时钟树1.3 关键参数1

【剑指offer|图解|双指针】移除元素 + 合并两个有序数组
文章浏览阅读186次,点赞23次,收藏17次。本文结合两道题目对顺表的考察方向有的初步了解,每个题都有详细的图文讲解,更多精彩内容等你来阅读哦!

鸿蒙ArkUI-X跨端应用开发,一套代码构建多平台应用
文章浏览阅读164次。ArkUI是一套构建分布式应用的声明式UI开发框架。它具备简洁自然的UI信息语法、丰富的UI组件、多维的状态管理,以及实时界面预览等相关能力,帮助您提升应用开发效率,并能在多种设备上实现生动而流畅的用户体验。详情可参考ArkUI框架介绍ArkUI-X进一步将ArkUI扩展到了多个OS平台:目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。

【Java集合】了解集合的框架体系结构及常用实现类,从入门到精通!
前言 通过Java基础的学习,我们掌握了主要的Java语言基本的语法,同时了解学习了Java语言的核心-面向对象编程思想。 从集合框架开始,也就是进入了java这些基础知识及面向对象思想进入实际应用编码的过程,通过jdk中集合这部分代码的阅读学习,就能发现这一点。 本计划在这篇中把框架体系和一些集合

MySQL中的 增 删 查 改(CRUD)
文章浏览阅读1.8k次,点赞60次,收藏56次。insert into 表名 value(数据,数据),.......;可以单行,多行插入。为查询结果的列取别名select 表达式/列名as 别名 from 表名;去重:DISTINCTselect distinct 单列/多列 from 表名;会去除查询结果中的重复项(只保留一项)select 条件查询的执行顺序遍历表中的每个记录把当前记录的值带入条件,根据条件进行筛选如果这条记录满足条件,保留并进行列上的表达式的计算如果有 order by 会在所有行都被获取到之后(表

BETWEEN操作符:选取介于两个值之间的数据范围内的值
文章浏览阅读246次,点赞6次,收藏5次。BETWEEN操作符:选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

【Java 基础篇】Java网络编程:文件下载详解
文件下载是指从一个网络服务器或远程位置传输文件到本地计算机或设备的过程。这些文件可以是文本文件、图像、音频、视频或任何其他类型的数据文件。文件下载在Web浏览器、移动应用程序和桌面应用程序中都是常见的操作。在Java中,您可以使用各种网络协议(如HTTP、FTP、SFTP等)来执行文件下载操作。下面我们将以HTTP协议为例,介绍如何使用Java进行文件下载。本文介绍了如何使用Java进行文件下载,以及文件下载的一些进阶功能和注意事项。