李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 转载
  3. 技术
  4. 正文

Spring Boot 2.x使用PostgreSQL数据库

2021年10月9日 246 0 2
本文最后更新于 2021年10月12日,距今已 1851 天,其中的信息可能已经发生变化,请注意甄别。

在如今的关系型数据库中,有两个开源产品是你必须知道的。其中一个是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等任何关系型数据库的话,基本不用怎么学,就可以上手使用了。

PostgreSQL pgAdmin

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是类似的,但数据源部分需要根据下面的部分配置。

第三步:在配置文件中为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());
    }
}

 

把单元测试跑起来:

单元测试

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

 

原文链接:https://blog.didispace.com/spring-boot-learning-2-6-4/

参考链接

1
  1. 1https://www.enterprisedb.com/downloads/postgres-postgresql-downloadswww.enterprisedb.com
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

Spring Boot 2.x使用PostgreSQL数据库

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA PostgreSQL SpringBoot SQL
最后更新:2021年10月12日

岁月同一天 11 月 7 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月7日
    DeepSeek本地部署全攻略:从环境搭建到高级应用,打造专属 AI 助手

    DeepSeek 作为国产开源大模型的佼佼者,凭借出色的推理能力、代码生成效率和中文支持,成为很多开发者本地部署的首选。…

相关文章
  • Java进阶实战:10个高效技巧+环境管理指南,让代码简洁又优雅2025年12月12日
  • 解锁 Java 开发全流程效率:17 个必备工具深度指南2025年10月14日
  • 别再背线程池的七大参数了,现在面试官都这么问2025年5月15日
  • 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志2020年3月19日
  • Java中ArrayList为什么比LinkedList查询速度快?2020年5月16日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

  • 程序猿DDLv 1

    麻烦注明出处吧

    https://blog.didispace.com/spring-boot-learning-2-6-4/

    macOSmacOSChrome 93.0.4577.82Chrome 93.0.4577.82中国中国-上海
    2021年10月12日
    00 回复
    • 李锋镝博主

      @程序猿DD :tushe: 已更新!

      WindowsWindowsChrome 94.0.4606.71Chrome 94.0.4606.71中国中国-北京
      2021年10月12日
      00 回复
  • 曾虑多情损梵行,入山又恐别倾城。世间安得双全法,不负如来不负卿。

    听点儿音乐吧 朋友~
    文章目录
    最新 热点 随机
    最新 热点 随机
    给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
    给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了给服务器加了WAF游本昌去世关于主题加载速度优化的一点儿小演进
    从万级到千万级:排行榜系统的6种实现方案深度解析(含原理、优化与实战) Elasticsearch零停机迁移数据 SpringBoot 实现接口防刷的 5 种实现方案 你的答案 提示词工程终极指南:从入门到精通的全维度实战手册 Kubernetes(K8s)的Service运行原理
    最近评论
    fairy 发布于 18 小时前(11月06日) 机器人快来我这里吧!
    李锋镝 发布于 18 小时前(11月06日) 都是机器人,防不住
    李锋镝 发布于 18 小时前(11月06日) 是的,太烦了
    李锋镝 发布于 18 小时前(11月06日) 可以同一台服务器
    fairy 发布于 20 小时前(11月06日) 这流量,好厉害啊。我一年都没那么多
    标签聚合
    Theme AI编程 MySQL 日常 Spring AI K8s 分布式 IDEA JVM SpringBoot 架构 数据库 多线程 JAVA Claude SQL ElasticSearch WordPress Redis
    友情链接
    • 九仞之行
    • 韩小韩博客
    • lijie blog
    • 搬砖日记
    • Mr.Sun的博客
    • 瓦匠个人小站
    • 懋和道人
    • 知向前端
    • 彬红茶日记
    • 皮皮社
    • 老张博客
    • sssr7844的博客
    • 刘永博客
    • 志文工作室
    • Honesty
    • 哥斯拉
    • 韩情脉脉
    • 林羽凡
    • Serendipity

    COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

    lifengdi.com 十年之约虫洞

    Domain age badge for lifengdi.com

    Theme Kratos-plus By Dylan Li

    津ICP备2024022503号-3

    京公网安备11011502039375号