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

Spring Boot进阶(58):集成PostgreSQL数据库及实战使用 | 万字长文,超级详细

 1. 前言🔥 

        PostgreSQL是一种广泛使用的开源关系型数据库,具有可靠性高、性能优异、拥有丰富的数据类型和扩展等优点,越来越多的企业和开发者开始使用它来存储和管理数据。而Spring Boot是一种快速开发的框架,可以简化开发过程并提高开发效率。本文将介绍如何使用Spring Boot集成PostgreSQL数据库,以及实战中该如何使用它来进行开发。无论是初学者还是有一定经验的开发者,都可以从中获得一些实用的技巧和经验。

        那么,这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!! 

2. 环境说明🔥

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. 正文🔥 

3.1 PostgreSQL简介

        虽然MySQL与PostgreSQL都是免费、开源、强大、且功能丰富的数据库,但是在学习PostgreSQL数据库之前,我们总会将其与MySQL数据库进行一番对比。MySQL自称是最流行的开源数据库,而PostgreSQL标榜自己是最先进的开源数据库,那么PostgreSQL到底有多先进呢?下面就让我们一起来认识一下。

        PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统,是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。

3.2 PostgreSQL的优势

        既然与MySQL同为关系型数据库,那在什么场景选择MySQL,什么场景选择PostgreSQL呢?这是我们需要去思考的点,PostgreSQL对比 MySQL来说,都有哪些优势,如果你有这些需求,那么选择PostgreSQL肯定优于MySQL,反之则MySQL数据库更佳。

接下来我给同学们大概总结下PostgreSQL都有那些优势:

  • 支持存储一些特殊的数据类型,比如:array、json、jsonb等。
  • 对地理信息的存储与处理有更好的支持,所以它可以成为一个空间数据库,更好的管理数据测量和几何拓扑分析。
  • 可以快速构建REST API,通过PostgREST可以方便的为任何PostgreSQL数据库提供RESTful API的服务。
  • 支持树状结构,可以更方便的处理具备此类特性的数据存储。
  • 外部数据源支持,可以把MySQL、Oracle、CSV、Hadoop等当成自己数据库中的表来进行查询。
  • 对索引的支持更强,PostgreSQL支持 B-树、哈希、R-树和 Gist 索引。而MySQL取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。
  • 事务隔离更好,MySQL 的事务隔离级别repeatable read并不能阻止常见的并发更新,得加锁才可以,但悲观锁会影响性能,手动实现乐观锁又复杂。而 PostgreSQL 的列里有隐藏的乐观锁 version 字段,默认的 repeatable read 级别就能保证并发更新的正确性,并且又有乐观锁的性能。
  • 时间精度更高,可以精确到秒以下。
  • 字符支持更好,MySQL里需要utf8mb4才能显示emoji,PostgreSQL没这个坑。
  • 存储方式支持更大的数据量,PostgreSQL主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
  • 序列支持更好,MySQL不支持多个表从同一个序列中取id,而PostgreSQL可以。
  • 增加列更简单,MySQL表增加列,基本上是重建表和索引,会花很长时间。PostgreSQL表增加列,只是在数据字典中增加表定义,不会重建表。

        总而言之,很多时候公司来择选,对某个软件使用的熟练程度要比特性上的原因更重要。比如很多公司喜欢使用PostgreSQL,因为它的可靠性好,在保护数据方面很擅长,而且是个社区项目,不会陷入厂商的牢笼之中;但MySQL更加灵活,提供了更多选项来针对不同的任务进行裁剪。所以,各有千秋,并不存在哪一个数据库能够适用于所有情况。

3.3 下载与安装

        这里针对Windows10系统为例,下载PostgreSQL及如何进行安装,如下是官网版本下载截图,为了避免与Spring Boot存在版本兼容问题,我们这里就选用PostgreSQL13.11版本来进行案例演示。

3.3.1 官网下载

        打开官网下载链接,然后选择PostgreSQL13.11 点击Windows x86-64 进行下载。

 3.3.2 安装

        下载完后,进行PostgreSQL的安装。这里我就不一一演示了,

其中安装路径及设置数据库密码,这里我们优先选择存放在非C盘位置。

 接着设置数据库密码,我们默认123456 ;毕竟好记。

        然后一路next即可,端口号【5432】你们设置默认。 

        最后点击Finish即可完成安装。

 3.3.3 打开pgAdmin4

        稍等几分钟后即可安装完成,然后从[开始]找到【PostgreSQL13】附带有个pgAdmin4。因为安装PostgreSQL客户端就自带了界面化的管理工具,所以说如果你用过MySql等任何关系型数据库的话,基本上你不用怎么入门学习,直接上手操作。

         然后选择PostgreSQL13,这里输入你安装时设置的密码【123456】,左下角勾选上【Save Password】,这样每次就不需要额外输入密码了。

