在SQL中,描述數據庫或其組成部分的數據稱為元數據(區別于那些存在數據庫中的實際數據)。我們可以獲得三類元數據:關于數據庫的元數據、關于結果集的元數據以及關于預備語句參數的元數據。第二個元數據類ResultSetMetaData則用于提供結果集的相關信息。每當通過查詢得到一個結果集,我們都可以獲取該結果集的列數以及每一列的名稱、類型和字段寬度。
ConnectionDatabaseMetaData getMetaData()返回一個DatabaseMetaData對象,該對象封裝了有關數據庫連接的元數據。DatabaseMetaDataResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String types[])返回某個目錄( catalog)中的所有表的描述,該目錄必須符合給定的模式( schema)、表名字模式以及類型標準。(模式用于描述一組相關的表和訪問權限,而目錄描述的是一組相關的模式,這些概念對組織大型數據庫非常重要。)catalog和schema參數可以為空,用于檢索那些沒有目錄和模式的表。如果不想考慮目錄和模式,也可以將上述參數設為null。types數組包含了所需的表類型的名稱。通常表類型有TABLE、 VIEW、 SYSTEM TABLE、GLOBAL TEMPORARY、 LOCAL TEMPORARY、ALIAS和SYNONYM。如果types為null,則返回所有類型的表。返回的結果集共有5列,均為String類型。1 TABLE_CAT 表目錄(可以為null)2 TABLE_SCHEM 表結構模式(可以為null)3 TABLE_NAME 表名稱4 TABLE_TYPE 表類型5 REMARKS 關于表的注釋int getJDBCMajorVersion()int getJDBCMinorVersion()返回建立數據庫連接的JDBC驅動程序的主版本號和次版本號。例如,一個JDBC 3.0的驅動程序有一個主版本號3和一個次版本號0。int getMaxConnections()返回可同時連接到數據庫的最大連接數。int getMaxStatements()返回單個數據庫連接允許同時打開的最大語句數。如果對允許打開的語句數目沒有限制或者不可知,則返回0。ResultSetResultSetMetaData getMetaData()返回與當前ResultSet對象中的列相關的元數據。ResultMetaDataint getColumnCount()返回當前ResultSet對象中的列數。int getColumnDisplaySize(int column)返回給定列序號的列的最大寬度。參數: column 列序號String getColumnLabel(int column)返回該列所建議的名稱。參數: column 列序號String getColumnName(int column)返回指定的列序號所對應的列名。參數: column 列序號事務事務是指作為單個邏輯工作單元執行的一系列操作,這些操作要么全做要么全不做,是一個不可分割的工作單位。
數據庫事務的四大特性(簡稱ACID)是:
原子性:事務的原子性指的是,事務中包含的程序作為數據庫的邏輯工作單位,它所做的對數據修改操作要么全部執行,要么完全不執行。這種特性稱為原子性。
一致性:事務的一致性指的是在一個事務執行之前和執行之后數據庫都必須處于一致性狀態。這種特性稱為事務的一致性。假如數據庫的狀態滿足所有的完整性約束,就說該數據庫是一致的。
隔離性:分離性指并發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。假如并發交叉執行的事務沒有任何控制,操縱相同的共享對象的多個并發事務的執行可能引起異常情況。
持久性:持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,即對已提交事務的更新能恢復。持久性通過數據庫備份和恢復來保證。
將一組語句構建成一個事務( transaction)。當所有語句都順利執行之后,事務可以被提交( commit)。否則,如果其中某個語句遇到錯誤,那么事務將被回滾,就好像沒有任何命令被執行過一樣。默認情況下,數據庫連接處于自動提交模式( autocommit mode)。每個SQL命令一旦被執行便被提交給數據庫。一旦命令被提交,就無法對它進行回滾操作。在使用事務時,需要關閉這個默認值:
con.setAutoCommit(false)執行了所有命令之后,調用commit方法。如果出現錯誤,請調用rollback()此時,程序將自動撤銷自上次提交以來的所有命令。當事務被SQLException異常中斷時,通常的辦法是發起回滾操作。保存點
在使用某些驅動程序時,使用保存點( Save Point)可以更好地控制回滾操作。創建一個保存點意味著稍后只需返回到這個點,而非事務的開頭。
Savepoint sp =con.setSavepoint();......if()con.rollback(sp);當不再需要保存點時,必須釋放它con.releaseSavepoint(sp);批量更新
處于同一批中的容器可以是INSERT、 UPDATE和DELETE等操作,也可以是數據庫定義命令,如CREATE TABLE和DROP TABLE。但是,在批量處理中添加SELECT命令會拋出異常(從概念上講,批量處理中的SELECT語句沒有意義,因為它會返回結果集,而并不更新數據庫)。
statement.addBatch(sql);statement.addBatch(sql);statement.addBatch(sql);statement.addBatch(sql);int[] a = statement.executeBatch();調用executeBatch方法將為所有已提交的命令返回一個記錄數的數組。為了在批量模式下正確地處理錯誤,必須將批量執行的操作視為單個事務。如果批量更新在執行過程中失敗,那么必須將它回滾到批量操作開始之前的狀態。首先,關閉自動提交模式,然后收集批量操作,執行并提交該操作,最后恢復最初的自動提交模式.。Connectionboolean getAutoCommit()void setAutoCommit(boolean b)獲取將該連接中的自動提交模式,或將其設置為b。如果自動更新為true,那么所有語句將在執行結束后立刻被提交。void commit()提交自上次提交以來所有執行過的語句。void rollback()撤銷自上次提交以來所有執行過的語句所產生的影響。Savepoint setSavepoint() Savepoint setSavepoint(String name) 設置一個匿名或具名的保存點。void rollback(Savepoint svpt) 回滾到給定保存點。void releaseSavepoint(Savepoint svpt) 釋放給定的保存點。Savepointint getSavepointId()獲取該匿名保存點的ID號。如果該保存點具有名字,則拋出一個SQLException異常。String getSavepointName()獲取該保存點的名稱。如果該對象為匿名保存點,則拋出一個SQLException異常。Statementvoid addBatch(String command)添加命令到當前批量命令中。int[] executeBatch()執行當前批量更新中的所有命令。返回一個記錄數的數組,其中每一個元素都對應一條命令,代表受該命令影響的記錄總數。
新聞熱點
疑難解答