Spring Boot与Mybatis-Plus集成SQLServer的完整指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目旨在演示如何将SQLServer与Spring Boot以及Mybatis-Plus框架进行整合,打造一个高效稳定的后端服务。详细介绍涉及了数据库连接、实体类定义、Mapper接口创建、Service层业务逻辑编写、Controller层API处理,以及运行测试等关键步骤。项目的核心知识点包括JDBC事务管理、Mybatis-Plus动态SQL、分页查询、数据库优化、异常处理、安全控制等,为开发者提供了一个深入理解数据库操作层构建的实践案例。
sqlserver-demo:Spring Boot + Mybatis-Plus + SQLServer

1. SQL Server数据库介绍

1.1 SQL Server概览

SQL Server是微软开发的一种关系型数据库管理系统(RDBMS),以其高性能、可扩展性和安全性而著称。它广泛应用于企业级应用中,支持大数据量的存储,并且能够处理复杂的事务需求。

1.2 版本与特性

SQL Server提供多个版本,包括免费的Express版,标准版,企业版等,各有不同的功能和性能特点。每个版本都包含一些核心特性,如高效的数据存储、备份和恢复功能、以及内置的安全机制。

1.3 SQL Server的安装与配置

安装SQL Server之前,需要确保系统满足最低硬件要求,并下载合适的版本。安装过程中,系统会提示进行初始化配置,包括设置实例名称、选择认证模式(Windows认证或混合认证模式)、配置服务账户以及定义排序规则等。

graph LR
A[开始安装SQL Server] --> B[选择安装类型]
B --> C[系统检查]
C --> D[输入产品密钥]
D --> E[实例配置]
E --> F[服务账户配置]
F --> G[排序规则配置]
G --> H[完成安装]

在配置过程中,建议根据实际应用场景选择适当的选项,确保数据库的最佳运行状态。安装完成后,通常需要配置数据库的连接信息,并进行基本的性能优化,以保证系统的稳定性和高效性。

随着数据库的搭建与配置完成,接下来将介绍Spring Boot与Mybatis-Plus的特性及其在应用开发中的作用,从而深入理解后端开发的技术细节与实践。

2. Spring Boot框架特性与Mybatis-Plus框架介绍

2.1 Spring Boot框架的核心特性

2.1.1 起步依赖与自动配置

Spring Boot 的设计哲学之一是简化项目初始化和配置过程,这一目标通过所谓的“起步依赖”(Starters)与“自动配置”(Auto-configuration)得以实现。起步依赖是一组便捷的依赖描述符,它们能够以最小的配置来引导项目所需的相关库。开发者无需手动添加所有依赖,而是通过引入一个起步依赖,Spring Boot 将自动为你添加其他相关依赖。

例如,引入 Spring Web 的起步依赖后,Spring Boot 会自动配置嵌入式 Tomcat,并设置好 Spring MVC 的默认配置。这是因为在底层,Spring Boot 通过依赖的传递性,引入了 spring-boot-starter-web 的所有传递依赖,包含了项目需要的大部分基础组件。

自动配置的原理

自动配置是基于项目的类路径下存在特定的 jar 包,并且项目中没有定义某些特定的配置类时,Spring Boot 会自动配置相应的 Bean。这是通过 @EnableAutoConfiguration 注解来实现的,它本身是一个复合注解,背后利用了 @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) 实现。 AutoConfigurationImportSelector 会将候选的自动配置类导入,这些候选类是在 spring.factories 文件中定义的。

// 使用 @EnableAutoConfiguration 开启自动配置
// @SpringBootApplication 等价于同时使用 @Configuration, @EnableAutoConfiguration, @ComponentScan
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

通过这个简单的例子可以看出,我们无需进行复杂的配置,Spring Boot 就已经为我们设置了默认的配置。这种自动化的设计使得开发者能够更专注于业务逻辑的实现,而不是环境配置的工作。

2.1.2 内嵌Web服务器与应用部署

Spring Boot 允许开发者在应用中嵌入 Web 服务器,常见的有 Tomcat、Jetty、Undertow。Spring Boot 应用启动时,内嵌的服务器也随之启动,无需额外的部署步骤。当应用打包成 JAR 文件时,它实际上成为了一个可执行的 JAR 文件,这意味着应用服务器不再是一个单独的进程。

内嵌服务器的工作原理