然后点击【OK】即可。

 如上就已经完全安装完成了,可供项目连接使用了。

4.Spring Boot中集成与使用🔥

        在你的本地安装好了PostgreSQL之后,接下来我们就在Spring Boot项目中实战使用PostgreSQL数据库。

4.1 创建SpringBoot项目

创建一个基础的Spring Boot项目(如果你还不会,可以参考我的这篇文章:快速入门)

4.2 引入依赖

在你的项目pom.xml中引入访问PostgreSQL所需要的两个重要依赖:其中Mybatis你可以替换成jpa

        <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>

        这里PostgreSQL依赖是必定要导入的,mybatis-plus-boot-starter 依赖你还可以替换成其他的数据访问封装框架,比如:Mybatis、Jpa等,具体根据你的使用习惯来定。因为已经是更上层的封装,所以基本使用与MySQL是类似的,所以你可以参考我之前MySQL的文章进行配置,但有一点,指定数据源连接部分请参考如下:

spring:datasource:driver-class-name: org.postgresql.Driverurl: jdbc:postgresql://localhost:5432/pg_testusername: postgrespassword: 123456

4.3 创建数据库

        在创建表格之前,需要先创建一个数据库。可以使用命令行或者pgAdmin4等数据库管理工具来创建。这里我们就直接在pgAdmin4可视化工具上进行创建。

4.3.1 创建Database

        这里直接选择Databases ,然后右键即可看到【Create】选项,我们选择【Databes...】选项即可,截图如下演示。

 接着设置数据库名,其他的默认即可。

4.3.2 创建表

        创建完数据库后,我们打开依次打开 pg_test  --> Schemas(1)--> public --> Tables

 接着选择【Tables】右击,选择【Create】--> 【Table...】

 先设置表名及描述,截图请参考如下:

4.3.3 创建表字段

        接着在创建表的页面上进行表字段的创建,同页切换到【Colums】即可。如下按字段依次添加设置,最后点击Save。

到此,数据库及表就创建完成了,接下来我们就可以通过项目来进行测试了。

4.4 创建用户信息实体

        这里我们举例创建一个用户实体,映射到user表(最后完成可在pgAdmin4中查看)

package com.example.demo.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Id;import javax.persistence.GeneratedValue;@Data
@NoArgsConstructor//无参构造
@TableName("public.pg_user") //指定是public下的pg_user
public class PgUser {@Id@GeneratedValueprivate Long id;private String name;private Integer age;public PgUser(Long id,String name, Integer age) {this.id = id;this.name = name;this.age = age;}public PgUser(String name, Integer age) {this.name = name;this.age = age;}}

需要注意的是:这里必须指定表名[@TableName("public.pg_user")],如果你不指定,必定会导致如下报错。

4.5 创建增删改查接口

        这里我们创建两个接口供查询。

package com.example.demo.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.PgUser;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.stereotype.Component;import java.awt.*;/*** @author luoYong* @version 1.0* @date 2023/8/7 17:36*/
@Component
public interface PgUserRepository extends BaseMapper<PgUser> {@Select("select * from public.pg_user where name=#{name} and age=#{age}")PgUser findByNameAndAge(@Param("name")String name,@Param("age")Integer age);@Select(" select * from public.pg_user where name= #{name}")PgUser findUser(@Param("name") String name);
}

4.6 创建单元测试

        这里我们直接创建测试用户实体增删改查的测试类,具体如下:

4.6.1 增操作

        这里我们对表进行数据插入,如下是插入数据代码演示:

    @Testpublic void insertTest() throws Exception {pgUserRepository.insert(new PgUser(1L, "赵云", 8));pgUserRepository.insert(new PgUser(2L, "黄忠", 34));pgUserRepository.insert(new PgUser(3L, "张飞", 27));pgUserRepository.insert(new PgUser(4L, "貂蝉", 31));pgUserRepository.insert(new PgUser(5L, "关羽", 66));}

执行测试用例成功截图,请看: 

 我们也可以打开pgAdmin4,手写sql查询语句进行验证。

 4.6.2 删操作

通过指定id进行对数据进行删除,具体测试用例如下:

    //根据指定id进行数据查询@Testpublic void deleteByIdTest() {Assertions.assertEquals(1, pgUserRepository.deleteById(1));}

 执行完后我们可以看下控制台,指定id=1的这条数据是否被成功执行删除?

