Spring Boot 2.x基础教程:使用PostgreSQL数据库

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Spring Boot 2.x基础教程:使用PostgreSQL数据库

在如今的关系型数据库中,有两个开源产品是你必须知道的。其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的。而今天我们将介绍另外一个开源关系型数据库:PostgreSQL,以及在Spring Boot中如何使用。

PostgreSQL简介

在学习PostgreSQL的时候,我们总是会将其与MySQL放一起来比较:MySQL自称是最流行的开源数据库,而PostgreSQL则标榜自己是最先进的开源数据库,那么有多先进呢?下面就一起认识一下它!

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

PostgreSQL的优势

既然跟MySQL一样,同为关系型数据库,那么什么时候用MySQL,什么时候用PostgreSQL自然是我们需要去了解的。所以下面简单介绍一下,PostgreSQL相比于MySQL来说,都有哪些优势,如果你有这些需求,那么选择PostgreSQL就优于MySQL,反之则还是选择MySQL更佳:

  • 支持存储一些特殊的数据类型,比如: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各版本的安装程序,这里不对安装过程做详细描述了,根据安装程序的指引相信大家都能完成安装(一路next,设置访问密码和端口即可)。

下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

注意:因为14是今天刚发布的版本,为避免Spring Boot的兼容问题,还是选用之前的13.4版本来完成下面的实验。

安装完成后,打开pgAdmin。因为自带了界面化的管理工具,所以如果你用过mysql等任何关系型数据库的话,基本不用怎么学,就可以上手使用了。

image.png

Spring Boot中如何使用

在安装好了PostgreSQL之后,下面我们尝试一下在Spring Boot中使用PostgreSQL数据库。

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

第二步:在pom.xml中引入访问PostgreSQL需要的两个重要依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

这里postgresql是必须的,spring-boot-starter-data-jpa的还可以替换成其他的数据访问封装框架,比如:MyBatis等,具体根据你使用习惯来替换依赖即可。因为已经是更上层的封装,所以基本使用与之前用MySQL是类似的,所以你也可以参考之前MySQL的文章进行配置,但数据源部分需要根据下面的部分配置。

第三步:在配置文件中为PostgreSQL数据库配置数据源、以及JPA的必要配置。

spring.datasource.url=jdbc:postgresql://localhost:5432/test
spring.datasource.username=postgres
spring.datasource.password=123456
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=create

第四步:创建用户信息实体,映射user_info表(最后完成可在pgAdmin中查看)

@Entity
@Data
@NoArgsConstructor
public class UserInfo {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private Integer age;
    public UserInfo(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

第五步:创建用户信息实体的增删改查

public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {
    UserInfo findByName(String name);
    UserInfo findByNameAndAge(String name, Integer age);
    @Query("from UserInfo u where u.name=:name")
    UserInfo findUser(@Param("name") String name);
}

第六步:创建单元测试,尝试一下增删改查操作。

@Slf4j
@SpringBootTest
public class ApplicationTests {
    @Autowired
    private UserInfoRepository userRepository;
    @Test
    public void test() throws Exception {
        // 创建10条记录
        userRepository.save(new UserInfo("AAA", 10));
        userRepository.save(new UserInfo("BBB", 20));
        userRepository.save(new UserInfo("CCC", 30));
        userRepository.save(new UserInfo("DDD", 40));
        userRepository.save(new UserInfo("EEE", 50));
        userRepository.save(new UserInfo("FFF", 60));
        userRepository.save(new UserInfo("GGG", 70));
        userRepository.save(new UserInfo("HHH", 80));
        userRepository.save(new UserInfo("III", 90));
        userRepository.save(new UserInfo("JJJ", 100));
        // 测试findAll, 查询所有记录
        Assertions.assertEquals(10, userRepository.findAll().size());
        // 测试findByName, 查询姓名为FFF的User
        Assertions.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());
        // 测试findUser, 查询姓名为FFF的User
        Assertions.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());
        // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User
        Assertions.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());
        // 测试删除姓名为AAA的User
        userRepository.delete(userRepository.findByName("AAA"));
        // 测试findAll, 查询所有记录, 验证上面的删除是否成功
        Assertions.assertEquals(9, userRepository.findAll().size());
    }
}

把单元测试跑起来:

image.png

一切顺利的话,因为这里用的是create策略,所以表还在,打开pgAdmin,可以看到user_info表自动创建出来了,里面的数据也可以查到,看看跟单元测试的逻辑是否符合。

image.png

思考一下

如果您之前有读过本系列教程中关于MySQL的10多篇使用案例,再看这篇使用PostgreSQL的案例,是不是感觉差别非常小?其实真正变动的部分主要是两个地方:

  1. 数据库驱动的依赖
  2. 数据源的配置信息

而对于更为上层的数据操作,其实并没有太大的变化,尤其是当使用Spring Data JPA的时候,这就是抽象的魅力所在!你体会到了吗?

好了,今天的学习就到这里!如果您在学习过程中遇到困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

代码示例

本文的完整工程可以查看下面仓库中2.x目录下的chapter6-4工程:

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

参考资料:



相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
25天前
|
SQL 数据库连接 API
Perl 教程 之 Perl 数据库连接 7
Perl DBI教程讲解了如何连接数据库,它是与数据库交互的标准接口,提供平台无关的访问。支持事务处理,可通过设置`AutoCommit =&gt; 0`在连接时开始事务或使用`$dbh-&gt;begin_work()`。事务结束后,用`commit`提交或`rollback`回滚。完成工作后,用`$dbh-&gt;disconnect`断开连接。
19 1
|
26天前
|
SQL 数据库连接 API
Perl 教程 之 Perl 数据库连接 4
Perl的DBI模块提供数据库独立接口,用于连接和操作数据库。通过prepare()预处理SQL,execute()执行,finish()释放句柄,及commit()提交事务。
13 1
|
29天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
43 0
|
1月前
|
SQL 关系型数据库 MySQL
2024年阿里云数据库创建_数据库账号密码和连接教程
阿里云数据库怎么使用?阿里云百科整理阿里云数据库从购买到使用全流程,阿里云支持MySQL、SQL Server、PostgreSQL和MariaDB等数据库引擎,阿里云数据库具有高可用、高容灾特性,阿里云提供数据库备份、恢复、迁移全套解决方案。详细阿里云数据库购买和使用流程方法如下
|
1月前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
371 3
|
8天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
24 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
10天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
【Spring系列】Sping VS Sping Boot区别与联系
|
17天前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
18天前
|
Java 测试技术 数据库
SpringBoot启动时设置不加载数据库
SpringBoot启动时设置不加载数据库
10 0
|
24天前
|
弹性计算 关系型数据库 MySQL
阿里云数据库服务器价格表,数据库创建、连接和使用教程
阿里云数据库使用流程包括购买和管理。选择所需数据库类型如MySQL,完成实名认证后购买,配置CPU、内存和存储。确保数据库地域与ECS相同以允许内网连接。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码连接。同一VPC内的ECS需添加至白名单以进行内网通信。参考官方文档进行详细操作。
125 3

热门文章

最新文章