当前位置: 首页 > news >正文

Spring Data JPA介绍与CRUD实战演练

文章目录

  • 一、Spring Data JPA 简介
  • 二、Spring Data JPA 与 MyBatis Plus 比较
    • 设计哲学和抽象层次
    • SQL 控制
    • 学习曲线和技术要求
    • 性能与优化
    • 综合考虑
  • 三、SpringDataJpa实战演练
    • 1. 创建user表
    • 2. 搭建Spring Boot开发环境
    • 3. pom.xml文件内容
    • 4. application.yml文件内容
    • 5. Application.java
    • 6. Result.java
    • 7. User.java
    • 8. UserRepository.java
    • 9. UserService.java
    • 10. UserController.java


一、Spring Data JPA 简介

Spring Data JPA 是 Spring 框架中的一个模块,它旨在简化 Java Persistence API (JPA) 的使用,进而简化数据访问层的开发。JPA 是 Java 平台上用于管理关系数据库的对象关系映射(ORM)的标准。而 Spring Data JPA 在此基础之上提供了额外的抽象层,允许开发者以更简洁的方式编写数据访问代码,无需手动编写大量的实现代码。

核心特点包括:

  1. 简化 CRUD 操作:通过继承 JpaRepository 或其他 Spring Data 提供的接口,你可以直接在自定义的 Repository 接口中声明方法,而无需编写实现。Spring Data JPA 会根据方法名自动生成查询语句。

  2. 方法命名查询:依据一定的命名规则,Spring Data JPA 能够根据 Repository 接口中的方法名称自动生成 SQL 或 HQL 查询语句,例如 findByUsernameAndPassword 会自动转换为寻找匹配用户名和密码的查询。

  3. 查询DSL:除了方法命名查询,它还提供了强大的查询dsl(领域特定语言),允许构建类型安全的复杂查询。

  4. 分页与排序:轻松实现数据的分页查询和排序功能。

  5. 事务管理:集成 Spring 的事务管理,使得数据操作更加安全可靠。

  6. 动态查询:支持 Criteria API 和 Specifications,可以构建复杂的动态查询条件。

  7. 减少样板代码:大量减少了传统 JPA 开发中需要编写的 DAO 层实现代码,提高开发效率。

  8. 扩展性:虽然提供了很多开箱即用的功能,但同时也允许开发者自定义查询逻辑,保持了高度的灵活性。

通过这些特性,Spring Data JPA 成为了快速开发 Java 应用,特别是那些需要与关系型数据库交互的应用的首选框架之一。开发者只需关注业务逻辑,而不必过多担忧数据访问层的细节。


二、Spring Data JPA 与 MyBatis Plus 比较

Spring Data JPA 和 MyBatis Plus 是两种不同的持久层框架,它们各有特色,适用于不同场景和需求。以下是它们之间的一些关键区别:

设计哲学和抽象层次

  • Spring Data JPA 基于 JPA 规范,提供了高度抽象的数据访问层,允许开发者以面向对象的方式操作数据库,减少了直接编写 SQL 的需要。它通过方法命名约定来自动生成查询,支持实体映射和事务管理,更适合那些希望快速开发、遵循 Java EE 标准且偏好 ORM(对象关系映射)的项目。

  • MyBatis Plus 则是对 MyBatis 的增强,它依然保留了 MyBatis 手动编写 SQL 的灵活性,同时加入了许多开箱即用的功能,如常见的 CRUD 操作、分页、性能优化等。MyBatis Plus 更加适合需要高度定制 SQL 查询、对性能有严格要求或者需要直接控制 SQL 执行的场景。

SQL 控制

  • Spring Data JPA 主要通过方法命名约定来自动生成 SQL,虽然也支持 @Query 注解来自定义 SQL,但其强项在于无须编写 SQL 即可完成大部分 CRUD 操作。

  • MyBatis Plus 支持 SQL 的完全自定义,这为开发者提供了更大的灵活性,特别是在处理复杂的联表查询和性能优化时更为明显。它还提供了 MapKey 注解等特性,便于在多表关联查询中进行数据关联。

学习曲线和技术要求

  • Spring Data JPA 因其高度抽象,初学者可能更容易上手,但深入理解和调试 ORM 映射问题可能需要更多专业知识。

  • MyBatis Plus 虽然需要手动编写 SQL,但对 SQL 较熟悉的开发者可能会觉得这种方式更直接、可控,学习成本相对较低,尤其是在已有 MyBatis 使用经验的基础上。