在内部,Spring Boot 使用了一个名为 spring-boot-starter-tomcat 的起步依赖,它包含了 Tomcat 的库。如果你想要切换到其他的服务器,只需要替换对应的起步依赖即可。例如,你可以将 spring-boot-starter-tomcat 替换为 spring-boot-starter-undertow

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

通过上述代码,我们排除了 Tomcat 并引入了 Undertow。Spring Boot 会自动识别这种变更,并内嵌 Undertow 服务器。

应用部署

在内嵌服务器模式下,部署变得极为简单。开发者仅需要将构建好的 JAR 文件发送到生产环境,并通过下面的命令启动即可:

java -jar your-application.jar

Spring Boot 应用可以设置为后台守护进程运行,通过添加 --server.port=8080 参数,还可以指定服务器运行的端口。这样的部署模型简化了应用的分发和部署,使得持续部署和微服务架构的实施更加容易。

2.2 Mybatis-Plus框架的优势与功能

2.2.1 Mybatis-Plus的基本原理与组件

Mybatis-Plus 是一个在 Mybatis 基础上扩展出来的框架,它提供了一些自动化的配置和代码生成工具,极大地简化了 CRUD 操作和数据库交互的复杂性。Mybatis-Plus 最主要的特点之一是,它提供了一个通用的 Mapper,该 Mapper 包含了对数据库表的基本操作方法。

基本原理

Mybatis-Plus 基于 Mybatis,保留了 Mybatis 的动态 SQL、插件体系等核心功能。它通过增强 Mapper 接口,实现了无侵入式的 CRUD 操作,即使在自定义 SQL 时,也无需编写额外的 Mapper XML 文件。

Mybatis-Plus 的主要组件包括:

  • 通用 Mapper :提供了一套丰富的通用方法,如 selectById insert update delete 等。
  • 代码生成器 :能够根据数据库表结构自动生成对应的 Mapper、Entity、Service、Controller 等代码。
  • 逻辑删除 :在数据库层面进行数据的软删除,即删除操作实际上是更新操作,将一个特定字段(如 is_deleted )设置为某个值(通常是 1)表示删除。
// 示例:通用 Mapper 的使用
public interface UserMapper extends BaseMapper<User> {// 这里继承了 BaseMapper,BaseMapper 已经提供了很多默认的 CRUD 方法
}
组件工作原理

通用 Mapper 的工作原理是通过定义一些通用的 SQL 模板和方法,配合 Mybatis 的注解或者 XML 来实现具体的 SQL 映射。当开发者调用这些方法时,Mybatis-Plus 会根据这些通用的模板生成对应数据库表的 SQL 语句。

代码生成器则利用了 Mybatis-Plus 提供的模板引擎,根据数据库表结构自动生成实体类、Mapper 接口和 XML 文件等。这极大地减少了重复的编码工作,提高了开发效率。

2.2.2 增强特性:代码生成器、逻辑删除等

Mybatis-Plus 提供了增强特性,使得开发者能够更高效地开发基于 Mybatis 的应用程序。这些特性包括代码生成器、逻辑删除、分页插件、乐观锁机制等。

代码生成器

代码生成器能够根据数据库表结构自动生成代码,大大减少了代码编写和维护的工作量。开发者只需要简单配置,就可以生成包含 CRUD 操作的实体类、Mapper 接口和 XML 文件等。

// 代码生成器的简单示例
public class CodeGenerator {public static void main(String[] args) {// 配置数据源、生成器等参数// ...// 执行生成操作mpg.execute();}
}
逻辑删除

逻辑删除是通过在数据库中设置一个标志字段来表示数据是否逻辑上删除,而非物理删除。这样做的好处是数据的安全性和完整性得到了保证,并且可以通过查询条件轻松过滤出未被删除的数据。

// 逻辑删除的实体类属性
public class User {private Long id;private String name;private Integer age;// 逻辑删除字段private Integer isDeleted;// getters and setters
}

在 Mybatis-Plus 的 Mapper 中,可以使用 @TableLogic 注解来标记逻辑删除字段:

public interface UserMapper extends BaseMapper<User> {// 使用 BaseMapper 已有的逻辑删除方法,如 deleteById
}

当调用删除方法时,Mybatis-Plus 并不会执行物理删除,而是将 isDeleted 字段的值更新为 1,这样查询时就会自动忽略这些记录。

通过这些增强特性,Mybatis-Plus 提升了开发效率和数据库操作的安全性,同时保证了灵活性和扩展性,适用于多种复杂场景。

3. 整合Spring Boot与Mybatis-Plus

3.1 数据库连接配置

3.1.1 连接池的配置与优化

在开发中,数据库连接池(Connection Pool)是一个关键组件,它能够帮助我们高效地管理数据库连接资源。使用连接池可以避免频繁地打开和关闭数据库连接,这样可以显著提高应用程序的性能。在Spring Boot中,连接池的配置和优化对于数据库的性能发挥至关重要。

Spring Boot默认使用HikariCP作为连接池组件,它是一个高性能的Java连接池。配置HikariCP很简单,只需要在 application.properties 文件中设置相关的参数即可。

# 设置连接池数据源
spring.datasource.type=com.zaxxer.hikari.HikariDataSource# HikariCP相关配置
spring.datasource.hikari.connectionTimeout=30000 # 连接超时时间(毫秒)
spring.datasource.hikari.maximumPoolSize=10 # 最大连接池数量
spring.datasource.hikari.poolName=MyHikariCP # 连接池名称
spring.datasource.hikari.idleTimeout=600000 # 空闲连接超时时间(毫秒)
spring.datasource.hikari.maxLifetime=1800000 # 连接存活时间(毫秒)

优化连接池配置通常涉及以下参数:

  • connectionTimeout : 连接获取超时时间。
  • maximumPoolSize : 连接池最大连接数。
  • idleTimeout : 连接空闲超时时间。
  • maxLifetime : 连接最大存活时间。

这些参数需要根据实际的应用负载和硬件资源来调整。例如,如果应用需要处理大量的并发请求,可能需要增加 maximumPoolSize 来保证足够多的连接。而 idleTimeout maxLifetime 则需要根据数据库服务器的性能进行调整,避免创建过多的长生命周期连接。

3.1.2 数据源的选择与配置

在整合Spring Boot与Mybatis-Plus时,选择合适的数据源是至关重要的一步。Spring Boot支持多种数据源,如HikariCP、Apache DBCP等,其中HikariCP因其轻量和高性能而被广泛使用。

数据源的配置与Spring Boot版本有关。以Spring Boot 2.x为例,配置数据源的步骤如下:

# 数据源JDBC URL
spring.datasource.url=jdbc:mysql://localhost:3306/your_database# 数据库用户名
spring.datasource.username=root# 数据库密码
spring.datasource.password=your_password# 数据源类型
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

同时,Mybatis-Plus也提供了数据源的配置方式。例如,在 application.properties 文件中可以设置如下配置,以适应Mybatis-Plus的配置需求:

# Mybatis-Plus配置
mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
mybatis-plus.type-aliases-package=com.yourpackage.entity
mybatis-plus.global-config.db-config.id-type=auto

在这部分配置中, mapper-locations 指定了Mybatis的Mapper XML文件位置, type-aliases-package 指定了实体类的包路径,而 global-config.db-config.id-type=auto 则设置了主键自动生成策略为自动增长。

3.2 实体类(Entity)定义与Mapper接口(Mapper)创建

3.2.1 实体类的定义与字段映射

在使用Mybatis-Plus框架中,实体类(Entity)是数据模型的映射,每一个数据库表都对应一个实体类。定义实体类时,需要遵循一些基本的约定:

  • 类名通常与表名相同或者相似。
  • 属性名与字段名相同。
  • 使用注解 @TableId 来标注主键字段。
  • 使用 @TableField 来标注普通字段。

下面是一个简单的实体类定义示例:

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;@TableField("username")private String username;@TableField("password")private String password;// Getters and Setters...
}

在上述代码中, @TableName("user") 注解指明该实体类对应数据库中的 user 表。 @TableId 指定了主键字段, id 字段被设置为自增(AUTO)。每个字段使用 @TableField 注解进行映射,这样Mybatis-Plus在执行数据库操作时可以正确地处理字段。

3.2.2 Mapper接口的创建与继承体系

Mapper接口是Mybatis-Plus框架中用于操作数据库的核心接口。在创建Mapper接口时,通常不需要编写任何实现代码,只需要继承 BaseMapper 接口即可获得基本的CRUD(Create, Read, Update, Delete)操作能力。

下面是一个Mapper接口的示例:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface UserMapper extends BaseMapper<User> {// 这里可以定义一些特殊的数据库操作方法
}

