如何使用 Spring Data JPA 在存储过程中使用 IN、OUT 和 INOUT 参数

news2024/10/7 14:32:03

介绍

在本教程中,我将向您展示如何使用 Spring Data JPA 在存储过程中使用 IN、OUT 和 INOUT 参数。我还将调用一个完全没有参数的存储过程。

我将使用 MySQL 服务器,因此 MySQL 服务器可能存在一些限制,或者 Spring Data JPA 本身在调用存储过程时可能存在一些限制,但我至少会向您展示如何根据传递给存储过程的参数类型以不同的方式调用存储过程。

例如,与Oracle数据库不同,MySQL服务器不支持,因此您不能在实体类中使用参数类型。在这种情况下,您不能使用 Spring Data JPA 存储库样式方法来调用存储过程,您需要作为本机查询调用,或者您需要从中创建实例。REF_CURSORREF_CURSOR@NamedStoredProcedureQueryStoredProcedureQueryEntityManager

相关文章:

  • 使用休眠的存储过程
  • 使用 Spring SimpleJdbcCall 的存储过程
  • 使用 Spring StorageProcedure 的存储过程

先决条件

Java 至少 8, Gradle 6.1.1 – 6.7.1, Maven 3.6.3, MySQL 8.0.17 – 8.0.22, Spring Data JPA 2.2.5 – 2.4.3

项目设置

您可以在自己喜欢的 IDE 或工具中创建基于 gradle 或 maven 的项目。该项目的名称是spring-data-jpa-storage-procedure

如果你在Eclipse中创建基于gradle的项目,那么你可以使用下面的build.gradle脚本:

buildscript {
	ext {
		springBootVersion = '2.2.5.RELEASE' to 2.4.3
	}
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

plugins {
    id 'java-library'
    id 'org.springframework.boot' version "${springBootVersion}"
}

sourceCompatibility = 12
targetCompatibility = 12

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter:${springBootVersion}")
	implementation("org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}")
	implementation('mysql:mysql-connector-java:8.0.17') to 8.0.22
	//required only if jdk 9 or higher version is used
    runtimeOnly('javax.xml.bind:jaxb-api:2.4.0-b180830.0359')
}

如果你在Eclipse中创建基于maven的项目,那么你可以使用下面的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.roytuts</groupId>
	<artifactId>spring-data-jpa-stored-procedure</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>12</maven.compiler.source>
		<maven.compiler.target>12</maven.compiler.target>
	</properties>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.5.RELEASE to 2.4.3</version>
	</parent>

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

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

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<scope>runtime</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

MySQL 表

我将在roytuts数据库下创建一个名为user_details到 MySQL 服务器的表。