性能与优化

  • Spring Data JPA(及底层的 Hibernate)由于其抽象层次较高,可能会在某些简单查询上略逊于直接编写 SQL 的框架。但它提供了缓存管理、延迟加载等特性,对提高整体应用性能有帮助。

  • MyBatis Plus 直接控制 SQL,因此在查询优化和性能调优上有更多空间,特别是对于复杂的查询场景,能够通过精确控制 SQL 来达到更好的性能。

综合考虑

选择 Spring Data JPA 还是 MyBatis Plus,通常取决于项目的需求、团队的技术栈偏好以及对 SQL 控制的需求程度。如果项目追求快速开发、代码的简洁性,且对 SQL 的直接控制需求不高,Spring Data JPA 是个不错的选择。相反,如果项目需要复杂的 SQL 查询、高度的性能优化,或者团队更倾向于 SQL 的直接操控,MyBatis Plus 可能更加合适。在实际应用中,两者并非互斥,根据具体模块的需求混合使用也是常见做法。


三、SpringDataJpa实战演练

1. 创建user表

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=130 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

2. 搭建Spring Boot开发环境

目录结构如下:

springboot-template-jpa
│  pom.xml
│  springboot-template-jpa.iml
│
├─src
│  └─main
│      ├─java
│      │  └─com
│      │      └─zcs
│      │          │  Application.java
│      │          │
│      │          ├─common
│      │          │      Result.java
│      │          │
│      │          ├─config
│      │          ├─controller
│      │          │      UserController.java
│      │          │
│      │          ├─domain
│      │          ├─entity
│      │          │      User.java
│      │          │
│      │          ├─mapper
│      │          ├─repository
│      │          │      UserRepository.java
│      │          │
│      │          ├─service
│      │          │      UserService.java
│      │          │
│      │          └─utils
│      └─resources
│              application.yml

3. 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.15</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zcs</groupId><artifactId>springboot-template-jpa</artifactId><version>1.0.0</version><name>springboot-template</name><description>springboot-template</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></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-aop</artifactId></dependency><!-- 引入Spring Boot Actuator的起步依赖,用于监控和管理生产环境中的应用程序 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.3.0</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!-- 数据库驱动,例如MySQL --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version><scope>runtime</scope></dependency><!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 --><dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><version>21.5.0.0</version></dependency><!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc --><dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>9.4.1.jre8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.7</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.3.1</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

4. application.yml文件内容

server:port: 8090
---
spring:web:resources:static-locations: classpath:/static/datasource:dynamic:primary: master # 设置默认数据源strict: false # 设置严格模式,true则未匹配到数据源时抛异常,false则使用默认数据源datasource:master: # 池名称url: jdbc:mysql://192.168.145.103:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverdruid:validation-query: "select 1"
---
mybatis:configuration:map-underscore-to-camel-case: true
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
---
# 开启所有Actuator的端点暴露,以便可以通过HTTP进行访问
management:endpoints:web:exposure:include: "*"# 配置健康端点的详细程度,always表示总是显示完整的健康信息endpoint:health:show-details: always

5. Application.java

package com.zcs;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

6. Result.java

package com.zcs.common;import lombok.Data;@Data
public class Result<T> {private int code;private int success;private String msg;private T data;public Result(int code, String msg, int success) {this.code = code;this.msg = msg;this.success = success;}public Result(int code, String msg, int success, T data) {this.code = code;this.msg = msg;this.success = success;this.data = data;}public static <T> Result<T> success() {return new Result<>(200, "", 0);}public static <T> Result<T> success(String msg) {return new Result<>(200, msg, 0);}public static <T> Result<T> success(String msg, T data) {return new Result<>(200, msg, 0, data);}public static <T> Result<T> error(int code, String message) {return new Result<>(code, message, -1);}public static <T> Result<T> error(int code, String message, T data) {return new Result<>(code, message, -1, data);}
}

7. User.java

package com.zcs.entity;import lombok.Data;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Data
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;private Integer age;
}

8. UserRepository.java

package com.zcs.repository;import com.zcs.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Mapper
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(Integer id);}

9. UserService.java