BaseMapper 提供了对 User 实体的基本操作,如 selectById insert update delete 等。在实际的应用中,如果需要进行更复杂的数据库操作,可以在Mapper接口中添加自定义的方法,并编写相应的XML文件或者使用注解来实现。

为了支持这些操作,Mybatis-Plus通常需要一个对应的XML文件,其中包含SQL语句:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yourpackage.mapper.UserMapper"><select id="selectByUsername" resultType="com.yourpackage.entity.User">SELECT * FROM user WHERE username = #{username}</select></mapper>

在上述XML文件中,定义了一个 selectByUsername 的查询操作,该操作可以根据用户名查询用户信息。使用这种方式可以非常灵活地编写各种复杂的查询。

至此,我们完成了实体类的定义以及Mapper接口的创建。在后续章节中,我们将继续深入了解如何通过Service层实现具体的业务逻辑,以及如何编写Controller层的API来响应外部请求。

4. 业务逻辑实现与API编写

在构建Web应用时,业务逻辑层(Service层)和表现层(Controller层)的实现是至关重要的环节。Service层负责业务规则的实现,而Controller层则关注于如何接收用户请求、调用Service层处理逻辑,并将结果以适当的格式返回给用户。在Spring Boot和Mybatis-Plus的整合下,这个过程可以变得更为高效。

4.1 Service层业务逻辑实现

Service层作为应用的核心层,它封装了业务的处理逻辑。这一层通常包含了业务接口的定义以及接口的实现类。

4.1.1 Service接口定义与实现类编写

在定义Service层接口时,我们应该遵循单一职责原则,即一个接口只负责一个业务功能。接口定义了哪些方法需要被实现,而实现类则负责具体的逻辑处理。

//UserService.java
public interface UserService {User getUserById(Long id);boolean createUser(User user);boolean updateUser(User user);boolean deleteUser(Long id);
}
//UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic User getUserById(Long id) {return userMapper.selectById(id);}@Overridepublic boolean createUser(User user) {return userMapper.insert(user) > 0;}@Overridepublic boolean updateUser(User user) {return userMapper.updateById(user) > 0;}@Overridepublic boolean deleteUser(Long id) {return userMapper.deleteById(id) > 0;}
}

以上代码中, UserService 定义了用户的增删改查方法,而 UserServiceImpl 作为实现类,注入了 UserMapper 接口,利用Mybatis-Plus提供的方法完成数据库操作。同时,这些方法返回的布尔值可以表示操作的成功与否。

4.1.2 业务逻辑的封装与事务管理

封装业务逻辑时,我们还需要考虑到事务管理。在Spring框架中,可以通过 @Transactional 注解来声明事务边界。

//UserService.java
@Transaction
public boolean createUser(User user) {// 检查用户名是否唯一等逻辑boolean isUnique = checkUsernameUnique(user.getUsername());if (isUnique) {return userMapper.insert(user) > 0;}return false;
}

在上述示例中, createUser 方法在创建用户之前会检查用户名是否唯一,如果用户创建成功,返回true,如果检查不通过,返回false。 @Transactional 注解确保了操作的原子性,如果在检查用户名唯一性的过程中发生异常,整个事务会被回滚。

4.2 Controller层API编写

Controller层的作用是接收外部请求,并调用Service层的方法处理这些请求,然后返回响应。Spring Boot的RESTController注解可以帮助我们快速实现RESTful API。

4.2.1 RESTful接口设计原则

RESTful接口设计遵循一些原则,比如使用HTTP方法(GET、POST、PUT、DELETE)来表示对资源的操作,使用URI来表示资源。以下是一个简单的例子:

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.getUserById(id);if (user == null) {return new ResponseEntity<>(HttpStatus.NOT_FOUND);}return new ResponseEntity<>(user, HttpStatus.OK);}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {boolean result = userService.createUser(user);if (result) {return new ResponseEntity<>(user, HttpStatus.CREATED);}return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);}// 其他方法省略...
}

UserController 中,我们定义了获取用户(GET)和创建用户(POST)的方法。通过 @RequestBody 注解,我们能够直接从请求体中将JSON数据映射到User对象。通过 @PathVariable 注解,我们可以从URL路径中获取动态参数。

4.2.2 请求参数处理与响应格式设计

请求参数的处理需要注意数据校验和格式化。对于复杂的参数结构,可以使用DTO(Data Transfer Object)来传输数据。而响应格式设计则需要考虑如何返回正确状态码以及数据结构。