很明显,是执行成功了。 

 4.6.3 改操作

        通过指定id进行对数据进行修改,具体测试用例如下:

    //根据指定id进行数据修改@Testpublic void updateById() {PgUser pgUser = pgUserRepository.selectById(1);System.out.println("修改前:" + pgUser.toString());pgUser.setAge(100);pgUser.setName("bug菌");Assertions.assertEquals(1, pgUserRepository.updateById(pgUser));System.out.println("修改后:" + pgUser.toString());}

执行完后我们可以看下控制台,新旧数据是够被更新成功?

 我们也可以打开pgAdmin4,手写sql查询一波进行验证,数据是我们修改后的数据。

 4.6.4 查操作

这里我们通过指定name进行查询,具体测试用例如下:

    //根据指定name进行数据查询@Testpublic void queryByNameTest() {PgUser pgUser = pgUserRepository.findUser("bug菌");System.out.println(pgUser.toString());}

 执行完后我们可以看下控制台,name = "bug菌"的数据成功被查询到?

 再来写个组合查询语句,例如通过 name 和 age组合查询,大家请看:

    //根据指定name和age组合进行数据查询@Testpublic void queryByNameAndAgeTest() {PgUser pgUser = pgUserRepository.findByNameAndAge("bug菌",100);System.out.println(pgUser.toString());}

 执行完后我们可以看下控制台,也是成功拿到了该条数据。

 ...

        好啦,到这里我们就已经大概都讲解完了,觉得讲的不错的希望不要吝啬你手中的大拇哥呢,给bug菌点个赞,就是我写作的最大动力。

5. 热文推荐🔥

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由

Spring Boot进阶(02):使用Validation进行参数校验

Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充

Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页

Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务

Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端

Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出

Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出

Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出

Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件

Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?

Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?

Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你

Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息

Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?

Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息

Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?

Spring Boot进阶(19):Spring Boot 整合ElasticSearch

Spring Boot进阶(20):配置Jetty容器

Spring Boot进阶(21):配置Undertow容器

Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析

Spring Boot进阶(23):实现文件上传

Spring Boot进阶(24):如何快速实现多文件上传?

Spring Boot进阶(25):文件上传的单元测试怎么写?

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学

Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)

Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存

Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示

Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示

...

6. 文末🔥

        如果想系统性的学习Spring Boot,小伙伴们直接订阅bug菌专门为大家创建的Spring Boot专栏《滚雪球学Spring Boot》从入门到精通,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。

        如果你有一定的基础却又想精进Spring Boot,那么《Spring Boot进阶实战》将会是你的最好的选择;此栏进行知识点+实例+项目的学习方式全面深入框架剖析及各种高阶玩法,励志打造全网最全最新springboot学习专栏,投资学习自己性价比最高。

        本文涉及所有源代码,均已上传至github开源,供同学们一对一参考,GitHub,同时,原创开源不易,欢迎给个star🌟,想体验下被加Star的感jio,非常感谢 ❗

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源

相关文章:

Spring Boot进阶(58):集成PostgreSQL数据库及实战使用 | 万字长文,超级详细

1. 前言&#x1f525; PostgreSQL是一种广泛使用的开源关系型数据库&#xff0c;具有可靠性高、性能优异、拥有丰富的数据类型和扩展等优点&#xff0c;越来越多的企业和开发者开始使用它来存储和管理数据。而Spring Boot是一种快速开发的框架&#xff0c;可以简化开发过程并提…...

Java | 使用ServerSocket查找TCP可用端口

关注&#xff1a;CodingTechWork 引言 在项目开发中&#xff0c;有一个程序是专门给服务下发tcp端口占用的&#xff0c;但是tcp端口有时候会被其他服务给占用&#xff0c;此时端口就会冲突。本文提供一个工具类进行端口占用判断并返回可用端口。 代码 工具类 Slf4j public …...

【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式

C#高级主题涉及到更复杂、更灵活的编程概念和技术&#xff0c;能够让开发者更好地应对现代软件开发中的挑战。其中&#xff0c;LINQ查询和表达式是C#高级主题中的一项关键内容&#xff0c;具有以下重要性和优势&#xff1a; 数据处理和操作&#xff1a; 在现代软件中&#xff…...

【Git】git clone --depth 1 浅克隆

问题 PycharmProjects git clone git Cloning into risk-package... remote: Counting objects: 576, done. error: pack-objects died of signal 947/574) error: git upload-pack: git-pack-objects died with error. fatal: git upload-pack: aborting due to possible r…...

搭建 Gitlab

当设置和配置 GitLab 实例并执行诸如创建群组、项目、用户和上传代码等操作时&#xff0c;涉及到多个步骤&#xff0c;每个步骤都有特定的目的。让我们逐步解释每个步骤并说明其背后的原因&#xff1a; 安装必需的软件&#xff1a; yum install -y curl policycoreutils-python…...