CREATE TABLE IF NOT EXISTS `user_details` (
  `id` int unsigned COLLATE utf8mb4_unicode_ci NOT NULL AUTO_INCREMENT,
  `first_name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `last_name` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `dob` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

现在,我将立即转储一些数据以测试我们的应用程序。

INSERT INTO `user_details` (`id`, `first_name`, `last_name`, `email`, `dob`) VALUES
	(7, 'Soumitra', 'Roy', 'contact@roytuts.com', '30-08-2016'),
	(8, 'Souvik', 'Sanyal', 'souvik.sanyal@email.com', '30-09-1991'),
	(9, 'Abc', 'Xyz', 'abc@xyz.com', '12-01-1998'),
	(10, 'Liton', 'Sarkar', 'liton@email.com', '30-08-2012');

存储过程

我将创建三个过程来处理存储过程中的 IN、OUT 和 INOUT 参数。

下面的存储过程从表中返回多行,我没有向其传递任何参数。

DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_users`()
BEGIN

	SELECT * FROM user_details;

END//
DELIMITER ;

下面的存储过程采用两个参数 – IN 和 OUT。In 参数接受输入,OUT 参数提供输出。

以下存储过程在连接名字和姓氏后返回用户的全名。

DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_full_name_in_out`(
	IN `user_id` INT,
	OUT `full_name` VARCHAR(50)

)
BEGIN

	SELECT concat(first_name, ' ', last_name) into full_name FROM user_details WHERE id = user_id;	

END//
DELIMITER ;

以下存储过程仅接受一个参数 INOUT,此参数接受输入并提供输出。

以下过程还会在连接名字和姓氏后返回用户的全名。

DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_full_name_inout`(
	INOUT `in_out` VARCHAR(50)

)
BEGIN

	SELECT concat(first_name, ' ', last_name) INTO in_out FROm user_details WHERE dob = in_out;
	
END//
DELIMITER ;

调用存储过程

现在,您将了解如何调用存储过程,如何将输入传递给 In 和 INOUT 参数,以及如何从 OUT 和 INOUT 参数接收输出。

get_users

此过程列出表user_details 中的所有用户。只需执行 commandon 数据库服务器即可获得以下结果:call get_users()

现在您将看到如何从 Spring 应用程序调用。

假设您有以下存储库接口,它扩展了 Spring 的存储库接口:

package spring.data.jpa.stored.procedure.repository;

import java.util.List;
import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;

import spring.data.jpa.stored.procedure.entity.UserDetails;

@Transactional
public interface UserDetailsJpaRepository extends JpaRepository<UserDetails, Integer> {

    @Query(value = "call get_users()", nativeQuery = true)
    List<UserDetails> findUserDetailsList();

    @Procedure(procedureName = "get_user_full_name_in_out", outputParameterName = "full_name")
    String findUserFullNameIn_OutUsingName(@Param("user_id") Integer in);

}

可以使用@Query注释通过以下代码行将过程作为本机查询调用。

@Query(value = "call get_users()", nativeQuery = true)
List<UserDetails> findUserDetailsList();

还可以使用EntityManager以其他方式调用存储过程。假设您有以下存储库类。

package spring.data.jpa.stored.procedure.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.StoredProcedureQuery;

import org.springframework.stereotype.Repository;

import spring.data.jpa.stored.procedure.entity.UserDetails;

@Repository
public class UserDetailsRepository {

    @PersistenceContext
    private EntityManager entityManager;

    public List<UserDetails> findUserDetailsListUsingAlias() {
        StoredProcedureQuery users = entityManager.createNamedStoredProcedureQuery("getUsers");
        return users.getResultList();
    }

    public List<UserDetails> findUserDetailsListUsingName() {
        StoredProcedureQuery users = entityManager.createStoredProcedureQuery("get_users");
        return users.getResultList();
    }

    public String findUserFullNameInOutUsingName(String dob) {
        StoredProcedureQuery q = entityManager.createStoredProcedureQuery("get_user_full_name_inout");

        q.registerStoredProcedureParameter("in_out", String.class, ParameterMode.INOUT);

        q.setParameter("in_out", dob);

        return q.getOutputParameterValue("in_out").toString();
    }

    public String findUserFullNameIn_OutUsingName(Integer in) {
        StoredProcedureQuery q = entityManager.createStoredProcedureQuery("get_user_full_name_in_out");

        q.registerStoredProcedureParameter("user_id", Integer.class, ParameterMode.IN);
        q.registerStoredProcedureParameter("full_name", String.class, ParameterMode.OUT);

        q.setParameter("user_id", in);

        return q.getOutputParameterValue("full_name").toString();
    }

}

现在,可以使用两种不同的方法来调用存储过程:

@PersistenceContext
private EntityManager entityManager;

public List<UserDetails> findUserDetailsListUsingAlias() {
	StoredProcedureQuery users = entityManager.createNamedStoredProcedureQuery("getUsers");
	return users.getResultList();
}

public List<UserDetails> findUserDetailsListUsingName() {
	StoredProcedureQuery users = entityManager.createStoredProcedureQuery("get_users");
	return users.getResultList();
}

get_user_full_name_in_out

可以使用以下命令从存储过程中获取结果:

CALL `get_user_full_name_in_out`('7', @full_name);
SELECT @full_name;

上面的命令将为您提供以下结果:

现在我将从春季应用程序调用。您可以使用以下代码行从 Spring Data JPA 存储库接口调用:UserDetailsJpaRepository

@Procedure(procedureName = "get_user_full_name_in_out", outputParameterName = "full_name")
String findUserFullNameIn_OutUsingName(@Param("user_id") Integer in);

您还可以在UserDetailsRepository类中使用以下代码片段:

public String findUserFullNameIn_OutUsingName(Integer in) {
	StoredProcedureQuery q = entityManager.createStoredProcedureQuery("get_user_full_name_in_out");

	q.registerStoredProcedureParameter("user_id", Integer.class, ParameterMode.IN);
	q.registerStoredProcedureParameter("full_name", String.class, ParameterMode.OUT);

	q.setParameter("user_id", in);

	return q.getOutputParameterValue("full_name").toString();
}

get_user_full_name_inout

您可以在 MySQL 服务器中使用以下命令调用此存储过程:

SET @in_out = '30-08-2016';
CALL `get_user_full_name_inout`(@in_out);
SELECT @in_out;

上述命令将为您提供以下输出:

以下代码片段写入UserDetailsRepository类:

public String findUserFullNameInOutUsingName(String dob) {
	StoredProcedureQuery q = entityManager.createStoredProcedureQuery("get_user_full_name_inout");

	q.registerStoredProcedureParameter("in_out", String.class, ParameterMode.INOUT);

	q.setParameter("in_out", dob);

	return q.getOutputParameterValue("in_out").toString();
}

实体类

下面给出了在上述存储库接口和类中使用的相应实体类。

在类上,我使用@NamedStoredProcedureQueries注释声明了存储过程。

我使用@Column注释指定了和 Java 属性不同的列名。

@Entity
@Table(name = "user_details")
@NamedStoredProcedureQueries({
		@NamedStoredProcedureQuery(name = "getUsers", procedureName = "get_users", resultClasses = {
				UserDetails.class }) })
//@NamedStoredProcedureQuery(name = "getUsers", procedureName = "get_users", resultClasses = { UserDetails.class })
public class UserDetails implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name = "first_name")
	private String firstName;

	@Column(name = "last_name")
	private String lastName;

	@Column
	private String dob;
        
        //getters and setters
}

