jdbc pdf_JDBC教程– ULTIMATE指南(PDF下载)
jdbc pdf
在本文中,我們提供了全面的JDBC教程(Java數據庫連接性),這是Oracle提供的API,允許程序員處理Java應用程序中的不同數據庫:它允許開發人員建立與數據庫的連接,定義特定客戶端如何訪問給定的客戶端。數據庫,提供了用于讀取,插入,更新和刪除數據庫中數據條目的機制,并負責處理由不同SQL語句組成的事務。
在本文中,我們將解釋主要的JDBC組件,例如語句,結果集或存儲過程。
JDBC需要程序員可能要使用的不同數據庫的驅動程序。
我們將對此進行詳細說明,并提供一些示例。
JDBC從一開始就與Java一起出現。 第一個發行版于1997年2月隨JDK 1.1一起發布,此后,JDBC一直是Java的重要組成部分。 包含JDBC的主要軟件包是http://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html和http://docs.oracle.com/javase/8/ docs / api / javax / sql / package-summary.html 。
有關最新的JDBC版本(4.2)及其開發和維護的所有信息,可以在JSR 221中找到。
本文顯示的所有示例都是使用Java 8更新0_25和Eclipse SDK版本Luna 4.4實現的。 在本文末尾,您可以下載所有這些示例以及更多示例!
目錄
1.組成 2.連接 3.數據類型 4.驅動程序 5.數據庫 6.結果集 7.存儲過程 8.陳述 9.批處理命令 10.交易 11. CRUD命令 12. Java 8 13.基于JDBC構建的Sql庫 14.單元測試 15.總結 16.下載 17.鏈接1.組成
JDBC API允許程序員和Java應用程序與數據庫進行交互。 它支持執行不同SQL語句并處理來自不同數據源的結果。
在本節中,我們將嘗試總結并列出每個Java應用程序中最重要的JDBC組件,所有這些組件將在下一章中進行詳細說明。
- 首先,Java應用程序需要創建和建立特定數據庫的連接。 使用驅動程序管理器(例如,接口java.sql.DriverManager一個實例)或直接通過JDBC數據源完成此操作。 為此,可以使用接口javax.sql.DataSource 。 如前所述,我們將在下一章中更詳細地解釋這些組件。
- 一旦與數據庫連接,就可以使用java.sql.Connection執行CRUD(創建,讀取,更新,刪除)SQL語句或操作。 這些說明將在本教程中進行解釋。
- 為了執行這些操作,程序員可以使用基于java.sql.Statement和java.sql.PreparedStatement的類。 最后幾次在多次執行同一條語句時效率更高,并提供了我們將在本教程中列出的其他好處。
JDBC接口連接提供了創建語句實例的機制:
- 諸如插入,更新或刪除之類的操作將返回修改后的行數,而不會返回其他任何內容:
- 選擇操作(查詢)以java.sql.ResultSet內部的行java.sql.ResultSet返回結果。 按名稱或數字檢索行; 結果元數據也可用:
- 通常,JDBC使用連接池來管理連接。 連接池(例如C3P0或DBCP)有不同的實現。 這些是JDBC連接組,在需要時從應用程序使用或借用它們,并在任務完成時釋放。 關于如何在JDBC中使用和配置連接池的文檔很多,可以在以下鏈接中找到很好的教程: http://docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/jdbc_connection_pools.html 。
- 使用JDBC時,還可以使用其他功能:存儲過程,可調用語句,批處理……所有這些功能都將在本教程中進行描述。
2.連接
為了連接到數據庫,我們需要使用java.sql.Connection對象。 我們可以使用java.sql.DriverManager類的getConnection()方法來完成此操作。 此方法接收數據庫主機和憑據作為參數。
此代碼段顯示了如何為本地MySQL數據庫創建連接。
//MySQL driver is loaded Class.forName( "com.mysql.jdbc.Driver" ); //Connection object is created using the db host and credentials Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/countries?"+ "user=root&password=root" );連接對象允許程序員執行以下操作:
- JDBC語句的創建:可以使用連接對象來創建Statement , PreparedStatement或CallableStatement實例,這些實例提供執行不同SQL語句的方法。 這是創建PreparedStatement的示例:
該語句可以執行作為參數傳遞的sql更新。
- 提供了提交或回滾給定事務的可能性。 JDBC連接支持兩種不同的工作方式: autocommit=true和autocommit=false 。 第一個將所有事務直接提交到數據庫,第二個需要特殊的命令來提交或回滾事務。 我們將在本教程的相關章節中看到更多詳細信息。 以下代碼段顯示了如何更改JDBC連接的自動提交模式:
- 可能獲取有關已使用數據庫的元信息。
- 其他選項,例如批處理,存儲過程等。
我們將詳細解釋所有這些功能,目前最好知道什么是JDBC連接以及使用JDBC連接可以完成的操作。
3.數據類型
JDBC將Java數據類型轉換為適當的JDBC類型,然后再在數據庫中使用它們。 Java和JDBC數據類型之間存在默認映射,該映射提供了數據庫實現和驅動程序之間的一致性。
下表包含這些映射:
| VARCHAR | java.lang.String | setString | getString |
| 焦炭 | java.lang.String | setString | getString |
| LONGVARCHAR | java.lang.String | setString | getString |
| 比特 | 布爾值 | setBoolean | getBoolean |
| 數字 | 大十進制 | setBigDecimal | getBigDecimal |
| 天音 | 字節 | setByte | getByte |
| 小靈通 | 短 | setShort | getShort |
| 整數 | 整型 | setInt | getInt |
| 比金特 | 長 | setLong | getLong |
| 真實 | 浮動 | setFloat | getFloat |
| 浮動 | 浮動 | setFloat | getFloat |
| 雙 | 雙 | setDouble | getDouble |
| VARBINARY | 字節[] | setBytes | getBytes |
| 二進制 | 字節[] | setBytes | getBytes |
| 日期 | java.sql.Date | 設置日期 | getDate |
| 時間 | java.sql.Time | 設置時間 | getTime |
| 時間戳 | java.sql.Timestamp | setTimestamp | getTimestamp |
| CLOB | java.sql.Clob | setClob | getClob |
| BLOB | java.sql.Blob | setBlob | getBlob |
| 陣列 | java.sql.Array | setARRAY | getARRAY |
| 參考 | java.sql.Ref | SetRef | getRef |
| 結構 | java.sql.Struct | SetStruct | getStruct |
在SQL和Java中,空值的處理方式有所不同。 在Java中使用SQL空值進行處理時,最好遵循一些最佳做法,例如避免使用基本類型,因為它們不能為空,但可以轉換為默認值,例如int為0,布爾值為false等。
取而代之的是,建議對原始類型使用包裝器類。 ResultSet類包含一個名為wasNull()的方法,在這些情況下非常有用。 這是一個用法示例:
Statement stmt = conn.createStatement( ); String sql = "SELECT NAME, POPULATION FROM COUNTRIES"; ResultSet rs = stmt.executeQuery(sql);int id = rs.getInt(1); if( rs.wasNull( ) ) {id = 0; }4.驅動程序
JDBC驅動程序管理器java.sql.DriverManager是JDBC API的最重要元素之一。 它是處理JDBC驅動程序列表的基本服務。 它包含允許Java應用程序連接到所需JDBC驅動程序的機制和對象。 它負責管理不同類型的JDBC數據庫驅動程序。 總結驅動程序管理器的主要任務是了解可用驅動程序的列表,并處理特定選定驅動程序和數據庫之間的連接。
此類中最常用的方法是DriverManager.getConnetion() 。 此方法建立與數據庫的連接。
這是一個用法示例:
// Create the connection with the default credentials java.sql.Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:mydb", "SA", "" );我們可以使用DriverManager.registerDriver().方法注冊驅動程序DriverManager.registerDriver(). :
new org.hsqldb.jdbc.JDBCDriver(); DriverManager.registerDriver( new org.hsqldb.jdbc.JDBCDriver() );我們還可以通過調用Class.forName()方法來加載驅動程序:
// Loading the HSQLDB JDBC driver Class.forName( "org.hsqldb.jdbc.JDBCDriver" );...// connection to JDBC using mysql driver Class.forName( "com.mysql.jdbc.Driver" );主要區別在于方法registerDriver()需要驅動程序在編譯時可用,加載驅動程序類不需要驅動程序在編譯時可用。 在JDBC 4之后,不需要真正調用這些方法,并且應用程序不需要單獨注冊驅動程序,也不需要加載驅動程序類。 也建議不要使用registerDriver()方法手動注冊驅動程序。
DriverManager類的其他有趣方法是getDriver(String url) ,它嘗試通過給定的字符串查找驅動程序,而getDrivers()返回先前已在Driver Manager中注冊的所有驅動程序的枚舉:
Enumeration drivers = DriverManager.getDrivers(); while( drivers.hasMoreElements() ) {Driver driver = drivers.nextElement();System.out.println( driver.getClass() ); }5.數據庫
JDBC支持大量數據庫。 它使用不同的驅動程序來抽象其差異和工作方式。 DriverManager類負責加載正確的數據庫,在加載正確的數據庫之后,用于訪問數據庫以查詢和修改數據的代碼將保持(或多或少)不變。
這是JDBC(在Oracle中正式注冊)受支持的數據庫的列表: http : //www.oracle.com/technetwork/java/index-136695.html 。
在本章中,我們將展示如何使用不同的數據庫:MySQL和HSQLDB。 第一個是程序員眾所周知的且已被廣泛使用,第二個是HSQLDB,它是一個非常有用的測試數據庫,具有內存功能。 我們將看到如何同時使用這兩種方法,并且會發現,除了加載適當的JDBC驅動程序之外,應用程序的其余部分保持不變:
MySQL示例:
public static void main( String[] args ) throws ClassNotFoundException, SQLException{// connection to JDBC using mysql driverClass.forName( "com.mysql.jdbc.Driver" );Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/countries?"+ "user=root&password=root" );selectAll( connect );// close resources, in case of exception resources are not properly cleared ...}/*** select statement and print out results in a JDBC result set* * @param conn* @throws SQLException*/private static void selectAll( java.sql.Connection conn ) throws SQLException{Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ){String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}}內存中(HSQLDB)示例:
public static void main( String[] args ) throws ClassNotFoundException, SQLException{// Loading the HSQLDB JDBC driverClass.forName( "org.hsqldb.jdbc.JDBCDriver" );// Create the connection with the default credentialsjava.sql.Connection conn = DriverManager.getConnection( "jdbc:hsqldb:mem:mydb", "SA", "" );// Create a table in memoryString countriesTableSQL = "create memory table COUNTRIES (NAME varchar(256) not null primary key, POPULATION varchar(256) not null);";// execute the statement using JDBC normal StatementsStatement st = conn.createStatement();st.execute( countriesTableSQL );// nothing is in the database because it is just in memory, non persistentselectAll( conn );// after some insertions, the select shows something different, in the next execution these// entries will not be thereinsertRows( conn );selectAll( conn );}.../*** select statement and print out results in a JDBC result set* * @param conn* @throws SQLException*/private static void selectAll( java.sql.Connection conn ) throws SQLException{Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ){String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}}正如我們在最后的程序中看到的那樣, selectAll方法的代碼完全相同,只是JDBC驅動程序的加載和連接創建發生了變化。 您可以想象在不同環境下工作時,它的功能多么強大。 HSQLDB版本的代碼還包含負責創建內存數據庫并插入一些行的代碼,但這只是出于顯示和清晰目的,可以用不同的方式完成。
6.結果集
類java.sql.ResultSet表示數據庫表的結果集。 通常創建它; 通過執行SQL查詢(使用Statement或PreparedStatement的select語句)。 它包含數據行,數據存儲在該行中。 這些數據可以通過索引(以1開頭)或屬性名稱進行訪問:
// creating the result setResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );// iterating through the results rowswhile( resultSet.next() ){// accessing column values by index or nameString name = resultSet.getString( "NAME" );int population = resultSet.getInt( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );// accessing column values by index or nameString name = resultSet.getString( 1 );int population = resultSet.getInt( 2 );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}如前所示,ResultSets包含用于獲取不同Java類型的列值的getter方法。 它還包含一個指向當前數據行的光標。 最初,光標指向第一行之前。 next方法將光標移動到下一行: java.sql.ResultSet.next() 。
可以使用默認屬性(例如僅向前移動且不可更新的光標)創建ResultSets。 如果程序員想使用其他類型的屬性,則可以在創建Statement時指定,以便通過更改傳遞的參數來生成結果集:
/** * indicating result sets properties that will be created from this statement: type, * concunrrency and holdability */ Statement statement = conn.createStatement( ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT );使用這種結果集,可以在兩個方向上移動光標,并為此目的使用結果集將新數據更新或插入數據庫中。
7.存儲過程
在本章中,我們將解釋什么是存儲過程以及如何在JDBC中使用它們。 對于示例,我們將使用基于MySQL的存儲過程。
存儲過程是SQL語句集,作為執行邏輯單元的一部分并執行定義的任務。 當封裝一組要在數據庫上執行的操作時,它們非常有用。
首先,我們將在MySQL數據庫中創建一個過程,以下腳本將幫助我們完成此任務:
delimiter //CREATE PROCEDURE spanish (OUT population_out INT)BEGINSELECT COUNT(*) INTO population_out FROM countries;END//delimiter ;CALL simpleproc(@a);基本上,以上腳本創建了一個名為Spanish的過程,該過程具有一個類型為int且沒有輸入參數的輸出屬性。 該過程返回數據庫中所有國家的計數。
一旦創建了過程,就可以從Java應用程序中使用它。為了調用存儲過程,我們需要使用接口java.sql.CallableStatement特殊語句,這些語句允許程序員執行存儲過程,以指示輸出屬性和要使用的輸入參數。 在我們的簡單示例中,僅配置了輸出屬性。 這是一個例子:
CallableStatement callableStatement = null;// the procedure should be created in the databaseString spanishProcedure = "{call spanish(?)}";// callable statement is usedcallableStatement = connect.prepareCall( spanishProcedure );// out parameters, also in parameters are possible, not in this casecallableStatement.registerOutParameter( 1, java.sql.Types.VARCHAR );// execute using the callable statement method executeUpdatecallableStatement.executeUpdate();// attributes are retrieved by indexString total = callableStatement.getString( 1 );System.out.println( "amount of spanish countries " + total );我們可以理解如何使用java.sql.PreparedStatement.executeUpdate()方法指示如何將過程的輸出存儲在何處以及如何執行該過程。 大多數數據庫都支持存儲過程,但是它們的語法和行為可能有所不同,因此,根據存儲過程的數據庫,處理存儲過程的Java應用程序可能會有所不同。
8.陳述
如本教程中已經提到的,JDBC使用接口java.sql.Statement來執行不同SQL查詢和操作,例如插入,更新或刪除。 這是基本接口,包含所有基本方法,例如java.sql.Statement.executeQuery(String)或java.sql.Statement.executeUpdate(String) 。
當程序員不需要多次執行相同的查詢或不需要對查詢和語句進行參數化時,建議使用此接口的實現。 通常,我們可以說此接口適合于執行DDL語句(創建,更改,刪除)。 這些語句通常不會多次執行,并且不需要支持不同的參數。
如果程序員在重復SQL查詢或參數化時需要更高的效率,則應使用java.sql.PreparedStatement 。 該接口繼承了前面提到的基本語句接口,并提供了參數設置。 由于此功能,此接口可更安全地防止SQL注入攻擊。 這是一段代碼,顯示了此接口的示例:
System.out.println( "Updating rows for " + name + "..." );String sql = "UPDATE COUNTRIES SET POPULATION=? WHERE NAME=?";PreparedStatement updateStmt = conn.prepareStatement( sql );// Bind values into the parameters. updateStmt.setInt( 1, 10000000 ); // population updateStmt.setString( 2, name ); // name// update prepared statement using executeUpdate int numberRows = updateStmt.executeUpdate();System.out.println( numberRows + " rows updated..." );使用準備好的語句的另一個好處是可以通過使用setObject()方法來處理非標準對象。 這是一個例子:
PreparedStatement updateStmt2 = conn.prepareStatement( sql );// Bind values into the parameters using setObject, can be used for any kind and type of// parameter.updateStmt2.setObject( 1, 10000000 ); // populationupdateStmt2.setObject( 2, name ); // name// update prepared statement using executeUpdatenumberRows = updateStmt2.executeUpdate();System.out.println( numberRows + " rows updated..." );updateStmt2.close();就像在與存儲過程有關的章節中提到的那樣,為此目的可以使用另一個接口,它稱為java.sql.CallableStatement并擴展了PreparedStatement。
9.批處理命令
JDBC提供了批量執行SQL語句列表的可能性,也就是說,可以全部執行。 程序員使用代碼的方式取決于語句的類型,但總體思路是相同的。 在下一個代碼片段中,顯示了如何對java.sql.Statement使用批處理:
Statement statement = null;statement = connect.createStatement();// adding batchs to the statement statement.addBatch( "update COUNTRIES set POPULATION=9000000 where NAME='USA'" ); statement.addBatch( "update COUNTRIES set POPULATION=9000000 where NAME='GERMANY'" ); statement.addBatch( "update COUNTRIES set POPULATION=9000000 where NAME='ARGENTINA'" );// usage of the executeBatch method int[] recordsUpdated = statement.executeBatch();int total = 0; for( int recordUpdated : recordsUpdated ) {total += recordUpdated; }System.out.println( "total records updated by batch " + total );并使用java.sql.PreparedStatement :
String sql = "update COUNTRIES set POPULATION=? where NAME=?";PreparedStatement preparedStatement = null;preparedStatement = connect.prepareStatement( sql );preparedStatement.setObject( 1, 1000000 );preparedStatement.setObject( 2, "SPAIN" );// adding batchespreparedStatement.addBatch();preparedStatement.setObject( 1, 1000000 );preparedStatement.setObject( 2, "USA" );// adding batchespreparedStatement.addBatch();// executing all batchsint[] updatedRecords = preparedStatement.executeBatch();int total = 0;for( int recordUpdated : updatedRecords ){total += recordUpdated;}System.out.println( "total records updated by batch " + total );我們可以看到,這些區別基本上是使用SQL查詢參數的方式以及如何構建查詢的,但是在一行上執行多個語句的想法是相同的。 在第一種情況下,使用方法java.sql.Statement.executeBatch() ,在第二種情況下使用java.sql.PreparedStatement.addBatch()和java.sql.Statement.executeBatch() 。
10.交易
JDBC支持事務,并包含實現基于事務的應用程序的方法和功能。 我們將在本章中列出最重要的那些。
- java.sql.Connection.setAutoCommit(boolean) :此方法接收布爾值作為參數,如果為true(這是默認行為),則所有SQL語句將自動保存在數據庫中。 如果為false,將不會自動保留更改,這將通過使用java.sql.Connection.commit()方法來完成。
- java.sql.Connection.commit() 。 僅當自動提交設置為false或禁用時,才可以使用此方法。 也就是說,它僅適用于非自動提交模式。 執行此方法時,自上次提交/回滾以來的所有更改都將保留在數據庫中。
- java.sql.Connection.rollback() 。 僅當禁用自動提交時,才可以使用此方法。 它撤消或還原當前事務中完成的所有更改。
這是一個用法示例,在此示例中,我們可以看到如何使用setAutoCommit(false)方法禁用自動提交模式。 調用commit()時,所有更改都將commit()并且使用rollback()方法將當前事務更改rollback() :
Class.forName( "com.mysql.jdbc.Driver" ); Connection connect = null; try {// connection to JDBC using mysql driverconnect = DriverManager.getConnection( "jdbc:mysql://localhost/countries?"+ "user=root&password=root" );connect.setAutoCommit( false );System.out.println( "Inserting row for Japan..." );String sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('JAPAN', '45000000')";PreparedStatement insertStmt = connect.prepareStatement( sql );// insert statement using executeUpdateinsertStmt.executeUpdate( sql );connect.rollback();System.out.println( "Updating row for Japan..." );// update statement using executeUpdate -> will cause an error, update will not be// executed becaues the row does not existsql = "UPDATE COUNTRIES SET POPULATION='1000000' WHERE NAME='JAPAN'";PreparedStatement updateStmt = connect.prepareStatement( sql );updateStmt.executeUpdate( sql );connect.commit();} catch( SQLException ex ) {ex.printStackTrace();//undoes all changes in current transactionconnect.rollback(); } finally {connect.close(); }11. CRUD命令
CRUD來自創建,讀取,更新和刪除。 JDBC支持所有這些操作和命令,在本章中,我們將展示執行所有這些操作的Java代碼的不同片段:
創建語句。 可以使用JDBC創建數據庫,這是創建內存數據庫的示例:
// Create a table in memory String countriesTableSQL = "create memory table COUNTRIES (NAME varchar(256) not null primary key, POPULATION varchar(256) not null);";// execute the statement using JDBC normal Statements Statement st = conn.createStatement(); st.execute( countriesTableSQL );插入語句。 JDBC支持插入。 程序員可以使用普通SQL語法,并將它們傳遞給JDBC提供的不同的語句類,例如Statement , PreparedStatement或CallableStatement 。 以下是幾個示例:
Statement insertStmt = conn.createStatement();String sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('SPAIN', '45Mill')"; insertStmt.executeUpdate( sql );sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('USA', '200Mill')"; insertStmt.executeUpdate( sql );sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('GERMANY', '90Mill')"; insertStmt.executeUpdate( sql );這些語句返回插入的行數。 這同樣適用于update語句,這是如何更新數據庫中的一組行的示例:
System.out.println( "Updating rows for " + name + "..." );Statement updateStmt = conn.createStatement();// update statement using executeUpdateString sql = "UPDATE COUNTRIES SET POPULATION='10000000' WHERE NAME='" + name + "'";int numberRows = updateStmt.executeUpdate( sql );System.out.println( numberRows + " rows updated..." );輸出為:
Updating rows for SPAIN... 4 rows updated...選擇對帳單。 可以使用JDBC語句執行任何(幾乎)種類SQL查詢。 這是一個非常簡單的示例,該示例讀取給定表的所有行并在標準控制臺中將它們打印出來:
Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ) {String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population ); }其輸出為(取決于數據庫狀態):
NAME: GERMANY POPULATION: 90Mill NAME: SPAIN POPULATION: 45Mill NAME: USA POPULATION: 200Mill刪除語句。 最后,JDBC支持刪除行以及刪除表和其他SQL元素。 這是一個片段,顯示刪除具有特定條件的所有行(在這種情況下,名稱必須為“ JAPAN”):
System.out.println( "Deleting rows for JAPAN..." ); String sql = "DELETE FROM COUNTRIES WHERE NAME='JAPAN'"; PreparedStatement deleteStmt = connect.prepareStatement( sql );// delete statement using executeUpdate int numberRows = deleteStmt.executeUpdate( sql );System.out.println( numberRows + " rows deleted..." );Delete語句返回受影響的行數,在這種情況下,輸出將是(取決于數據庫狀態):
Deleting rows for JAPAN... 0 rows deleted...這些例子都是非常簡單的例子。 它們是出于學習目的而編寫的,但是您可以想象,只需更改傳遞給executeQuery()或executeUpdate()方法的參數,就可以執行更復雜SQL查詢。
12. Java 8
Java 8不包含與JDBC或JDBC框架相關的任何重大更改。 但是,在使用JDBC時,可以應用Java 8的多種功能,效果非常好。 我們將展示其中的一些。 例如,有可能以與過去非常不同的方式執行選擇查詢。 這是一個沒有Java 8功能的情況下的示例,它與本文中所有示例中的操作大致相同:
// we always need to write this code System.out.println( "using Java 7" ); // connection to JDBC using mysql driver Class.forName( "com.mysql.jdbc.Driver" ); Connection connect = DriverManager.getConnection( "jdbc:mysql://localhost/countries?"+ "user=root&password=root" );// select query PreparedStatement statement = connect.prepareStatement( "select * from COUNTRIES" ); ResultSet resultSet = statement.executeQuery();// iterating results while( resultSet.next() ) {// access via nameObject name = resultSet.getObject( 1 );Object population = resultSet.getObject( 2 );System.out.println( "Name: " + name );System.out.println( "Population: " + population ); }// close resources, in case of exception resources are not properly cleared resultSet.close(); statement.close(); connect.close();這是一個使用Lambdas的相同版本。
// select method is called and lambda expression is provided, this expression will be used // in the handle method of the functional interface select( connect, "select * from COUNTRIES", ( resultSet ) -> {System.out.println( resultSet.getObject( 1 ) );System.out.println( resultSet.getObject( 2 ) ); } );上面顯示的這段代碼包含一個select方法調用,其中第一個參數是Connection對象,第二個參數是SQL查詢,第三個參數是Lambda表達式。 該Lambda表達式接收一個參數( ResultSet實例)并打印出其前兩個屬性,但是使用Lambda表達式主體中的該結果集可以完成任何操作。 這是select()方法的實現:
public static void select( Connection connect, String sql, ResultSetHandler handler ) throws SQLException{PreparedStatement statement = connect.prepareStatement( sql );try (ResultSet rs = statement.executeQuery()){while( rs.next() ){handler.handle( rs );}}}和功能接口ResultSetHandler :
@FunctionalInterface public interface ResultSetHandler {/*** This method will be executed by the lambda expression* * @param resultSet* @throws SQLException*/public void handle( ResultSet resultSet ) throws SQLException;}我們在這里可以看到,使用某些Java 8新功能時,代碼更加清晰,而且大大減少了(或沒有減少)。
13.基于JDBC構建的Sql庫
幾個著名的Java庫使用JDBC來構建它們的API。 在本節中,我們將列出其中一些:
- HSQLDB(超級SQL數據庫)是一種關系數據庫管理系統,可提供內存和持久性存儲。 它具有JDBC驅動程序(如某些示例所示)。 它具有非持久性功能,并且幾乎支持所有SQL核心功能,因此對于測試目的非常有用。 有關更多信息,請訪問http://hsqldb.org/
- DBUnit是JUnit的擴展。 當涉及數據庫時,它對于單元測試非常有用。 該框架負責測試之間的數據庫狀態,并在測試時抽象出幾個數據庫屬性。 要下載源代碼和更多文檔,請訪問http://www.dbunit.org
- DBUtils是一個Apache Commons庫,旨在簡化JDBC的使用。 該庫包含的一些功能包括:清理資源,減少代碼量,更輕松和自動填充結果集。 該庫小巧,透明且快速,應由希望直接使用JDBC的開發人員使用。 使用此庫需要Java 1.6或更高版本。 有關更多文檔,請訪問http://commons.apache.org/proper/commons-dbutils/
- Spring Data還包含與JDBC相關的模塊。 它被稱為Spring Data JDBC Extensions。 它提供了對JDBC最常用功能的支持。 它提供了用于處理Oracle數據庫的特殊功能。 如果您想了解有關此庫的更多信息,請訪問http://projects.spring.io/spring-data-jdbc-ext/
- JOOQ是使用JDBC的公司數據倉庫中非常有趣的框架。 它從SQL數據庫生成Java代碼,并提供API以建立JDBC連接,查詢數據并以簡單的方式處理結果。 有關更多信息,請訪問其git hub帳戶: https : //github.com/jOOQ/jOOL 。
14.單元測試
當涉及到單元測試和數據庫時,總是存在幾個問題:
- 我們使用什么環境進行測試?
- 我們是否用真實數據進行測試?
- 還是我們使用合成的生成數據?
- 如果沒有適當的憑據,我們如何測試數據庫?
幾個庫可以幫助我們完成這些任務。 在本章中,我們將列出其中一些并提供一些有用的鏈接,在這些鏈接中可以找到更多信息:
- DBUnit:如前所述,DBUnit是一個與Junit協作的測試框架。 有關更多信息,請訪問http://dbunit.org
- TestNG:此測試框架涵蓋許多測試場景,例如單元測試,功能測試,集成測試等。它基于注釋。 有關此框架的更多信息,請訪問其網站: http : //testng.org/doc/index.html
- JOOQ。 該框架提供了JDBC模擬和測試功能。 它是非常有據可查的,易于使用。 有關更多信息,請訪問http://jooq.org
15.總結
JDBC(Java數據庫連接性)是用于Java與大量數據庫和數據源(從基于SQL的數據庫到Excel電子表格)之間的數據庫連接性的標準API。 在本教程中,我們試圖解釋JDBC體系結構以及如何使用它。 我們列出了JDBC使用的主要組件,并且列出了一些用于廣泛使用的數據庫(例如MySql)的驅動程序。
要記住的最重要的幾點是:
- 驅動程序是使Java應用程序能夠與數據庫一起使用的組件。 JDBC需要每個特定數據庫的驅動程序。 可以在http://www.oracle.com/technetwork/java/index-136695.html上找到JDBC可用驅動程序的列表。
- 每次都將SQL語句直接發送到數據庫服務器。 JDBC包含一種稱為PreparedStatement的機制,該機制具有預定的執行路徑,該機制可提高效率并更好地利用資源。
- 結果集是用于查詢中的行的表示形式。
- 存儲過程是組合在一起的一組SQL語句,可以按名稱調用它們,而無需分別調用它們。
- 事務是一組SQL語句。 當調用commit()或rollback()時,事務結束。 這種分組允許不同的并行工作。
- CRUD命令是create , read , update和delete命令。 JDBC提供了執行這些命令的機制。
本教程包含一些與Java 8有關的與JDBC有關的新可能性的信息,例如JOOQ。 我們還提到了一些使用JDBC實現的重要庫,例如Spring-Data或Apache DBUtils。
16.下載JDBC教程源代碼
下載您可以在此處下載本教程的完整源代碼: jdbc_ultimate_tutorial 。
17.鏈接
除了本文所指向的所有鏈接和資源之外,如果您想了解有關JDBC API及其功能和機制的更多信息,可以在Oracle官方網站上找到最新的最佳信息源:
- http://docs.oracle.com/javase/8/docs/api/javax/sql/package-summary.html
- http://docs.oracle.com/javase/8/docs/api/javax/sql/package-summary.html
翻譯自: https://www.javacodegeeks.com/2015/02/jdbc-tutorial.html
jdbc pdf
總結
以上是生活随笔為你收集整理的jdbc pdf_JDBC教程– ULTIMATE指南(PDF下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一只手可以拎走的电脑,打造一台8.4L的
- 下一篇: maf中anglearc_Oracle