// UserDTO.java
public class UserDTO {// 数据字段
}// UserController.java
@PostMapping("/register")
public ResponseEntity<?> registerUser(@RequestBody UserDTO userDTO) {// 校验和转换逻辑User user = convertDTOToUser(userDTO);boolean result = userService.createUser(user);if (result) {return new ResponseEntity<>(user, HttpStatus.CREATED);}// 定制错误响应return ResponseEntity.badRequest().body("Error: User creation failed");
}

在上述代码中, UserDTO 用于传递注册信息, registerUser 方法实现了从DTO到User实体的转换,并调用了 createUser 方法。如果用户创建成功,则返回状态码201和用户信息,否则返回错误响应。

以上就是业务逻辑实现与API编写的详尽内容。在实际的项目中,这两层的实现细节会更加复杂,但是掌握上述的基本原则和实践是构建高质量Web服务的基础。

5. 性能优化与安全集成

随着应用的逐渐复杂和用户量的增长,性能优化和安全集成变得越来越重要。本章节我们将探讨如何对数据库进行设计优化,实现异常的有效管理,并集成安全控制来保护应用。

5.1 数据库设计与性能优化

5.1.1 关系型数据库规范化设计

规范化是数据库设计的重要过程,它通过消除冗余数据和依赖关系来提高数据的完整性。在进行规范化时,需要按照范式理论逐步进行:

  • 第一范式(1NF):要求表中的每个字段都是不可分割的基本数据项。
  • 第二范式(2NF):在1NF基础上,消除对主键的部分依赖。
  • 第三范式(3NF):在2NF基础上,消除对主键的传递依赖。

实例代码:

-- 假设有一个非规范化的订单表(Orders),包含订单详情和产品信息。
CREATE TABLE Orders (OrderID INT PRIMARY KEY,ProductName VARCHAR(100),Price DECIMAL(10, 2),Quantity INT,TotalPrice AS (Price * Quantity) -- 计算总价
);-- 规范化后拆分为两个表:订单表(Orders)和产品表(Products)
CREATE TABLE Orders (OrderID INT PRIMARY KEY,ProductID INT,Quantity INT,FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);CREATE TABLE Products (ProductID INT PRIMARY KEY,ProductName VARCHAR(100),Price DECIMAL(10, 2)
);

5.1.2 SQL查询优化与索引策略

查询优化是性能提升的关键。以下是一些常见的查询优化策略:

  • 避免在WHERE子句中使用函数或表达式。
  • 使用EXPLAIN计划来分析SQL语句的执行计划。
  • 合理使用索引,包括建立复合索引以及避免过度索引导致的性能开销。

实例代码:

-- 创建复合索引
CREATE INDEX idx_user_product ON Orders(ProductID, OrderID);-- 使用EXPLAIN分析查询计划
EXPLAIN SELECT * FROM Orders WHERE ProductID = 1;

5.2 异常处理方法与监控管理

5.2.1 异常的捕获与日志记录

在应用程序中合理捕获和记录异常是追踪问题和性能瓶颈的重要手段。Spring Boot提供了多种方式记录异常,包括通过日志框架记录和使用Actuator。

操作步骤:

  1. 在应用中引入日志依赖(如Logback或Log4j)。
  2. 在配置文件中设置日志级别和格式。
  3. 在代码中捕获异常并记录。

代码示例:

try {// 业务代码
} catch (Exception e) {// 使用日志框架记录异常log.error("业务处理异常", e);
}

5.2.2 Spring Boot Actuator模块应用

Spring Boot Actuator模块提供了生产级别的监控和管理功能。通过这个模块,我们可以了解应用的运行状况,包括端点(Endpoint)监控、健康检查等。

操作步骤:

  1. 引入Spring Boot Actuator依赖。
  2. 配置安全和权限控制,确保只有授权用户才能访问监控信息。
  3. 通过端点如 /actuator/health /actuator/metrics 了解应用状态。

5.3 安全控制集成

5.3.1 常见的安全威胁与防范措施

在Web应用中常见的安全威胁包括SQL注入、XSS攻击、CSRF攻击和会话劫持等。针对这些威胁,采取以下防范措施:

  • 对所有的用户输入进行验证和清理。
  • 使用HTTPS协议保护数据传输。
  • 使用CSRF令牌防止跨站请求伪造。
  • 实施会话管理策略,如使用安全cookie和令牌。

