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

news2025/1/19 10:33:59

 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.Driver
    url: jdbc:postgresql://localhost:5432/pg_test
    username: postgres
    password: 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
    @GeneratedValue
    private 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 增操作

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

    @Test
    public 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进行数据查询
    @Test
    public void deleteByIdTest() {
        Assertions.assertEquals(1, pgUserRepository.deleteById(1));
    }

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

很明显,是执行成功了。 

 4.6.3 改操作

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

    //根据指定id进行数据修改
    @Test
    public 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进行数据查询
    @Test
    public void queryByNameTest() {
        PgUser pgUser = pgUserRepository.findUser("bug菌");
        System.out.println(pgUser.toString());
    }

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

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

    //根据指定name和age组合进行数据查询
    @Test
    public 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.coloradmin.cn/o/925955.html

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

相关文章

照片怎么转换成pdf?几种照片转pdf方法看一看

照片怎么转换成pdf&#xff1f;照片转换成PDF是一个非常有用的技能&#xff0c;可以将多张照片合并为一个文件&#xff0c;方便保存和分享。现在也有很多方法可以将照片转换为PDF&#xff0c;下面就给大家介绍几种转换方法。 转换方法一&#xff1a;迅捷PDF转换器 这是一款功能…

GPT---1234

GPT:《Improving Language Understanding by Generative Pre-Training》 下载地址:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdfhttps://cdn.openai.com/research-covers/language-unsupervised/language_understa…

前端遇到困扰怎么办?10年前端在线帮您解决问题,只需一杯下午茶

前端遇到困扰怎么办&#xff1f;10年前端在线帮您解决问题&#xff0c;只需一杯下午茶

Ceph入门到精通-基于ECMP的多活负载均衡策略

本文简单介绍一下&#xff0c;如何基于ECMP&#xff0c;使用QuaggaLVSKeepalived构建多活负载均衡方案 1. 背景介绍 负载均衡&#xff0c;主要用于大规模分布式集群下&#xff0c;提供高性能服务。为了给负载均衡器提供高可用&#xff0c;一般利用主备或者主主模式实现。主备模…

前端三剑客入门一文解决

文章目录 HTML快速开发网站Flask页面结构标签基础标签超链接图片列表下拉框表格input系列多行文本form表单 网络请求HTML案例 CSSCSS盒模型CSS样式定义CSS选择器 CSS样式使用1. 在标签上直接写2. 在head标签中写3.写到css文件中 标签样式1. 高度和宽度2. 块级和行内标签3.字体设…

原生微信小程序使用 wxs;微信小程序使用 vant-weapp组件

1.原生微信小程序使用 wxs 1.内嵌 WXS 脚本 2. 定义外链 wxs 3. 使用外连wxs 在这里插入图片描述 2. 微信小程序使用 vant weapp 1.安装步骤 2. 安装包管理(package.json)文件的方法 操作顺序 &#xff1a;文档地址 如果使用 typescript 需要操作步骤3&#xff0c;否则不…

go语言kafka入门

消息队列&#xff1a;一种基于异步通信的解耦机制&#xff0c;用于在应用程序或系统组件之间传递消息和数据 消息队列相关概念&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1a;生成并发送消息到消息队列中的应用程序或系统组件。 消费者&#xff08;Consumer&…

Node基础--WebStorm整合Node

通过上面的课程,我们对Node有了一个初步的体验,下面我们就把Node和开发工具WebStrom进行整合。 1.安装开发工具WebStrom (1).查找官方下载地址: https://www.jetbrains.com/webstorm/ (2).下载之后开始点击安装 (3).设置安装路径。注意:安装路径自定义 (4).按照自己的…

vue 简单实验 自定义组件 独立模块

