Spring Boot中使用PostgreSQL数据库
2021/11/5 19:10:00
本文主要是介绍Spring Boot中使用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,设置访问密码和端口即可)。
注意:因为14是今天刚发布的版本,为避免Spring Boot的兼容问题,还是选用之前的13.4版本来完成下面的实验。
安装完成后,打开pgAdmin。因为自带了界面化的管理工具,所以如果你用过mysql等任何关系型数据库的话,基本不用怎么学,就可以上手使用了。
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等,具体根据你使用习惯来替换依赖即可。
第三步:在配置文件中为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表自动创建出来了,里面的数据也可以查到,看看跟单元测试的逻辑是否符合。
思考一下
如果您之前有读过本系列教程中关于MySQL的10多篇使用案例,再看这篇使用PostgreSQL的案例,是不是感觉差别非常小?其实真正变动的部分主要是两个地方:
- 数据库驱动的依赖
- 数据源的配置信息
而对于更为上层的数据操作,其实并没有太大的变化,尤其是当使用Spring Data JPA的时候,这就是抽象的魅力所在!你体会到了吗?
这篇关于Spring Boot中使用PostgreSQL数据库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南