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 进行下载。

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

 3.3.2 安装

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

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

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

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

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

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

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

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

 3.3.3 打开pgAdmin4

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

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

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

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

然后点击【OK】即可。

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

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

4.Spring Boot中集成与使用

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

4.1 创建SpringBoot项目

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

4.2 引入依赖

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

        
            org.postgresql
            postgresql
            runtime
        


        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.2.0
        

        这里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...】选项即可,截图如下演示。

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

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

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

4.3.2 创建表

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

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

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

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

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

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

4.3.3 创建表字段

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

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

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

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")],如果你不指定,必定会导致如下报错。

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

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 {

    @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));
    }

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

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

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

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

 4.6.2 删操作

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

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

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

Spring Boot进阶(58):集成PostgreSQL数据库及实战使用 | 万字长文,超级详细_第17张图片很明显,是执行成功了。 

 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());
    }

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

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

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

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

 4.6.4 查操作

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

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

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

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

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

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

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

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

 ...

        好啦,到这里我们就已经大概都讲解完了,觉得讲的不错的希望不要吝啬你手中的大拇哥呢,给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电子书籍、简历模板等硬核资源

你可能感兴趣的:(SpringBoot零基础入门,postgresql,spring,boot,PostgreSQL,数据库)