服务类

相应的服务类可以写成:

package spring.data.jpa.stored.procedure.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import spring.data.jpa.stored.procedure.entity.UserDetails;
import spring.data.jpa.stored.procedure.repository.UserDetailsJpaRepository;
import spring.data.jpa.stored.procedure.repository.UserDetailsRepository;

@Service
public class UserService {

    @Autowired
    private UserDetailsJpaRepository jpaRepository;

    @Autowired
    private UserDetailsRepository repository;

    public String findUserFullNameIn_OutUsingName(Integer in) {
        return jpaRepository.findUserFullNameIn_OutUsingName(in);
    }

    public List<UserDetails> getUserListUsingNativeQuery() {
        return jpaRepository.findUserDetailsList();
    }

    public List<UserDetails> getUserDetailsListUsingProcAlias() {
        return repository.findUserDetailsListUsingAlias();
    }

    public List<UserDetails> getUserDetailsListUsingProcName() {
        return repository.findUserDetailsListUsingAlias();
    }

    public String getUserFullNameInOutUsingProcName(String dob) {
        return repository.findUserFullNameInOutUsingName(dob);
    }

    public String getUserFullNameIn_OutUsingProcName(int in) {
        return repository.findUserFullNameIn_OutUsingName(in);
        // return repository.findUserFullNameIn_OutUsingName(in);
    }

}

主类

一个带有 main 方法的类足以运行我们的 Spring Boot 应用程序。我在这里使用独立应用程序。

package spring.data.jpa.stored.procedure;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import spring.data.jpa.stored.procedure.service.UserService;

@SpringBootApplication
@EnableJpaRepositories(basePackages = "spring.data.jpa.stored.procedure.repository")
public class SpringDataJpaStoredProcedureApp implements CommandLineRunner {

    @Autowired
    private UserService service;