1.概要 2.代码 2.1 const Counter {data() {return {counter: 0}},template:<div>Counter: {{ counter }}</div> }export default Counter 2.2 import Counter from ./t2.jsconst app Vue.createApp({components: {component-a: Counter} })app.mount(#count…

C - 滑动窗口 /【模板】单调队列

Description 有一个长为 n 的序列 a&#xff0c;以及一个大小为 k 的窗口。现在这个从左边开始向右滑动&#xff0c;每次滑动一个单位&#xff0c;求出每次滑动后窗口中的最大值和最小值。 例如&#xff1a; The array is [1,3,−1,−3,5,3,6,7] and k3。 Input 输入一共有…

ssm农产品仓库管理系统系统源码和论文

ssm农产品仓库管理系统系统源码和论文064 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 选题的背景 中国是一个农产品生产的大国&#xff0c;可利用的农产品资源相对贫乏&#xff0c;传统的单纯依靠大量物质…

k3s or RKE2 helm安装报错dial tcp 127.0.0.1:8080: connect: connection refused

1.报错&#xff1a; Error: INSTALLATION FAILED: Kubernetes cluster unreachable: Get "http://127.0.0.1:8080/version": dial tcp 127.0.0.1:8080: connect: connection refused 2.问题原因&#xff1a; 1.因为helm默认使用k8s的配置文件&#xff0c;默…

华为云服务器如何安装多个数据库

由于我的项目对数据库版本有限制&#xff0c;需要在先前安装5.7的基础上再安装一个8.0.28版本的数据库。 安装5.7版本数据库的过程&#xff1a;华为云服务器部署mysql_瓜是西瓜的瓜的博客-CSDN博客 1、安装前准备 服务器版本&#xff1a;CentOS 7 将/etc/selinux/config里的…

最新Rimini主题 1.3.0 资源付费WordPress主题下载

RiMini主题介绍&#xff0c;支持微信&#xff0c;支付宝官方支付接口&#xff0c;个人PAYJS&#xff0c;虎皮椒&#xff0c;码支付&#xff0c;免登录购买&#xff0c;会员中心&#xff0c;支付齐全&#xff0c;体验超速&#xff0c;简单粗暴&#xff0c;支付接口齐全&#xff…

【日常积累】Linux下ftp服务安装

概述 FTP是一种在互联网中进行文件传输的协议&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21号端口&#xff0c;其中端口20用于进行数据传输&#xff0c;端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中&#xff0c;具有容易搭建、方…

[Go版]算法通关村第十三关白银——数字数学问题之数组实现加法、幂运算

目录 数组实现加法专题题目&#xff1a;数组实现整数加法思路分析&#xff1a;数组末尾开始&#xff0c;逐个元素1&#xff0c;10就进位&#xff0c;!10就退出复杂度&#xff1a;时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( n ) O(n) O(n)Go代码 题目&#xff1a;字符串加法…

Navicat导出Postgres表结构并在新环境导入

0、背景及环境 背景 工程升级&#xff0c;新增了一些表。需要把这些表在生产环境中创建。故此写一下操作示例笔记。 工具 Navicat、postgres数据库 1、导出 1.1、打开想要导出表结构的数据库&#xff0c;找到表 1.2、右键目标表选择导出类型 Structure Only 只导出表结构…

c语言调用mciSendString播放音乐

如下所示&#xff0c;这是一个使用c语言调用系统方法mciSendString()&#xff0c;让系统播放音乐的示例&#xff1a; baihuaxiang 代码&#xff1a; #include <graphics.h> #include <Windows.h> #include <mmsystem.h>#pragma comment(lib,"WINMM.LIB…

【C++】抽象类

2023年8月25日&#xff0c;周五上午 目录 声明抽象类 抽象类的特点 举例说明 声明抽象类 要在C中声明一个抽象类&#xff0c;要求类中至少有一个纯虚函数。 在C中&#xff0c;一个类如果包含至少一个纯虚函数&#xff0c;那么这个类就被称为抽象类。 总结起来&#xff0c…

天眼查接口 查询企业信息API 企查查接口

item_get-获得tyc详情 tyc.item_get 公共参数 请求地址: https://api-gw.cn/tyc/item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff0…