CTFhub-sqli注入-报错注入

用到的函数 updatexml(1&#xff0c; &#xff0c;1) concat(0x7e, ,0x7e) group_concat(目标值) right(&#xff0c;32) 1 1 1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 1 union select updatexml(1,concat(0x7e,(select(group_concat(ta…...

中国人民大学与加拿大女王大学金融硕士让金融界短暂迷茫的你发现新的方向

此刻金融职场的你已经站在了金融金字塔的哪个层级&#xff1f;是正在金融界不断的改变自己&#xff0c;迎接着一个又一个的挑战成为了职场精英&#xff1f;还是转行的想法不断敲打着你&#xff0c;但是又不知道自己该干什么&#xff0c;能干什么&#xff0c;发现自己的职业核心…...

PHPEXCEL 导出excel

$styleArray [alignment > [horizontal > Alignment::HORIZONTAL_CENTER,vertical > Alignment::VERTICAL_CENTER],];$border_style [borders > [allborders > [style > \PHPExcel_Style_Border::BORDER_THIN ,//细边框]]];$begin_date $request->beg…...

Elasticsearch简介及安装

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…...

Spring、SpringMVC、SpringBoot三者的区别

目录 Spring是什么&#xff1f; SpringMVC是什么&#xff1f; SpringBoot是什么&#xff1f; Spring、SpringMVC、SpringBoot三者之间的关系 Spring是什么&#xff1f; Spring是一个开源的应用程序框架&#xff0c;它提供了一种简易的开发方式&#xff0c;通过依赖注入和面…...

探索PDF校对:为何这是现代数字文档的关键步骤

在今日的数字化浪潮中&#xff0c;文档的创建与分享从未如此频繁。尤其是PDF&#xff0c;作为一个普遍接受的标准文件格式&#xff0c;其在企业、学术和日常生活中的应用已经无处不在。但随之而来的挑战是如何确保文档的准确性和专业性。让我们深入探索PDF校对的重要性以及它为…...

linux 同时kill杀死多进程实践

使用场景 当程序中有使用到多进程且进程数较多的情况&#xff0c;如下图&#xff0c;且需要通过控制台杀死所有的 GSM_run.py 的进程时&#xff0c;利用 kill 命令一个一个的去结束进程是及其耗时且繁琐的&#xff0c;这时就需要我们的kill多进程的命令工作了。 批量 Kill 进程…...

全流程R语言Meta分析核心技术

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

打家劫舍00

题目链接 打家劫舍 题目描述 注意点 如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警0 < nums[i] < 400 解答思路 最初想的是使用深度优先遍历&#xff0c;到达任意一个位置时&#xff0c;小偷想要偷窃最高金额&#xff0c;一定要选择后面第2个房…...

​LeetCode解法汇总1267. 统计参与通信的服务器

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 这里有一幅…...

Go 语言在 Windows 上的安装及配置

1. Go语言的下载 Golang官网&#xff1a;All releases - The Go Programming Language Golang中文网&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 两个网站打开的内容只有语言不同而已&#xff0c;网站上清晰的标注了不同操作系统需要对应安装哪个版本&#xff0c;其中…...

如何在不使用任何软件的情况下将 PDF 转换为 Excel

通常&#xff0c;您可能会遇到这样的情况&#xff1a;您需要的数据不在 Excel 工作表中&#xff0c;而是以数据表形式出现在 PDF 文件中。为了将此数据放入 Excel 工作表中&#xff0c;如果您尝试将数字复制并粘贴到电子表格中&#xff0c;则列/行将无法正确复制和对齐。因此&a…...

【C语言】动态内存管理(malloc,free,calloc,realloc)-- 详解

一、动态内存分配 定义&#xff1a;动态内存分配 (Dynamic Memory Allocation) 就是指在程序执行的过程中&#xff0c;动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样&#xff0c;需要预先分配存储空间&#xff0c;而是由系统根据程…...

adb 命令

1.adb shell dumpsys activity top | find "ACTIVITY" 查看当前运行的activity包名 2.adb shell am start -n 包名/页面名 打开应用的页面 3.查看将要启动或退出app的包名 adb shell am monitor 只有在启动或退出的时候才会打印 4.查看当前启动应用的包名 ad…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

理想汽车5月交付40856辆,同比增长16.7%

6月1日&#xff0c;理想汽车官方宣布&#xff0c;5月交付新车40856辆&#xff0c;同比增长16.7%。截至2025年5月31日&#xff0c;理想汽车历史累计交付量为1301531辆。 官方表示&#xff0c;理想L系列智能焕新版在5月正式发布&#xff0c;全系产品力有显著的提升&#xff0c;每…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...