乐趣区

关于java: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,设置拜访明码和端口即可)。

下载地址:https://www.enterprisedb.com/…

留神:因为 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 等,具体依据你应用习惯来替换依赖即可。因为曾经是更下层的封装,所以根本应用与之前用 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 表主动创立进去了,外面的数据也能够查到,看看跟单元测试的逻辑是否合乎。

思考一下

如果您之前有读过本系列教程中对于 MySQL 的 10 多篇应用案例,再看这篇应用 PostgreSQL 的案例,是不是感觉差异十分小?其实真正变动的局部次要是两个中央:

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

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

好了,明天的学习就到这里!如果您在学习过程中遇到困难?能够退出咱们超高品质的 Spring 技术交换群,参加交换与探讨,更好的学习与提高!更多 Spring Boot 教程能够点击中转!,欢送珍藏与转发反对!

代码示例

本文的残缺工程能够查看上面仓库中 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,分享其余中央看不到的常识与思考

退出移动版