<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot中使用PostgreSQL數(shù)據(jù)庫

          共 7588字,需瀏覽 16分鐘

           ·

          2021-10-13 01:37

          在如今的關(guān)系型數(shù)據(jù)庫中,有兩個開源產(chǎn)品是你必須知道的。其中一個是MySQL,相信關(guān)注我的小伙伴們一定都不陌生,因為之前的Spring Boot關(guān)于關(guān)系型數(shù)據(jù)庫的所有例子都是對MySQL來介紹的。而今天我們將介紹另外一個開源關(guān)系型數(shù)據(jù)庫:PostgreSQL,以及在Spring Boot中如何使用。

          PostgreSQL簡介

          在學(xué)習(xí)PostgreSQL的時候,我們總是會將其與MySQL放一起來比較:MySQL自稱是最流行的開源數(shù)據(jù)庫,而PostgreSQL則標(biāo)榜自己是最先進(jìn)的開源數(shù)據(jù)庫,那么有多先進(jìn)呢?下面就一起認(rèn)識一下它!

          PostgreSQL是一種特性非常齊全的自由軟件的對象-關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS),是以加州大學(xué)計算機(jī)系開發(fā)的POSTGRES,4.2版本為基礎(chǔ)的對象關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。POSTGRES的許多領(lǐng)先概念只是在比較遲的時候才出現(xiàn)在商業(yè)網(wǎng)站數(shù)據(jù)庫中。PostgreSQL支持大部分的SQL標(biāo)準(zhǔn)并且提供了很多其他現(xiàn)代特性,如復(fù)雜查詢、外鍵、觸發(fā)器、視圖、事務(wù)完整性、多版本并發(fā)控制等。同樣,PostgreSQL也可以用許多方法擴(kuò)展,例如通過增加新的數(shù)據(jù)類型、函數(shù)、操作符、聚集函數(shù)、索引方法、過程語言等。另外,因為許可證的靈活,任何人都可以以任何目的免費(fèi)使用、修改和分發(fā)PostgreSQL。

          PostgreSQL的優(yōu)勢

          既然跟MySQL一樣,同為關(guān)系型數(shù)據(jù)庫,那么什么時候用MySQL,什么時候用PostgreSQL自然是我們需要去了解的。所以下面簡單介紹一下,PostgreSQL相比于MySQL來說,都有哪些優(yōu)勢,如果你有這些需求,那么選擇PostgreSQL就優(yōu)于MySQL,反之則還是選擇MySQL更佳:

          • 支持存儲一些特殊的數(shù)據(jù)類型,比如:array、json、jsonb
          • 對地理信息的存儲與處理有更好的支持,所以它可以成為一個空間數(shù)據(jù)庫,更好的管理數(shù)據(jù)測量和幾何拓?fù)浞治?/section>
          • 可以快速構(gòu)建REST API,通過PostgREST可以方便的為任何PostgreSQL數(shù)據(jù)庫提供RESTful API的服務(wù)
          • 支持樹狀結(jié)構(gòu),可以更方便的處理具備此類特性的數(shù)據(jù)存儲
          • 外部數(shù)據(jù)源支持,可以把MySQL、Oracle、CSV、Hadoop等當(dāng)成自己數(shù)據(jù)庫中的表來進(jìn)行查詢
          • 對索引的支持更強(qiáng),PostgreSQL支持 B-樹、哈希、R-樹和 Gist 索引。而MySQL取決于存儲引擎。MyISAM:BTREE,InnoDB:BTREE。
          • 事務(wù)隔離更好,MySQL 的事務(wù)隔離級別repeatable read并不能阻止常見的并發(fā)更新,得加鎖才可以,但悲觀鎖會影響性能,手動實現(xiàn)樂觀鎖又復(fù)雜。而 PostgreSQL 的列里有隱藏的樂觀鎖 version 字段,默認(rèn)的 repeatable read 級別就能保證并發(fā)更新的正確性,并且又有樂觀鎖的性能。
          • 時間精度更高,可以精確到秒以下
          • 字符支持更好,MySQL里需要utf8mb4才能顯示emoji,PostgreSQL沒這個坑
          • 存儲方式支持更大的數(shù)據(jù)量,PostgreSQL主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數(shù)據(jù)量。
          • 序列支持更好,MySQL不支持多個表從同一個序列中取id,而PostgreSQL可以
          • 增加列更簡單,MySQL表增加列,基本上是重建表和索引,會花很長時間。PostgreSQL表增加列,只是在數(shù)據(jù)字典中增加表定義,不會重建表。

          這里僅列舉了開發(fā)者視角關(guān)注的一些優(yōu)勢,還有一些其他優(yōu)勢讀者可查看這篇文章,獲得更詳細(xì)的解讀。

          下載與安裝

          讀者可以通過下面的鏈接獲取PostgreSQL各版本的安裝程序,這里不對安裝過程做詳細(xì)描述了,根據(jù)安裝程序的指引相信大家都能完成安裝(一路next,設(shè)置訪問密碼和端口即可)。

          下載地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

          注意:因為14是今天剛發(fā)布的版本,為避免Spring Boot的兼容問題,還是選用之前的13.4版本來完成下面的實驗。

          安裝完成后,打開pgAdmin。因為自帶了界面化的管理工具,所以如果你用過mysql等任何關(guān)系型數(shù)據(jù)庫的話,基本不用怎么學(xué),就可以上手使用了。

          PostgreSQL pgAdmin

          Spring Boot中如何使用

          在安裝好了PostgreSQL之后,下面我們嘗試一下在Spring Boot中使用PostgreSQL數(shù)據(jù)庫。

          第一步:創(chuàng)建一個基礎(chǔ)的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的還可以替換成其他的數(shù)據(jù)訪問封裝框架,比如:MyBatis等,具體根據(jù)你使用習(xí)慣來替換依賴即可。因為已經(jīng)是更上層的封裝,所以基本使用與之前用MySQL是類似的,所以你也可以參考之前MySQL的文章進(jìn)行配置,但數(shù)據(jù)源部分需要根據(jù)下面的部分配置。

          第三步:在配置文件中為PostgreSQL數(shù)據(jù)庫配置數(shù)據(jù)源、以及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

          第四步:創(chuàng)建用戶信息實體,映射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;
              }
          }

          第五步:創(chuàng)建用戶信息實體的增刪改查

          public interface UserInfoRepository extends JpaRepository<UserInfoLong{

              UserInfo findByName(String name);

              UserInfo findByNameAndAge(String name, Integer age);

              @Query("from UserInfo u where u.name=:name")
              UserInfo findUser(@Param("name") String name);

          }

          第六步:創(chuàng)建單元測試,嘗試一下增刪改查操作。

          @Slf4j
          @SpringBootTest
          public class ApplicationTests {

              @Autowired
              private UserInfoRepository userRepository;

              @Test
              public void test() throws Exception {
                  // 創(chuàng)建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表自動創(chuàng)建出來了,里面的數(shù)據(jù)也可以查到,看看跟單元測試的邏輯是否符合。

          PostgreSQL pgAdmin

          思考一下

          如果您之前有讀過本系列教程中關(guān)于MySQL的10多篇使用案例,再看這篇使用PostgreSQL的案例,是不是感覺差別非常小?其實真正變動的部分主要是兩個地方:

          1. 數(shù)據(jù)庫驅(qū)動的依賴
          2. 數(shù)據(jù)源的配置信息

          而對于更為上層的數(shù)據(jù)操作,其實并沒有太大的變化,尤其是當(dāng)使用Spring Data JPA的時候,這就是抽象的魅力所在!你體會到了嗎?

          好了,今天的學(xué)習(xí)就到這里!如果您在學(xué)習(xí)過程中遇到困難?可以到文末加入我們超高質(zhì)量的Spring技術(shù)交流群,參與交流與討論,更好的學(xué)習(xí)與進(jìn)步!

          代碼示例

          本文的完整工程可以查看下面?zhèn)}庫中2.x目錄下的chapter6-4工程:

          • Github:https://github.com/dyc87112/SpringBoot-Learning/
          • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

          如果您覺得本文不錯,歡迎Star支持,您的關(guān)注是我堅持的動力!

          參考資料:

          • https://baike.baidu.com/item/PostgreSQL
          • https://www.biaodianfu.com/mysql-vs-postgresql.html

          往期推薦

          聊聊前后端分離的接口規(guī)范

          校招黑名單!

          華為最美小姐姐,被外派墨西哥后...

          比Visio快10倍的畫圖工具來了!趕緊整上~

          因“薪水太高”被欠薪3個月、后又遭解雇?程序員憤怒反擊!


          技術(shù)交流群

          最近有很多人問,有沒有讀者交流群,想知道怎么加入。加入方式很簡單,有興趣的同學(xué),只需要點(diǎn)擊下方卡片,回復(fù)“加群,即可免費(fèi)加入我們的高質(zhì)量技術(shù)交流群!

          點(diǎn)擊閱讀原文,直達(dá)教程目錄

          瀏覽 41
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  西西4444www无码大胆 | 成人毛片18女人毛片真水 | 天天艹夜夜艹蜜桃 | 女人操逼网 | 免费播放欧美一级电影 |