5.3.2 Spring Security集成与权限控制

Spring Security是一个强大的、可高度定制的身份验证和访问控制框架。通过集成Spring Security,我们可以实现细粒度的权限控制。

操作步骤:

  1. 引入Spring Security依赖。
  2. 配置Spring Security来定义用户认证和授权策略。
  3. 使用注解如 @PreAuthorize 来控制方法级别的访问。

代码示例:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated().and().formLogin();}// 其他配置...
}

通过以上的操作和步骤,可以确保我们的应用在性能和安全性方面都有很好的保障。数据库设计和SQL优化确保了数据操作的效率,异常处理和监控管理帮助我们维护系统的稳定性,而安全控制的集成则保障了应用的安全性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目旨在演示如何将SQLServer与Spring Boot以及Mybatis-Plus框架进行整合,打造一个高效稳定的后端服务。详细介绍涉及了数据库连接、实体类定义、Mapper接口创建、Service层业务逻辑编写、Controller层API处理,以及运行测试等关键步骤。项目的核心知识点包括JDBC事务管理、Mybatis-Plus动态SQL、分页查询、数据库优化、异常处理、安全控制等,为开发者提供了一个深入理解数据库操作层构建的实践案例。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

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

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

相关文章

【工作笔记】判断一条方法需不需要事务/AOP

① 看注解方法/类上有 Transactional → 需要事务&#xff0c;必须走代理方法/类上有自定义 AOP 注解&#xff08;如 Log、Retry、Cacheable 等&#xff09;→ 需要代理什么都没有 → 几乎肯定不需要示例需求Transactional public void generateDailyTask(...)✅ 需要事务publi…

Unity 的UI动画调节

在游戏开发中&#xff0c;精美的UI动画能极大提升用户体验。Unity提供了强大的动画系统&#xff0c;让开发者可以轻松创建流畅的界面动效。本文将介绍UI动画的核心概念、制作流程和实用技巧。一、核心动画组件Animation窗口 - 可视化创建关键帧动画Animator组件 - 控制动画状态…

26考研11408数据结构

数据结构 1.绪论1.1.1数据结构的基本概念 数据数据元素&#xff1a;数据的基本单位&#xff0c;一个数据元素由多个数据项组成&#xff0c;数据项是组成数据元素不可分割的最小单位数据对象&#xff1a;具有相同性质的数据元素的集合&#xff0c;是数据的一个子集数据类型&…

Solar月赛(应急响应)——攻击者使用什么漏洞获取了服务器的配置文件?

某某文化有限公司的运维小王刚刚搭建服务器发现cpu莫名的异常的升高请你帮助小王排查一下服务器。 文章目录事件介绍事件1&#xff1a;帮助小王找到是什么漏洞?事件2&#xff1a;系统每天晚上系统都会卡卡的帮小明找到问题出在了那&#xff1f;事件3&#xff1a;恶意域名是什么…

高频面试题

1.HashMap的底层原理JDK1.7版本之前&#xff0c;HashMap的底层数据结构是数组链表&#xff0c;HashMap通过哈希算法会将元素的key映射待数组的的槽位(Bucket)。如果多个键映射到同一个槽位&#xff0c;就会以链表的形式存储在同一个槽位上。但是链表的查询的复杂度O(n),所有冲突…

鱼皮项目简易版 RPC 框架开发(四)

本文为笔者阅读鱼皮的项目 《简易版 RPC 框架开发》的笔记&#xff0c;如果有时间可以直接去看原文&#xff0c; 1. 简易版 RPC 框架开发 前面的内容可以笔者的前面几篇笔记 鱼皮项目简易版 RPC 框架开发&#xff08;一&#xff09; 鱼皮项目简易版 RPC 框架开发&#xff08;二…

力扣-79.单词搜索

题目链接 79.单词搜索 class Solution {int m, n;public boolean exist(char[][] board, String word) {m board.length;n board[0].length;boolean[][] visited new boolean[m][n];// 遍历网格中的每个单元格作为搜索起点for (int i 0; i < m; i) {for (int j 0; j …

LabVIEW的To More Specific Class功能说明

​To More Specific Class 是 LabVIEW 中用于控件引用类型转换的关键函数。可将通用 GObject 引用&#xff0c;精准转为 Listbox、TreeControl 等特定控件类引用&#xff0c;让开发者能调用专属属性&#xff08;如获取列表行数&#xff09;&#xff0c;实现对不同控件类的差异化…

Ubuntu20.04安装和配置Samba实现Win11下共享文件夹

Samba是在Linux和UNIX系统上实现 SMB / CIFS 协议的开源软件&#xff0c;主要用于局域网内的文件共享和打印服务。Samba通过SMB/CIFS协议实现跨平台资源共享&#xff0c;支持匿名用户和本地用户访问共享目录&#xff0c;客户端主要为Windows系统。其核心进程包括&#xff1a; ‌…

设计模式(八)结构型:桥接模式详解

设计模式&#xff08;八&#xff09;结构型&#xff1a;桥接模式详解桥接模式&#xff08;Bridge Pattern&#xff09;是 GoF 23 种设计模式中的结构型模式之一&#xff0c;其核心价值在于将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。它通过“组合”而非“继承”…

【边缘填充】——图像预处理(OpenCV)

目录 1 边界复制&#xff08;BORDER_REPLICATE&#xff09; 2 边界反射&#xff08;BOEDER_REFLECT&#xff09; 3 边界反射101&#xff08;BORDER_REFLECT101&#xff09; 4 边界常数&#xff08;BORDER_CONSTANT&#xff09; 5 边界包裹&#xff08;BORDER_WRAP&#xf…

git同步到github出错-几个问题-一天晚上(2025.7.29)

访问不了github 代理和加速器都正常&#xff0c;但是就是访问不了这个网站尝试过几种方法都不行&#xff0c;后面突然可以了。 之后发现一种情况会不行&#xff1a;同时开启 同步不了 http连接 https://blog.csdn.net/m0_73972962/article/details/146198392 一堆问题 ssh连接才…

Redis未授权访问的利用的几种方法原理以及条件

一、redis通过定时任务反弹shell1.利用条件&#xff1a;需要能够登录redis数据库&#xff0c;并且redis以root用户运行。同时/var/spool/cron目录要具有写和执行权限。二、Redis主从getshell1.原理&#xff1a;在Redis 4.x之后&#xff0c;Redis新增了模块功能&#xff0c;通过…

DNF 与 YUM 的区别详解:从 CentOS 7 到 CentOS 9 的演进

&#x1f365; DNF 与 YUM 的区别详解&#xff1a;从 CentOS 7 到 CentOS 9 的演进标签&#xff1a;CentOS、YUM、DNF、Linux 包管理、系统升级、兼容性 适用版本&#xff1a;CentOS 7、CentOS 8、CentOS 9&#x1f9e9; 一、背景介绍 CentOS 中使用的包管理工具是 RedHat 系列…

mp核心功能

条件构造器mybatisPlus支持各种复杂的where条件, 满足日常的开发wrapper类就是条件构造器提供了很多子类条件构造器的用法&#xff1a;QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分UpdateWrapper和LambdaUpdateWrapper通常只有在set语句…

pcm,msd调制解调仿真

PCM&#xff08;脉冲编码调制&#xff09;和MSD&#xff08;多符号差分&#xff09;调制解调系统的MATLAB仿真代码。 PCM (脉冲编码调制) 仿真 %% PCM调制解调仿真 clear; clc; close all;% 参数设置 Fs 8000; % 采样频率 (Hz) t_duration 0.02; % 信号持续时间 (秒…

【网络安全】信息网络安全建设方案(WORD)

1.1 安全整体架构 1.2 安全建设拓扑 1.3 安全建设内容与目标 2.1 用户侧安全建设思路 2.2 用户侧安全建设拓扑 2.3 用户侧安全建设内容 2.3.1 PKI 升级改造 2.3.2 安全防护 2.3.3 安全检测 2.3.4 安全管理 3.1 跨网安全访问与交换平台安全建设思…

微服务 01

微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 &#xff08;对应的是单体架构风格&#xff09; 一、认识微服务 1、单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打…

20250726让荣品的PRO-RK3566开发板使用TF卡启动

20250726让荣品的PRO-RK3566开发板使用TF卡启动 2025/7/26 8:58缘起&#xff1a;需要升级 荣品的PRO-RK3566核心板的 底板上的FPGA程序。 由于没有使用RK809的电量计功能&#xff0c;板子一上电就会被关机&#xff01;^_于是给生产线制作了一张TF卡/启动卡&#xff0c;插到底板…

Selenium使用指南

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 概述selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;相对于另外一款web自动化测试工具QT…