JDBC編程:JDBC高級編程

  • 事物處理
  • 批量更新
  • 返回自動主鍵
  • DAO

1,事物處理

什麼是事物?java

事務(Transaction):數據庫中保證交易可靠的機制。JDBC支持數據庫中的事務概念,而且在JDBC中,事務默認是自動提交的。mysql

事務提交的方式有兩種:sql

  • 顯示提交:使用commit;
  • 自動提交:執行DDL或DCL語句,或者程序正常退出;

當事務所包含的任意一個數據庫操做執行失敗後,應該回滾事務(rollback),使該事務中所作的修改所有失效。數據庫

事務回滾有兩種方式:數組

  • 顯示回滾:使用rollback。
  • 自動回滾:系統錯誤或者強行退出。

事務特性介紹:(ACID) (1)原子性(Atomicity):事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行 (2)一致性(Consistency):事務在完成時,必須使全部的數據都保持一致狀態 (3)隔離性(Isolation):由併發事務所做的修改必須與任何其它併發事務所做的修改隔離 (4)持久性(Durability):事務完成以後,它對於系統的影響是永久性的 事務是數據庫的概念,JDBC支持事務,本質仍是在數據庫中實現的。併發

JDBC中和事務相關API:app

  • Connection.getAutoCommit() :得到當前事務的提交方式,默認爲true
  • Connection.setAutoCommit():設置事務的提交屬性,參數是true:自動提交;false:不自動提交
  • Connection.commit():提交事務
  • Connection.rollback():回滾事務

JDBC處理事務模式: (1)先將事務的自動提交關閉; (2)執行事務中的若干SQL語句; (3)事務提交;SQL失敗則回滾; (4)恢復JDBC的事務提交狀態;釋放資源。dom

事務隔離級別工具

事務的併發讀問題:性能

  • 髒讀:讀取到另外一個事務未提交更新數據,即讀取到了髒數據;
  • 不可重複讀:對同一記錄的兩次讀取不一致,由於另外一事物對該記錄作了修改;
  • 幻讀(虛讀):對同一張表的兩次查詢不一致,由於零壹拾伍插入了一條記錄;

四大隔離級別

四個等級的事務隔離級別,在相同數據環境下,使用相同的輸入,執行相同的工具,根據不一樣的隔離級別,能夠致使不一樣的結果。不一樣事務隔離級別可以解決的數據併發問題的能力是不一樣的。

  • SERIAUZABLE(串行化):不會出現任何併發性問題,由於它是對同一數據的訪問是串行的,非併發訪問的。 性能最差

  • REPEATABLEREAD(可重複讀):防止髒讀和不可重複讀,不能處理幻讀問題。性能比SERIAUZABLE好

  • READCOMMITTED(讀已提交數據):防止髒讀,沒有處理不可重複讀,也沒有處理幻讀。性能比REPEATABLEREAD。

  • READUNCOMMITTED(讀未提交數據):可能出現任何事物併發問題,性能最好;

2,批量更新

批量更新主要方法:

  • PreparedStatement.addBatch():將多條預編譯的SQL語句,添加到語句列表中。
  • PreparedStatement.executeBatch():把語句列表中的全部SQL語句,發送給數據庫處理。
  • PreparedStatement.clearBatch():清空當前SQL語句列表。

批量添加:

public int[] insBatch() {
        Connection connection = null;
        Statement statement = null;
        String sql = "";
        try {
            //獲取數據鏈接
            connection = basicUse.getConnection();
            //獲取發送sql指令執行sql對象
            statement = connection.createStatement();
            for (int i = 0; i < 10; i++) {
                StringBuffer sbf = new StringBuffer("insert into student (name, age, addr, hobby) ");
                sbf.append(" values ('kenx',24,'上海','籃球')");
                sql = sbf.toString();
                System.out.println("執行sql" + sql);
                //將指定SQL添加到Statement對象的當前命令列表中
                statement.addBatch(sql);
            }
            //執行成功返回更新計數的數組
            int[] success = statement.executeBatch();  //批量執行全部sql返回一個更新計數的數組
            return success;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            //執行完數據庫操做後記得關閉數據庫鏈接資源
            try {

                statement.close();
                connection.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

    }

批量更新:

public int[] updBatch() {
        Connection connection = null;
        Statement statement = null;
        String sql = "";
        try {
            //獲取數據鏈接
            connection = basicUse.getConnection();
            //獲取發送sql指令執行sql對象
            statement = connection.createStatement();
            for (int i = 1; i < 10; i++) {
                StringBuffer sbf = new StringBuffer("update student set  hobby='足球'");
                sbf.append(" where id=" + i);
                sql = sbf.toString();
                System.out.println("執行sql" + sql);
                //將指定SQL添加到Statement對象的當前命令列表中
                statement.addBatch(sql);
            }
            //執行成功返回更新計數的數組
            int[] success = statement.executeBatch();  //批量執行全部sql返回一個更新計數的數組
            return success;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            //執行完數據庫操做後記得關閉數據庫鏈接資源
            try {

                statement.close();
                connection.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

3,返回自動主鍵

JDBC API:

ResultSet java.sql.Statement.getGeneratedKeys() throws SQLException

例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Tester {
	public static void main(String[] args) throws Exception {
		// 註冊數據庫驅動
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		// 獲取鏈接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "***");
		// 準備SQL
		String sql = "insert into user(name) values('Belin')";
		// 準備語句,配置爲自動返回生成主鍵。
		PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
		// 執行語句
		pstmt.executeUpdate();
		// 獲取主鍵值,是一個ResultSet。
		ResultSet rs = pstmt.getGeneratedKeys();
		if (rs.next()) {
			System.out.println(rs.getInt(1));
		}
	}
}

DAO:

什麼是DAO? Data Access Object 數據訪問對象,創建在數據庫和業務層之間,封裝全部對數據庫的訪問。

DAO的做用:將數據訪問邏輯和業務邏輯分開。

DAO一般包括: ①,一個DAO工廠類

②,一個DAO接口

③,一個實現DAO接口的具體類

④,數據傳遞對象(實體對象或值對象)

實體對象

將java程序中的對象對應到關係數據庫的表中

表和類對應

表中的字段和類的屬性對應

記錄和對象對應

實現的步驟:

  • 先創建模型的對象domain;
  • 編寫DAO接口;
  • 定義DAO實現類;
  • 生產DAO測試類;
  • 在DAO測試類中測試方法;
相關文章
相關標籤/搜索