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电子书籍、简历模板等硬核资源

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

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

相关文章

【业务功能篇77】微服务-OSS对象存储-上传下载图片

3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了&#xff0c;这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件&#xff0c;图片&#xff0c;文本等…

Django基础3——视图函数

文章目录 一、基本了解1.1 Django内置函数1.2 http请求流程 二、HttpRequest对象&#xff08;接受客户端请求&#xff09;2.1 常用属性2.2 常用方法2.3 服务端接收URL参数2.4 QueryDict对象2.5 案例2.5.1 表单GET提交2.5.2 表单POST提交2.5.3 上传文件 三、HttpResponse对象&am…

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09; 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09;预测效果基本介绍模型介绍程序设计参…

【AWS】安装配置适用于 Eclipse 的 AWS 工具包

目录 0.环境 1.步骤 1&#xff09;安装Eclipse 2&#xff09;安装AWS工具包 ① 在这个路径下点开安装软件的界面 ② 点击【Add】打开添加窗口 ③ 输入aws的工具包地址 ④ 勾选需要的工具&#xff0c;点击【Next】 ⑤ 将要安装的工具&#xff0c;点击【Next】 ⑥ 选择接受…

当 SQL Server(mssql-jdbc) 遇上 BigDecimal

需求背景 系统对接了外部系统&#xff0c;调用外部系统的接口需要付费&#xff0c;一个接口一次调用付费 0.03 元 同一个月内&#xff0c;同一个接口最高付费 25 元 统计每个月的付费情况 需求清楚了不&#xff1f;不清楚&#xff1f; 给大家举个案例 这下明白了吧 明白了需求&…

一文速学-让神经网络不再神秘,一天速学神经网络基础-激活函数(二)

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理) em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

【Ubuntu20.04安装Nvidia驱动、CUDA和CUDNN】

Ubuntu20.04安装Nvidia驱动、CUDA和CUDNN 1 Nvidia驱动安装1.1 安装1.2 安装Nvidia可能会遇到的问题1.2.1 NVIDIA 驱动与 Nouveau 驱动不兼容1.2.2 ERROR: Unable to find the development tool cc 2 CUDA安装2.1 下载和安装2.2 配置CUDA环境 3 安装CUDNN4 切换CUDA版本 1 Nvid…

Java基础之IO流File类创建及删除

1.File类概述及构造方法 2.File类创建功能 文件创建成功&#xff01; 如果文件不存在&#xff0c;就创建文件&#xff0c;并返回true 如果文件存在&#xff0c;就不创建文件&#xff0c;并返回false 如果文件夹不存在&#xff0c;就创建文件夹&#xff0c;并返回true 如果文件…

【【Verilog典型电路设计之CORDIC算法的Verilog HDL 实现】】

Verilog典型电路设计之CORDIC算法的Verilog HDL 实现 典型电路设计之CORDIC算法的Verilog HDL 实现 坐标旋转数字计算机CORDIC(Coordinate Rotation Digital Computer)算法&#xff0c;通过移位和加减运算&#xff0c;能递归计算常用函数值&#xff0c;如sin&#xff0c;cos,…

Elasticsearch 集成---框架集成SpringData-集成测试-索引操作

1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…

如何安装指定版本node.js,安装旧版本node

1、查看当前是否安装node&#xff0c;如果安装了需要先卸载当前版本node 搜索控制面板 -> 找到程序/卸载程序 -> 在里面找到node -> 然后右击卸载 2、卸载完成后就要安装其他版本得node.js 找到想要安装的对应版本&#xff0c;安装.msi格式的安装包 注&#xff…