package com.zcs.service;import com.zcs.entity.User;
import com.zcs.repository.UserRepository;
import org.springframework.data.domain.*;
import org.springframework.data.repository.query.FluentQuery;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.nio.file.DirectoryStream;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;@Service
public class UserService {@Resourceprivate UserRepository userRepository;public List<User> getAllUsers() {return userRepository.findAll();}public List<User> getAllUsersByIds(List<Integer> ids) {return userRepository.findAllById(ids);}public User getUserById(Integer id) {return userRepository.getUserById(id);}public User insertOrUpdateUser(User user) {return userRepository.save(user);}public User insertOrUpdateAndFlushUser(User user) {return userRepository.saveAndFlush(user);}public String deleteById(Integer id) {boolean b = userRepository.existsById(id);if (b) {userRepository.deleteById(id);return "数据删除成功";}return "要删除的数据不存在";}public boolean existsById(Integer id) {return userRepository.existsById(id);}public Optional<User> findOne(String name) {User probeUser = new User(); // 假设User类有name属性probeUser.setName(name); // 设置你想查询的名字// 创建一个ExampleMatcher来定义匹配规则,例如忽略大小写等ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreCase() // 忽略属性比较时的大小写.withStringMatcher(ExampleMatcher.StringMatcher.EXACT); // 使用"contains"方式匹配字符串// 创建Example实例Example<User> example = Example.of(probeUser, matcher);Function<FluentQuery.FetchableFluentQuery<User>, Optional<User>> one = FluentQuery.FetchableFluentQuery::first;// 使用findOne方法根据example查询return userRepository.findBy(example, one);}public Optional<User> getUserByName(String name) {User probeUser = new User(); // 假设User类有name属性probeUser.setName(name); // 设置你想查询的名字ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreCase() // 忽略大小写匹配.withStringMatcher(ExampleMatcher.StringMatcher.EXACT); // 精确匹配Example<User> example = Example.of(probeUser, matcher);Function<FluentQuery.FetchableFluentQuery<User>, Optional<User>> queryFunction = FluentQuery.FetchableFluentQuery::first;return userRepository.findBy(example, queryFunction);}public List<User> getAllUserByName(String name) {User probeUser = new User(); // 假设User类有name属性probeUser.setName(name); // 设置你想查询的名字ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreCase() // 忽略大小写匹配.withStringMatcher(ExampleMatcher.StringMatcher.EXACT); // 精确匹配Example<User> example = Example.of(probeUser, matcher);Function<FluentQuery.FetchableFluentQuery<User>, List<User>> all = FluentQuery.FetchableFluentQuery::all;return userRepository.findBy(example, all);}public List<User> getAllUserByNameAndAge(String name, Integer age) {User probeUser = new User(); // 假设User类有name属性probeUser.setName(name); // 设置你想查询的名字probeUser.setAge(age); // 设置你想查询的名字ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreCase() // 忽略大小写匹配.withStringMatcher(ExampleMatcher.StringMatcher.EXACT); // 精确匹配Example<User> example = Example.of(probeUser, matcher);// Function<FluentQuery.FetchableFluentQuery<User>, Optional<User>> queryFunction = query -> query.one();Function<FluentQuery.FetchableFluentQuery<User>, List<User>> all = FluentQuery.FetchableFluentQuery::all;// Function<FluentQuery.FetchableFluentQuery<User>, Stream<User>> stream = FluentQuery.FetchableFluentQuery::stream;return userRepository.findBy(example, all);}public Page<User> getUsers(int pageNumber, int pageSize) {// 创建Pageable对象,参数分别是页码(从0开始)和页面大小Pageable pageable = PageRequest.of(pageNumber, pageSize);// 调用findAll方法传入Pageable对象进行分页查询return userRepository.findAll(pageable);}
}

10. UserController.java

package com.zcs.controller;import com.zcs.common.Result;
import com.zcs.entity.User;
import com.zcs.repository.UserRepository;
import com.zcs.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;@Slf4j
@RestController
@RequestMapping("/users")
public class UserController {@Resourceprivate UserRepository userRepository;@Resourceprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}// 根据id查询user@GetMapping("/{id}")public Result<User> getById(@PathVariable Integer id) {User user = userRepository.findById(id).get();return Result.success("success", user);}// 查询user表的行数@GetMapping("/count")public Result<Long> count() {long count = userRepository.count();return Result.success("success", count);}// 根据name查询匹配到的第一条数据@GetMapping("/findOne")public Result<Optional<User>> findOne(@RequestParam String name) {Optional<User> userServiceOne = userService.findOne(name);return Result.success("success", userServiceOne);}// 根据id列表(用逗号分隔)查询user@GetMapping("/ids/{ids}")public Result<List<User>> getAllUsersByIds(@PathVariable List<Integer> ids) {List<User> allUsersByIds = userService.getAllUsersByIds(ids);return Result.success("success", allUsersByIds);}// 根据id查询user@GetMapping("/id/{id}")public Result<User> getUserById(@PathVariable Integer id) {User userById = userService.getUserById(id);return Result.success("success", userById);}// 根据name查询user匹配到的第一个数据@GetMapping("/getUserByName")public Result<Optional<User>> getUserByName(@RequestParam String name) {Optional<User> userByName = userService.getUserByName(name);return Result.success("success", userByName);}// 根据name查询匹配到的所有user@GetMapping("/getAllUserByName")public Result<List<User>> getAllUserByName(@RequestParam String name) {List<User> allUserByName = userService.getAllUserByName(name);return Result.success("success", allUserByName);}// 根据name和age查询匹配到的所有user@GetMapping("/getAllUserByNameAndAge")public Result<List<User>> getAllUserByNameAndAge(@RequestParam String name, @RequestParam Integer age) {List<User> allUserByName = userService.getAllUserByNameAndAge(name, age);return Result.success("success", allUserByName);}// 根据id查询数据是否存在@GetMapping("/exists/{id}")public Result<Boolean> existsById(@PathVariable Integer id) {boolean b = userService.existsById(id);return Result.success("success", b);}// 插入或更新user@PostMappingpublic Result<User> insertOrUpdateUser(@RequestBody User user) {User user1 = userService.insertOrUpdateUser(user);return Result.success("success", user1);}// 插入或更新user,且刷新@PutMappingpublic Result<User> insertOrUpdateAndFlushUser(@RequestBody User user) {User user1 = userService.insertOrUpdateAndFlushUser(user);return Result.success("success", user1);}// 根据id删除数据@DeleteMapping("/{id}")public Result<String> deleteById(@PathVariable Integer id) {String string = userService.deleteById(id);return Result.success("success", string);}// 分页查询@GetMapping("/page")public Result<Page<User>> getUsersByPage(@RequestParam int pageNumber, @RequestParam(defaultValue = "10") int pageSize) {Page<User> users = userService.getUsers(pageNumber, pageSize);return Result.success("success", users);}}

相关文章:

Spring Data JPA介绍与CRUD实战演练

文章目录 一、Spring Data JPA 简介二、Spring Data JPA 与 MyBatis Plus 比较设计哲学和抽象层次SQL 控制学习曲线和技术要求性能与优化综合考虑 三、SpringDataJpa实战演练1. 创建user表2. 搭建Spring Boot开发环境3. pom.xml文件内容4. application.yml文件内容5. Applicati…...

Python网络爬虫实战6—下一页,模拟用户点击,切换窗口

【前期提要】感兴趣的可以看看往期文章哈~ Python网络爬虫5-实战网页爬取 Python网络爬虫4-实战爬取pdf Pyhon网络爬虫3-模拟用户点击 Python网络爬虫实战2-下载url下的pdf Python网络爬虫基础1 1.需求背景 针对长虹美菱电器说明书网页形式&#xff0c;编写爬虫代码&#xff…...

Notepad++插件 Hex-Edit

Nptepad有个Hex文件查看器&#xff0c;苦于每次打开文件需要手动开插件显示Hex&#xff0c;配置一下插件便可实现打开即调用 关联多个二进制文件&#xff0c;一打开就使用插件的方法&#xff0c;原来是使用空格分割&#xff01;&#xff01;&#xff01;...

Matlab要这样批量读取txt数据!科研效率UpUp第10期

假如我们有多组txt格式的数据&#xff1a; 其数据格式是这样的&#xff1a; 想要批量读取这些数据&#xff0c;并把他们画在一张图上&#xff0c;该怎么操作呢&#xff1f; ​之前有分享load函数的版本&#xff0c;本期进一步分享适用性更强的readtable函数的实现方法​。 首…...

buuctf----firmware

- -一定不能再ubutu22进行,我是在18(血泪教训) binwalk安装 buuctf firmware(binwalk和firmware-mod-kit的使用)_buu firmware-CSDN博客 参考博客 指令 sudo apt-get update sudo apt-get install python3-dev python3-setuptools python3-pip zlib1g-dev libmagic-dev pi…...

ssl证书90天过期?保姆级教程——使用acme.sh实现证书的自动续期

腾讯云相关文档相关参考-有的点不准确 前言 最近https到期了&#xff0c;想着手动更新一下https证书&#xff0c;结果发现证书现在的有效期只有90天&#xff0c;于是想找到一个自动更新证书的工具&#xff0c;发现了acme.sh&#xff0c;但是网上的文章质量参差不齐&#xff0…...

由于bug造成truncate table卡住问题

客户反应truncate table卡主&#xff0c;检查awr发现多个truncate在awr报告期内一直没执行完&#xff0c;如下&#xff1a; 检查ash&#xff0c;truncate table表的等待事件都是“enq: RO - fast object reuse”和“local write wait” 查找“enq: RO - fast object reuse”&am…...

Charles抓包工具系列文章(二)-- Repeat 回放http请求

一、什么是http请求回放 当我们对客户端进行抓包&#xff0c;经常会想要重试http请求&#xff0c;或者改写原有部分进行重新请求&#xff0c;都需要用到回放http请求。 还有一种场景是压力测试&#xff0c;对一个请求进行重复请求多少次&#xff0c;并加上适当的并发度。 这里…...

jemeter基本使用

后端关验签&#xff0c;设置请求头编码和token 配置编码和token...

【Golang】Steam 创意工坊 Mod 文件夹批量重命名

本文将介绍一个使用Go语言编写的脚本&#xff0c;其主要功能是解析XML文件并基于解析结果重命名文件夹。这个脚本适用于需要对文件夹进行批量重命名&#xff0c;并且重命名规则依赖于XML文件内容的情况。 脚本功能概述 Steam创意工坊下载的Mod文件夹批量重命名为id名称 运行前…...

求职刷题力扣DAY33--贪心算法part04

DAY 33 贪心算法part04 1. 452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可…...

aws的eks(k8s)ingress+elb部署实践

eks&#xff08;k8s&#xff09;版本1.29 ingress 版本1.10.0 负载均衡elb 1. 创建Ingress-Nginx服务 部署项目地址【点我跳转】推荐自定义部署 可绑定acm证书什么的自己属性 这里就是aws上面Certificate Manager产品上面创建证书 导入 创建都行 对应集群版本推荐阵列GitH…...

大数据面试题之YARN

目录 1、介绍下YARN 2、YARN有几个模块 3、YARN工作机制 4、YARN有什么优势&#xff0c;能解决什么问题? 5、YARN容错机制 6、YARN高可用 7、YARN调度器 8、YARN中Container是如何启动的? 9、YARN的改进之处&#xff0c;Hadoop3.x相对于Hadoop 2.x? 10、YARN监控 1…...

最小生成树模板(prim,heap-prim,kruskal)

prim 出圈法&#xff0c;时间复杂度 O ( n 2 ) O(n^2) O(n2) #include<iostream> #include<vector> using namespace std; #define MAX_N 5000 #define inf 100000000 struct edge{int v,w; }; vector<edge>e[MAX_N5]; int d[MAX_N5],vis[MAX_N5]; int n,m…...

Centos 7 或 8配置国内yum源及epel源-1

官方教程 Yum工具详解 清理Yum缓存:[rootqfedu.com ~]# yum clean all缓存软件包信息: 提高搜索/安装软件的速度[rootqfedu.com ~]# yum makecache查询yum源信息: [rootqfedu.com ~]# yum repolist 查找软件:[rootqfedu.com ~]# yum search mysql 此命令会搜索到系…...

轻松解决Android复杂数据结构序列化

问题描述 当我编写quickupload库时&#xff0c;因为需要在 Service中进行上传任务&#xff0c;向Service传递时我发现需要传递的数据很多并且结构复杂&#xff0c;如果处理不好就会导致以下几个问题 耗时: 需要更多时间进行开发和测试以确保正确的数据处理。容易出错: 由于手…...

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片&#xff0c;由两种思路&#xff0c;一种是自己读取PDF文件中的图片&#xff0c;然后用OCR解析&#xff0c;例如&#xff1a;使用PyMuPDF读取pdf文件&#xff0c;再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…...

微信小程序表单

在我们的课程中&#xff0c;我们深入探讨了微信小程序表单的开发和应用。以下是我们课程的主要内容和收获&#xff1a; 一、课程目标 本课程旨在帮助学生掌握微信小程序表单的基本概念、开发流程和最佳实践。学生将学习如何创建和配置表单组件&#xff0c;处理表单数据&#xf…...

Javascript高级程序设计(第四版)--学习记录

var关键字&#xff1a;定义变量同时可以进行赋值 var message"hello" message 10 可以改变保存的值&#xff0c;也可以改变值的类型&#xff0c;但是不推荐这样写。 var声明的变量会成为包含它的函数的局部变量。 function test(){ var message "hello";…...

DVWA-CSRF-samesite分析

拿DVWA的CSRF为例子 接DVWA的分析&#xff0c;发现其实Impossible的PHPSESSID是设置的samesite1. 参数的意思参考Set-Cookie SameSite:控制 cookie 是否随跨站请求一起发送&#xff0c;这样可以在一定程度上防范跨站请求伪造攻击&#xff08;CSRF&#xff09;。 下面用DVWA CS…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...