    public static void main(String[] args) {
        SpringApplication.run(SpringDataJpaStoredProcedureApp.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("===========================================");
        System.out.println("User List using Native Query");

        service.getUserListUsingNativeQuery().stream().forEach(
                u -> System.out.println(u.getId() + " " + u.getFirstName() + " " + u.getLastName() + " " + u.getDob()));

        System.out.println("===========================================");
        System.out.println("User List using Procedure name");

        service.getUserDetailsListUsingProcName().stream().forEach(
                u -> System.out.println(u.getId() + " " + u.getFirstName() + " " + u.getLastName() + " " + u.getDob()));

        System.out.println("===========================================");
        System.out.println("User List using Procedure alias");

        service.getUserDetailsListUsingProcAlias().stream().forEach(
                u -> System.out.println(u.getId() + " " + u.getFirstName() + " " + u.getLastName() + " " + u.getDob()));

        System.out.println("===========================================");

        System.out.println(
                "IN and OUT parameters using Procedure name: " + service.getUserFullNameIn_OutUsingProcName(7));

        System.out.println("===========================================");

        System.out.println(
                "INOUT parameter using Procedure name: " + service.getUserFullNameInOutUsingProcName("30-08-2016"));

        System.out.println("===========================================");

        System.out.println(service.findUserFullNameIn_OutUsingName(10));
    }

}

数据库配置

将以下数据库详细信息放入类路径目录src/main/resources下的application.properties文件中,以连接您的 MySQL 服务器。确保根据数据库详细信息进行更改:

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/roytuts
spring.datasource.username=root
spring.datasource.password=root

测试应用程序

执行上述主类将给出以下输出:

===========================================
User List using Native Query
7 Soumitra Roy 30-08-2016
8 Souvik Sanyal 30-09-1991
9 Abc Xyz 12-01-1998
10 Liton Sarkar 30-08-2012
===========================================
User List using Procedure name
7 Soumitra Roy 30-08-2016
8 Souvik Sanyal 30-09-1991
9 Abc Xyz 12-01-1998
10 Liton Sarkar 30-08-2012
===========================================
User List using Procedure alias
7 Soumitra Roy 30-08-2016
8 Souvik Sanyal 30-09-1991
9 Abc Xyz 12-01-1998
10 Liton Sarkar 30-08-2012
===========================================
IN and OUT parameters using Procedure name: Soumitra Roy
===========================================
INOUT parameter using Procedure name: Soumitra Roy
===========================================
Liton Sarkar

存储库接口/类和服务层与任何其他层分离,您可以轻松地注入到任何层中。

这就是如何使用 Spring Data JPA 框架在存储过程中使用 IN、OUT 和 IN OUT 参数的全部内容。

源代码

下载

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

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

相关文章

【网络安全】记一次APP登录爆破

使用工具 安卓12 jadx-gui 抓取登录HTTP请求包 安装burp证书&#xff0c;并抓取登录请求。 POST /loginUser HTTP/1.1 Host: api.xxxx.xxxxx.comapiaccountvrpuc-aaf91f835147ce2d01216bd3bd5c3516&phonexxxx&sign72C132B392873B3F4F6C0872E5EC4B5A&encM%2F8h…

经典排序方法思路简介

参考&#xff1a;https://zhuanlan.zhihu.com/p/166199924&#xff0c;https://www.runoob.com/w3cnote/ten-sorting-algorithm.html **稳定性&#xff1a;**是表示相同值的数据在排序好的结果中的位置前后关系依然不会变&#xff0c;例如[3,1,3],排序后的最后一个3位置不变&am…

java项目-第141期ssm美好生活日志网-ssm毕业设计_计算机毕业设计

java项目-第141期ssm美好生活日志网-ssm毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm美好生活日志网》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 首页、日记信息、美食信息、景点信息、新闻推荐 、日记展示、论坛信…

【现代密码学原理】——数字签名(学习笔记)

&#x1f4d6; 前言&#xff1a;数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&#xff0c;这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名&#xff0c;但是…

解读JVM级别本地缓存Caffeine青出于蓝的要诀3

Caffeine的异步淘汰清理机制 在惰性删除实现机制这边&#xff0c;Caffeine做了一些改进优化以提升在并发场景下的性能表现。我们可以和Guava Cache的基于容量大小的淘汰处理做个对比。 当限制了Guava Cache最大容量之后&#xff0c;有新的记录写入超过了总大小&#xff0c;会…

HTML---表单详解

目录 一、表单介绍 二、表单元素 1&#xff1a;input输入表单元素 &#xff08;1&#xff09; text和password &#xff08;2&#xff09;radio和checkbox &#xff08;3&#xff09;button 2&#xff1a;label标签 3&#xff1a;select下拉表单元素 4&#xff1a;textar…

喜报 | 强强联手,这件大事终于有着落了

近日&#xff0c;擎创科技与国产数据库领先品牌——达梦数据库达成战略合作伙伴关系&#xff0c;双方将在品牌、产品、技术、渠道等方面进行全方位合作&#xff0c;共同完成产品整合、资源共享、联合方案等事宜&#xff1b;共同赋能于金融、能源、交通等行业的数字化转型&#…

2019年1+X 证书 Web 前端开发中级理论考试题目原题+答案——第一套

&#x1f4da;文章目录 &#x1f3af;关于1X标准 &#x1f3af;关于中级考点 ⏩&#x1f4bb;答案速查 一、单选题&#xff08;每小题2分&#xff0c;共30小题&#xff0c;共60分&#xff09; 二、多选题&#xff08;每小题2分&#xff0c;共15小题&#xff0c;共30分&…

Java入门-Java语言概述

1、Java语言基本概述 1.1、什么是计算机编程语言 人与人之间是如何沟通的呢&#xff1f;从小父母就教会我们说话&#xff0c;在长期的熏陶和自我学习中&#xff0c;我们就学会了普通话&#xff0c;学会了表达自己的需求&#xff0c;父母收到我们的信号或者听到我们的要求也会尽…

C# 自定义控件

一 自定义控件 1 自定义控件的三种方式&#xff1a; 1&#xff09;复合控件&#xff1a;将标准控件组合起来 class YourControl:UserControl{}2) 扩展控件&#xff1a;继承于标准控件 class YourControl:Button{}3) 自定义控件&#xff1a;完全地自定义一个控件 class You…

CSSStyleSheet 对象(css 样式表)- 你不知道的有趣功能

1.概念 CSSStyleSheet 对象 代表着&#xff0c;css文件被浏览器解析后生成的css样式表。 CSS 样式表由 CSS 规则组成&#xff0c;可以通过 CSSRule 对象操作每条规则。CSSStyleSheet 对象允许您查询、插入和删除样式表规则。 例如&#xff1a;好玩儿的尝试&#xff08;改变页…

基于经验论述:实现k-NN算法

以兰普威尔小镇为例,那里的人们为他们的两支球队——兰普威尔红队和兰普威尔蓝队——而疯狂。红队已经存在很长时间了,人们很喜欢这支队伍。 但是后来,一些外地来的富翁买下了红队的最佳射手,成立了一支新的球队——蓝队。令多数红队球迷不满的是,这位最佳射手将继续带领蓝…

数据结构与算法_BST树_BST树的定义及删除操作

先写BST树的定义及特点&#xff0c;然后记录BST数的删除操作。 1 BST定义及特点 BST数是一棵特殊的二叉树&#xff0c;如何能得到一颗二叉搜索树呢&#xff1f;下面一个有序序列&#xff0c;经过二分搜索&#xff0c;得到的就是一颗BST树。根节点就是当前一轮要搜索的中间节点…

Cell子刊:器官再生,这种病可以让受损的肝脏再生

麻风病是由麻风杆菌引起的一种慢性传染病&#xff0c;主要病变在皮肤和周围神经。它是世界上最古老和最顽固的疾病之一&#xff0c;但引起它的细菌也可能具有令人惊讶的生长和再生重要器官的能力。器官再生是治疗疾病、损伤或衰老功能障碍的理想策略&#xff0c;尽管体外模型、…

linux-adnroid 键值枚举与注释

一、概述 没有找到直接的linux 键值枚举的注释。在android 官网linux-android健码网页里找到了这个映射关系。因为android列的比较多。去掉冗余摘取主要对比和注释进表格。 二、术语摘抄解释 HID 用法、Linux 键码和 Android 键码 系统根据抽象层使用几个不同的标识符来引用…

【服务器数据恢复】5节点Lustre分布式文件系统RAID5数据恢复案例

服务器数据恢复环境&#xff1a; 5台服务器节点&#xff0c;每台服务器节点配置一组RAID5&#xff0c;每组6块硬盘&#xff0c;其中1块设置为热备盘。 系统环境为Lustre分布式文件系统&#xff0c;5台服务器共同存储全部的数据文件。 服务器故障&检测&#xff1a; 机房漏水…

你被裁了需要知道的一些细节

前言 就在上周&#xff0c;得知自己要被裁了&#xff0c;理由是公司在疫情下的经济性裁员&#xff0c;在这里总结一下关于裁员过程中需要注意的一些细节。 关于工作交接 要在收到书面通知之后&#xff0c;再进行工作交接&#xff0c;否则可能面临的风险是公司卸磨杀驴。 关…

C++初阶 List的模拟实现

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者介绍&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;模拟STL中List的实现 List的模拟实现本篇博客目标节点类的实现构造函数迭代器类的实现迭代器类模拟实现的意义迭代器类的三个参数说明构造函数运算…

zabbix自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

内容预知 1.自定义监控内容 监控案例1&#xff1a;登录人数检测 具体步骤 步骤一&#xff1a;在客户端创建自定义 key 步骤二&#xff1a;在 Web 页面创建自定义监控项模板 &#xff08;1&#xff09;创建模板 &#xff08;2&#xff09;创建应用集&#xff08;用于管理…

《数据结构》顺序表ArrayList

《数据结构》顺序表ArrayList 文章目录《数据结构》顺序表ArrayList什么是顺序表:模拟实现顺序表(以int类型为例)详解ArrayList:ArrayList实现的接口:ArrayList的构造方法:对源码的解析:ArrayList的方法ArrayList的扩容机制ArrayList的缺陷什么是顺序表: 顺序表是用一段物理地…