4

Spring Boot中使用PostgreSQL数据库

 2 years ago
source link: https://blog.csdn.net/dyc87112/article/details/120664545
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在如今的关系型数据库中,有两个开源产品是你必须知道的。其中一个是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是类似的,所以你也可以参考之前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表自动创建出来了,里面的数据也可以查到,看看跟单元测试的逻辑是否符合。

PostgreSQL pgAdmin

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

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

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

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

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

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

参考资料:

欢迎关注我的公众号:程序猿DD,分享其他地方看不到的知识与思考


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK