欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PostgreSql?JDBC事務(wù)操作方法詳解

 更新時間:2022年11月16日 17:31:56   作者:Zeuss  
這篇文章主要為大家介紹了PostgreSql?JDBC事務(wù)操作方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

JDBC事務(wù)相關(guān)方法簡介

本文將借助示例,簡單講解下JDBC操作Pg事務(wù)的流程。

首先來簡單講解下事務(wù)的定義:為了確保兩個(多個)數(shù)據(jù)庫操作都生效,或者兩個操作都不發(fā)生,可以使用事務(wù)。根據(jù)定義,事務(wù)是作為單個單元執(zhí)行的一組語句。換句話說,要么所有語句都成功執(zhí)行,要么沒有執(zhí)行。

禁用自動提交模式

當建立與PostgreSQL數(shù)據(jù)庫的連接時,它處于自動提交模式。這意味著每個SQL語句都被視為事務(wù)并自動提交。

如果要在事務(wù)中封裝一個或多個語句,則必須禁用自動提交模式。為此,我們可以調(diào)用Connection.setAutoCommit()方法來修改SQL提交模式:

Connection.setAutoCommit(false);

最佳做法是僅對事務(wù)模式禁用自動提交模式。它避免為多個語句保留數(shù)據(jù)庫鎖。

提交事務(wù)

要提交事務(wù),請調(diào)用Connection對象的commit方法,如下所示:

Connection.commit();

當調(diào)用commit()方法,所有前面的SQL語句作為一個單元一起提交。

回滾事務(wù)

既然使用了事務(wù),那我們肯定會有回滾的時候,我們可以使用rollback()方法來中止當前事務(wù)并將值恢復為原始值。

Connection.rollback();

PostgreSQL JDBC 事務(wù)示例

讓我們舉一個使用JDBC API執(zhí)行PostgreSQL事務(wù)的示例。

首先,創(chuàng)建一個表示ProRank的實體類,如下所示:

import lombok.Data;
@Data
public class ProRank {
    Integer id;
    String name;
    String team;
    String line;
    Integer rank;
}

