宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見(jiàn)問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

使用PostgreSQL數(shù)據(jù)庫(kù)

管理 管理 編輯 刪除

在如今的關(guān)系型數(shù)據(jù)庫(kù)中,有兩個(gè)開(kāi)源產(chǎn)品是你必須知道的。其中一個(gè)是MySQL,相信很多朋友都不陌生,因?yàn)橹暗腟pring Boot關(guān)于關(guān)系型數(shù)據(jù)庫(kù)的所有例子都是對(duì)MySQL來(lái)介紹的。而今天我們將介紹另外一個(gè)開(kāi)源關(guān)系型數(shù)據(jù)庫(kù):PostgreSQL,以及在Spring Boot中如何使用。

PostgreSQL簡(jiǎn)介

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

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

PostgreSQL的優(yōu)勢(shì)

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

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

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

下載與安裝

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

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

注意:我們這里選擇用13.4版本來(lái)完成下面的實(shí)驗(yàn)

安裝完成后,打開(kāi)pgAdmin。因?yàn)樽詭Я私缑婊墓芾砉ぞ撸匀绻阌眠^(guò)mysql等任何關(guān)系型數(shù)據(jù)庫(kù)的話(huà),基本不用怎么學(xué),就可以上手使用了。

4b113202501161732535790.png

Spring Boot中如何使用

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

第一步:創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot項(xiàng)目

第二步:在pom.xml中引入訪(fǎng)問(wèn)PostgreSQL需要的兩個(gè)重要依賴(lài):

<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ù)訪(fǎng)問(wèn)封裝框架,比如:MyBatis等,具體根據(jù)你使用習(xí)慣來(lái)替換依賴(lài)即可。因?yàn)橐呀?jīng)是更上層的封裝,所以基本使用與之前用MySQL是類(lèi)似的,所以你也可以參考之前MySQL的文章進(jìn)行配置,但數(shù)據(jù)源部分需要根據(jù)下面的部分配置。

第三步:在配置文件中為PostgreSQL數(shù)據(jù)庫(kù)配置數(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)建用戶(hù)信息實(shí)體,映射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)建用戶(hù)信息實(shí)體的增刪改查

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);

}

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

@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));

        // 測(cè)試findAll, 查詢(xún)所有記錄
        Assertions.assertEquals(10, userRepository.findAll().size());

        // 測(cè)試findByName, 查詢(xún)姓名為FFF的User
        Assertions.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());

        // 測(cè)試findUser, 查詢(xún)姓名為FFF的User
        Assertions.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());

        // 測(cè)試findByNameAndAge, 查詢(xún)姓名為FFF并且年齡為60的User
        Assertions.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());

        // 測(cè)試刪除姓名為AAA的User
        userRepository.delete(userRepository.findByName("AAA"));

        // 測(cè)試findAll, 查詢(xún)所有記錄, 驗(yàn)證上面的刪除是否成功
        Assertions.assertEquals(9, userRepository.findAll().size());

    }

}

把單元測(cè)試跑起來(lái):

4931e20250116173410291.png

一切順利的話(huà),因?yàn)檫@里用的是create策略,所以表還在,打開(kāi)pgAdmin,可以看到user_info表自動(dòng)創(chuàng)建出來(lái)了,里面的數(shù)據(jù)也可以查到,看看跟單元測(cè)試的邏輯是否符合。
f81dc202501161734181921.png

注:本文轉(zhuǎn)載自“程序猿DD”,如有侵權(quán),請(qǐng)聯(lián)系刪除!

請(qǐng)登錄后查看

哈哈哈醬 最后編輯于2025-01-16 17:34:59

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
759
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見(jiàn)問(wèn)題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢(xún)熱線(xiàn) 咨詢(xún)熱線(xiàn)

400-8888-794

微信掃碼咨詢(xún)

CRMEB開(kāi)源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服