在如今的关系型数据库中,有两个开源产品是你必须知道的。其中之一是MySQL。相信关注我的小伙伴们一定不陌生,因为之前SpringBoot的关系型数据库的例子都是介绍到MySQL的。今天我们将介绍另一个开源关系型数据库:PostgreSQL,以及如何在SpringBoot中使用它。PostgreSQL简介在学习PostgreSQL的时候,我们总是将它与MySQL进行比较:MySQL号称是最流行的开源数据库,而PostgreSQL号称是最先进的开源数据库,那么究竟先进到什么程度呢?让我们一起来了解一下吧!PostgreSQL是一个免费的软件对象关系数据库管理系统(ORDBMS),具有非常完整的功能。它是一个基于POSTGRES4.2版的对象关系数据库管理系统,由美国加州大学计算机科学系开发。POSTGRES的许多领先概念相对较晚才出现在商业Web数据库中。PostgreSQL支持大部分SQL标准,并提供许多其他现代特性,例如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以通过多种方式进行扩展,例如通过添加新的数据类型、函数、运算符、聚合函数、索引方法、过程语言等。此外,由于灵活的许可,任何人都可以出于任何目的自由使用、修改和分发PostgreSQL。PostgreSQL的优点由于它和MySQL一样,都是关系型数据库,所以我们需要了解什么时候用MySQL,什么时候用PostgreSQL。那么简单介绍一下PostgreSQL相对于MySQL的优势。如果你有这些需求,那么选择PostgreSQL比MySQL更好。否则,最好选择MySQL:支持存储一些特殊的数据类型,如:array、json、jsonb,对地理信息的存储和处理有更好的支持,因此可以成为空间数据库,更好地管理数据测量和几何拓扑分析,并快速构建RESTAPI。通过PostgREST,可以方便的为任何PostgreSQL数据库提供RESTfulAPI服务支持树结构,可以更方便的处理具有此类特性的数据存储外部数据源支持,可以使用MySQL、Oracle、CSV、Hadoop等作为表在自己的数据库查询和索引更强的支持,PostgreSQL支持B-tree、hash、R-tree和Gist索引。而MySQL依赖于存储引擎。MyISAM:BTREE,InnoDB:BTREE。事务隔离更好。MySQL的事务隔离级别repeatableread无法阻止常见的并发更新,需要加锁,但悲观锁会影响性能,手动实现乐观锁比较复杂。但是PostgreSQL列中隐藏了一个乐观锁版本字段,默认的可重复读级别可以保证并发更新的正确性,具有乐观锁的性能。时间精度更高,可以精确到秒以内。角色支持更好。在MySQL中,显示emoji需要utf8mb4。PostgreSQL没有这个坑的存储方式来支持更大的数据量。可以支持比MySQL更大的数据量。序列支持更好。MySQL不支持多个表从同一个序列中获取id。PostgreSQL可以更轻松地添加列。MySQL表加列基本上就是重建表和索引,这会花费很长时间。向PostgreSQL表中添加列只会将表定义添加到数据字典中,而不会重建表。这里只是开发人员关注的一些优势,还有一些其他的优势。读者可以查看这篇文章以获得更详细的解读。下载安装读者可以通过以下链接获取PostgreSQL各版本的安装程序。安装过程这里不再详细描述。相信大家可以按照安装程序的提示完成安装(一路next,设置访问密码和端口即可)。下载地址:https://www.enterprisedb.com/...注:由于14是今天刚发布的版本,为了避免SpringBoot的兼容性问题,仍然使用之前的13.4版本完成以下实验。安装完成后,打开pgAdmin。因为自带界面化的管理工具,如果你用过mysql等关系型数据库,不用多学也能上手使用。如何在SpringBoot中使用在安装完PostgreSQL之后,我们来尝试在SpringBoot中使用PostgreSQL数据库。第一步:创建一个基本的SpringBoot项目(如果还没有,可以参考这篇文章:快速入门)第二步:在pom.xml中引入访问PostgreSQL的两个重要依赖:org。springframework.bootspring-boot-starter-data-jpaorg.postgresqlpostgresql<范围>runtime需要postgresql的地方,spring-boot-starter-data-jpa也可以换成其他数据访问封装框架,比如:MyBatis等,看你的使用习惯它来替换依赖项。因为已经是上层包了,基本用法和之前的MySQL类似,所以也可以参考之前的MySQL文章进行配置,只是数据源部分需要按照下面的部分进行配置。第三步:在配置文件中配置PostgreSQL数据库的数据源和JPA的必要配置。spring.datasource.url=jdbc:postgresql://localhost:5432/testspring.datasource.username=postgresspring.datasource.password=123456spring.datasource.driver-class-name=org.postgresql.Driversspring.jpa.properties.hibernate。dialect=org.hibernate.dialect.PostgreSQLDialectspring.jpa.properties.hibernate.hbm2ddl.auto=create第四步:创建用户信息实体并映射user_info表(最终完成可在pgAdmin中查看)@Entity@Data@NoArgsConstructorpublic类UserInfo{@Id@GeneratedValueprivateLongid;私有字符串名称;私人整数年龄;publicUserInfo(Stringname,Integerage){this.name=name;这个。年龄=年龄;}}第五步:创建用户信息实体CRUDpublicinterfaceUserInfoRepositoryextendsJpaRepository{UserInfofindByName(Stringname);UserInfofindByNameAndAge(Stringname,Integerage);@Query("fromUserInfouwhereu.name=:name")UserInfofindUser(@Param("name")Stringname);}第六步:创建单元测试,尝试增删改查。@Slf4j@SpringBootTest公共类ApplicationTests{@AutowiredprivateUserInfoRepositoryuserRepository;@Testpublicvoidtest()throwsException{//创建10条记录userRepository.save(newUserInfo("AAA",10));userRepository.save(newUserInfo("BBB",20));userRepository.save(newUserInfo("CCC",30));userRepository.save(newUserInfo("DDD",40));userRepository.save(newUserInfo("EEE",50));userRepository.save(newUserInfo("FFF",60));userRepository.save(newUserInfo("GGG",70));userRepository.save(newUserInfo("HHH",80));userRepository.save(newUserInfo("III",90));userRepository.save(newUserInfo("JJJ",100));//测试findAll,查询所有记录Assertions.assertEquals(10,userRepository.findAll().size());//测试findByName,查询名字为FFF的UserAssertions.assertEquals(60,userRepository.findByName("FFF").getAge().longValue());//测试findUser,查询用户断言.assertEquals(60,userRepository.findUser("FFF").getAge().longValue());//测试findByNameAndAge,查询UserAssertions.assertEquals("FFF",userRepository.findByNameAndAge("FFF",60).getName());//测试删除名为AAA的UseruserRepository.delete(userRepository.findByName("AAA"));//测试findAll,查询所有记录,验证上面删除是否成功Assertions.assertEquals(9,userRepository.findAll().size());}}运行单元测试:如果一切顺利,因为这里使用了create策略,表还在,打开pgAdmin,可以看到自动创建了user_info表,也可以找到里面的数据看是否符合单元测试的逻辑想一想,如果你之前看过本系列教程中MySQL的10多个用例,再看这个使用PostgreSQL的案例,你是不是觉得差别很小?其实真正的变化主要在两个地方:数据库驱动依赖数据源的配置信息,而对于上层的数据操作,变化不大,尤其是在使用SpringDataJPA时,这是抽象的魅力!你意识到了吗?好了,今天的学习就到这里!如果您在学习过程中遇到困难?可以加入我们超优质的Spring技术交流群,参与交流讨论,更好的学习进步!更多SpringBoot教程可直接点击!,欢迎收藏和转发支持!代码示例本文的完整工程可以在下面仓库的2.x目录下查看chapter6-4工程:Github:https://github.com/dyc87112/SpringBoot-Learning/Gitee:https://gitee.com/didispace/SpringBoot-Learning/如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!参考资料:https://baike.baidu.com/item/...https://www.biaodianfu.com/my...欢迎关注我的公众号:程序员DD,分享你看不到的别处的知识和思维