然后,編寫以下代碼,供我們測試事務(wù)操作。

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.sql.*;
@SpringBootTest
class JdbcTrasationTests {
    private final String url = "jdbc:p6spy:postgresql://localhost:5432/postgres";
    private final String user = "postgres";
    private final String password = "112233";
    /**
     * 連接PostgreSql數(shù)據(jù)庫
     *
     * @return Connection
     * @throws SQLException
     */
    public Connection connect() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
    @Test
    void testTrasation() {
        ProRank proRank = new ProRank();
        proRank.setLine("Mid");
        proRank.setName("Faker");
        proRank.setTeam("T1");
        proRank.setRank(0);
        //調(diào)用
        addProAndUpdateRank(proRank,2222);
    }
    /**
     * 關(guān)閉一個AutoCloseable對象
     *
     * @param closeable
     */
    private void close(AutoCloseable closeable) {
        try {
            if (closeable != null) {
                closeable.close();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    /**
     * 插入一條選手記錄,更新他的rank值
     *
     * @param proRank
     * @param rank
     */
    public void addProAndUpdateRank(ProRank proRank, Integer rank) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2 = null;
        ResultSet rs = null;
        // 插入一條數(shù)據(jù)
        String SQL = "INSERT INTO pro_rank(name,team,line,rank) VALUES(?,?,?,?)";
        // 更新他的rank值
        String SQLUpdateRank = "UPDATE pro_rank SET rank = ? WHERE id = ?;";
        int id = 0;
        try {
            // 鏈接數(shù)據(jù)庫
            conn = connect();
            conn.setAutoCommit(false);
            // 插入一條數(shù)據(jù)
            pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(1, proRank.getName());
            pstmt.setString(2, proRank.getTeam());
            pstmt.setString(3, proRank.getLine());
            pstmt.setInt(4, proRank.getRank());
            int affectedRows = pstmt.executeUpdate();
            // 判斷是否生效
            if (affectedRows > 0) {
                // 獲取返回的id
                rs = pstmt.getGeneratedKeys();
                if (rs.next()) {
                    id = rs.getInt(1);
                    if (id > 0) {
                        pstmt2 = conn.prepareStatement(SQLUpdateRank);
                        pstmt2.setInt(2, id);
                        pstmt2.setInt(1, rank);
                        pstmt2.executeUpdate();
                    }
                }
            } else {
                // 如果新增數(shù)據(jù)失敗,回滾
                conn.rollback();
            }
            // 提交事務(wù)
            conn.commit();
            System.out.println("插入選手數(shù)據(jù)成功!更新選手rank成功,數(shù)據(jù)id:" + id);
        } catch (SQLException sqlException) {
            System.out.println(sqlException.getMessage());
            sqlException.printStackTrace();
            // 回滾事務(wù)
            System.out.println("回滾事務(wù)...");
            try {
                if (conn != null) {
                    conn.rollback();
                }
            } catch (SQLException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        } finally {
            close(rs);close(pstmt);close(pstmt2);close(conn);
        }
    }
}

讓我們看一下上面的代碼,他包含三個方法

connect() 方法建立與數(shù)據(jù)庫連接,并返回連接對象。

close() 方法關(guān)閉數(shù)據(jù)庫操作可關(guān)閉的對象,如Resultset、Statement和Connection。

addProAndUpdateRank()方法插入新的選手,并在事務(wù)中更新選手的rank字段。此方法包含邏輯如下:

  • 首先,在pro_rank表中插入一條新的選手數(shù)據(jù)。
  • 接下來,獲取新插入的選手數(shù)據(jù)的id
  • 然后,更新插入選手的rank值。
  • 之后,如果步驟2和3均成功,則提交事務(wù)。否則,回滾事務(wù)
  • 最后,關(guān)閉ResultSet、PreparedStatement和Connection對象。

如果我們在第一個場景中執(zhí)行程序,我們會得到以下結(jié)果:

插入選手數(shù)據(jù)成功!更新選手rank成功,數(shù)據(jù)id:14

我們可以通過查詢pro_rank表格,來查看上述代碼執(zhí)行結(jié)果:

SELECT * FROM "public"."pro_rank" LIMIT 1000 OFFSET 0;

現(xiàn)在,讓我們測試一下事務(wù)回滾的情況,比如,我們可以在插入一條數(shù)據(jù)的時候,將name字段賦值為超出數(shù)據(jù)庫長度的字串,運行程序結(jié)果如下:

ERROR: value too long for type character varying(7)

事務(wù)將回滾,并且沒有任何內(nèi)容插入pro_rank表

以上就是PostgreSql JDBC事務(wù)操作方法詳解的詳細內(nèi)容,更多關(guān)于PostgreSql JDBC事務(wù)操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PostgreSQL ROW_NUMBER() OVER()的用法說明

    PostgreSQL ROW_NUMBER() OVER()的用法說明

    這篇文章主要介紹了PostgreSQL ROW_NUMBER() OVER()的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • postgresql 12版本搭建及主備部署操作

    postgresql 12版本搭建及主備部署操作

    這篇文章主要介紹了postgresql 12版本搭建及主備部署操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL入門簡介

    PostgreSQL入門簡介

    PostgreSQL是一個免費的對象-關(guān)系型數(shù)據(jù)庫服務(wù)器(ORDBMS),遵循靈活的開源協(xié)議BSD。這篇文章主要介紹了PostgreSQL入門簡介,需要的朋友可以參考下
    2020-12-12
  • Mac OS上安裝PostgreSQL的教程

    Mac OS上安裝PostgreSQL的教程

    今天我們來看在Mac OS上安裝PostgreSQL的教程,這里我們通過brew包管理器來安裝,所以首先我們會講解brew的安裝配置:
    2016-06-06
  • postgresql 性能參數(shù)配置方式

    postgresql 性能參數(shù)配置方式

    這篇文章主要介紹了postgresql 性能參數(shù)配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL中的template0和template1庫使用實戰(zhàn)

    PostgreSQL中的template0和template1庫使用實戰(zhàn)

    這篇文章主要介紹了PostgreSQL中的template0和template1庫使用實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL查詢和處理JSON數(shù)據(jù)

    PostgreSQL查詢和處理JSON數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于PostgreSQL查詢和處理JSON數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • postgresql 實現(xiàn)sql多行語句合并一行

    postgresql 實現(xiàn)sql多行語句合并一行

    這篇文章主要介紹了postgresql 實現(xiàn)sql多行語句合并一行的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL 安裝和簡單使用

    PostgreSQL 安裝和簡單使用

    ostgreSQL是現(xiàn)在比較流行的數(shù)據(jù)庫之一,這個起源于伯克利(BSD)的數(shù)據(jù)庫研究計劃目前已經(jīng)衍生成一項國際開發(fā)項目,并且有非常廣泛的用戶。
    2009-08-08
  • Postgresql中null值和空字符串舉例詳解

    Postgresql中null值和空字符串舉例詳解

    在使用?PostgreSql時,實際場景中會出現(xiàn)某個字段為空或空字符串,下面這篇文章主要給大家介紹了關(guān)于Postgresql中null值和空字符串的相關(guān)資料,需要的朋友可以參考下
    2024-02-02

最新評論