天天看點

Java精選筆記_JDBC

JDBC

概述

什麼是JDBC

JDBC全稱是Java資料庫連接配接(Java Database Connectivity),應用程式可通過這套API連接配接到關系資料庫,并使用SQL語句來完成對資料庫中資料的查詢、更新和删除等操作。是一套用于執行SQL語句的Java API。

Java的資料庫連接配接接口。它是Java API中的一部分,通過它可以将Java程式和關系資料庫內建在一起。

應用程式通過調用JDBC來操作資料庫的過程,其實是由資料庫廠商提供的JDBC驅動程式來負責的。如果要更換資料庫,隻要更換驅動程式,并在JDBC中載入新的驅動程式來源,即可完成資料庫系統的變更。

JDBC允許任何使用Java語言編寫的小應用程式或應用程式通路資料庫。通過使用SQL語句可以對資料庫中的資料進行相應的插入、删除和更新操作。

JDBC由Java語言編寫的相關類和接口組成

驅動程式

DriverManager類、Driver 接口

與特定資料庫連接配接

Connection接口

執行SQL語句

Statement接口、PreparedStatement接口

提供資料庫資訊

DatabaseMetaData接口

結果集

ResultSet接口

DriverManager類,用來管理JDBC驅動程式,主要用于跟蹤和加載驅動程式并負責選取資料庫驅動程式和建立新的資料庫連接配接

Driver 接口,每個驅動程式類必須實作的接口。該接口可以将API的調用映射到資料庫的操作

Connection接口,用來連接配接應用程式與指定的資料庫

Statement接口,用來執行靜态SQL語句并得到SQL語句并得到執行後的結果

PreparedStatement接口,用來傳回有關資料、資料庫和驅動程式等與底層資料庫有關的資訊

DatabaseMetaData接口,提供對資料庫表的通路,執行查詢後傳回的結果集。通過ResultSet對象是通過執行一個查詢資料庫的語句生成

連接配接

在連接配接資料庫時需要指明資料源,以及相關的一些參數。資料源主要包括兩部分,其中protocol表示連接配接到資料庫的驅動程式,DatabaseName表示資料庫的名字

jdbc:<protocol>:<DatabaseName>

在連接配接資料庫時,需要找到使用JDBC驅動程式類的名稱。不同的資料庫供應商的資料庫産品都有自己的驅動程式,不同資料庫的URL和驅動程式也有所不同。

使用Java與資料庫連接配接進行資料存取的過程:加載驅動程式-->Collection建立連接配接(連接配接資料庫)-->建立Statement對象(執行SQL語句)-->取得ResultSet結果集

具體過程

(1)首先要加載目前資料源的驅動程式。通常使用Class.forName()方法加載

(2)建立資料庫的連接配接。可以通過DriverManager類中的getConnection方法來實作與資料庫的連接配接。

conn = DriverManager.getConnection(url, userNamew, password);

(3)建立連接配接後就可以使用SQL語句對資料庫進行通路。這就需要建立Statement對象。通過該對象可以執行相應的SQL語句并将其操作于資料庫

stmt = conn.createStatement();

(4)将SQL語句執行後的結果傳回。執行的查詢結果可以以ResultSet結果集的形式傳回

ResultSet rs = stmt.executeQuery(sqlSelect);

(5)對結果集進進行處理。例如,我們可以通過使用一個while循序獲得結果集中的所有記錄

while (rs.next()) { String str1 = rs.getString(1);    String str2 = rs.getString(2);  }

(6)關閉資料庫的連接配接。在執行完資料庫的操作之後,需要将與資料庫連接配接有關的對象關閉。主要包括Statement對象、Connection對象等。

    stmt.close(); conn.close();

API詳解

注冊驅動(應用)Class.forName("com.mysql.jdbc.Driver");

獲得連接配接對象(應用)getConnection("jdbc:mysql://localhost:3306/day07",root,root)

獲得執行sql的statement對象(應用)

createStatement()傳回的是Statement接口

Statement接口執行操作

* executeUpdate(sql)

* executeQuery(sql)

prepareStatement(sql),傳回PreparedStatement接口,預編譯SQL語句

PreparedStatement 是Statement的子接口

* 使用它可以解決sql注入問題

* 執行SQL方法:

executeQuery()

executeUpdate()

setInt(?的位置,值)

周遊結果集(應用)next()  ,  getInt()   ,  getString()

釋放資源   調用close方法

PreparedStatement對象滾動結果集

可以将遊标定位到任意位置

PrepareStatement pstmt = conn.prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

ResultSet對象處理結果集

方法

ResultSetMetaData getMetaData()

檢索此ResultSet對象的列的編号、類型和屬性

boolean getBoolean(int columnIndex)

以Java程式設計語言中boolean的形式檢索此ResultSet對象的目前行中指定列的值

float getFloat(int columnIndex)

以Java程式設計語言中float的形式檢索

int getInt(int columnIndex)

以Java程式設計語言中int的形式檢索此ResultSet對象的目前行中指定列的值

String getString(int columnIndex)

以Java程式設計語言中String的形式檢索此ResultSet對象的目前行中指定列的值

boolean next()

将指針從目前位置下移一行

ResultSet接口中還提供了一些方法用于實作滾動結果集

boolean absolute(int row)

将遊标移動到此ResultSet對象的指定參數row所對應的行。若遊标位于有效行則傳回true

boolean relative(int rows)

按相對行數移動遊标到參數rows指定的行。若遊标位于有效行上則傳回true

boolean first()

将遊标移動到第一行。若遊标位于有效行則傳回true,若結果集中沒有資料行則傳回false

boolean last()

将遊标移動到最後一行。若遊标位于有效行則傳回true,若結果集中沒有資料行則傳回false

boolean next()

将遊标移動到目前位置的下一行。若新目前行有效,則傳回true;若不存在,則傳回false

boolean previous()

将遊标移動到ResultSet對象的上一行。若該行有效則傳回true,若不在結果集中則傳回false

boolean isFirst()

判斷遊标是否在此ResultSet對象的第一行。如果是則傳回true

boolean isLast()

判斷遊标是否在此ResultSet對象的最後一行。如果是則傳回true

boolean isBeforeFirst()

判斷遊标是否在此ResultSet對象的第一行之前,如果是則傳回true

boolean isAfterLast()

判斷遊标是否在此ResultSet對象的最後一行之後,如果是則傳回true

void beforeFirst()

将遊标移動到此ResultSet對象第一行之前

void afterLast()

将遊标移動到此ResultSet對象的最後一行之後

更新結果集

當将建立Statement和PreparedStatement對象中的參數resultSetConcurrency設定為ResultSet.CONCUR_UPDATABLE時,則表明該結果集是可更新的。這時我們就可以直接在結果集中對資料庫進行修改了。

方法

void insertRow()

将插入行的内容插入到此 ResultSet 對象和資料庫中。當指針位于插入時才可以調用該方法

void updateRow()

用此 ResultSet 對象的目前行的新内容更新底層資料庫

void deleteRow()

将目前行從此 ResultSet 對象和底層資料庫中删除

void cancelRowUpdates()

取消對 ResultSet對象中的目前行所作的更新。此方法在調用更新方法之後,調用updateRow方法之前調用才可以實作對行所作的更新。如果在updateRow方法之後調用該方法,則不能取消對行所做的更新

void moveToCurrentRow()

将遊标移動到目前行。隻有遊标位于插入行上時,調用此方法才有效

void moveToInsertRow()

将遊标移動到ResultSet 對象中插入行

核心API

DriverManager

Driver

Connection

Statement

    PreparedStatement

    CallableStatement

ResultSet

RowSet

DatabaseMetaData

ResultSetMetaData

Types

SQLException

JDBC批處理

在實際開發中,經常需要向資料庫發送多條SQL語句,這時,如果逐條執行這些SQL語句,效率會很低。為此,JDBC提供了批處理機制,即同時執行多條SQL語句。Statement和PreparedStatement都實作了批處理。

Statement批處理

PreparedStatement批處理

大資料處理

大資料處理主要指的是對CLOB和BLOB類型資料的操作。在應用程式中,要想操作這兩種資料類型,必須使用PreparedStatement 完成,并且所有的操作都要以IO流的形式進行存放和讀取。

處理CLOB資料

處理BLOB資料

JDBC處理事務與資料庫連接配接池

JDBC處理事務

在資料庫操作中,一項事務是由一條或多條操作資料庫的SQL語句組成的一個不可分割的工作單元

隻有當事務中的所有操作都正常完成,整個事務才能被送出到資料庫中,如果有一項操作沒有完成,則整個事務會被撤銷。

針對JDBC處理事務的操作,在Connection接口中,提供了三個相關的方法

setAutoCommit(boolean autoCommit)

commit()

rollback()

資料庫連接配接池

什麼是資料庫連接配接池

在JDBC程式設計中,每次建立和斷開Connection對象都會消耗一定的時間和IO資源。頻繁地建立、斷開資料庫連接配接勢必會影響資料庫的通路效率,甚至導緻資料庫崩潰。

為了避免頻繁的建立資料庫連接配接,工程師們提出了資料庫連接配接池技術。

為了避免頻繁的建立資料庫連接配接,工程師們提出了資料庫連接配接池技術。

DataSource接口

為了擷取資料庫連接配接對象(Connection),JDBC提供了javax.sql.DataSource接口,它負責與資料庫建立連接配接,并定義了傳回值為Connection對象的方法:

Connection getConnection() 

Connection getConnection(String username, String password)

我們習慣性的把實作了javax.sql.DataSource接口的類稱為資料源,顧名思義,資料源即資料的來源。在資料源中存儲了所有建立資料庫連接配接的資訊。

DBCP資料源

DBCP是資料庫連接配接池(DataBase Connection Pool)的簡稱,是Apache組織下的開源連接配接池實作,也是Tomcat伺服器使用的連接配接池元件。單獨使用DBCP資料源時,需要在應用程式中導入兩個jar包。

commons-pool.jar包

commons-dbcp.jar包

 commons-dbcp.jar包中包含兩個核心類,分别是BasicDataSourceFactory和BasicDataSource,它們都包含擷取DBCP資料源對象的方法。

編寫配置檔案

配置檔案 xx.properties中有命名格式要求

driverClassName

url

username

password

BasicDataSource是DataSource接口的實作類,主要包括設定資料源對象的方法。

方法

void?setDriverClassName(String?driverClassName)

設定連接配接資料庫的驅動名稱

void?setUrl(String?url)

設定連接配接資料庫的路徑

void?setUsername(String?username)

設定資料庫的登陸賬号

void?setPassword(String?password)

設定資料庫的登入密碼

void setInitialSize(int?initialSize)

設定資料庫連接配接池初始化的連接配接數目

void setMaxActive (int?maxIdle)

設定資料庫連接配接池最大活躍的連接配接數目

void setMinIdle(int?minIdle)

設定資料庫連接配接池最小閑置的連接配接數目

Connection getConnection()

從連接配接池中擷取一個資料庫連接配接

 當使用DBCP資料源時,首先得建立資料源對象,資料源對象的建立方式有兩種

1.通過BasicDataSource類直接建立資料源對象

使用BasicDataSource類建立一個資料源對象,手動給資料源對象設定屬性值,然後擷取資料庫連接配接對象。

2.通過讀取配置檔案建立資料源對象

使用BasicDataSourceFactory工廠類讀取配置檔案,建立資料源對象,然後擷取資料庫連接配接對象。

C3P0資料源

C3P0是目前最流行的開源資料庫連接配接池之一,它實作了DataSource資料源接口,支援JDBC2和JDBC3的标準規範,易于擴充并且性能優越,著名的開源架構Hibernate和 Spring使用的都是該資料源。

我們在使用C3P0資料源開發時,需要了解C3P0中DataSource接口的實作類ComboPooledDataSource,它是C3P0的核心類,提供了資料源對象的相關方法。

方法

void setDriverClass()

設定連接配接資料庫的驅動名稱

void setJdbcUrl()

設定連接配接資料庫的路徑

void setUser()

設定資料庫的登陸賬号

void setPassword()

設定資料庫的登入密碼

void setMaxPoolSize()

設定資料庫連接配接池最大的連接配接數目

void setMinPoolSize()

設定資料庫連接配接池最小的連接配接數目

void setInitialPoolSize()

設定資料庫連接配接池初始化的連接配接數目

Connection getConnection()

從資料庫連接配接池中擷取一個連接配接

當使用C3P0資料源時,首先得建立資料源對象,建立資料源對象可以使用ComboPooledDataSource類,該類有兩個構造方法,分别是ComboPooledDataSource()和ComboPooledDataSource(String configName)

1.通過ComboPooledDataSource類直接建立資料源對象

 使用ComboPooledDataSource類直接建立一個資料源對象,手動給資料源對象設定屬性值,然後擷取資料庫連接配接對象

2.通過讀取配置檔案建立資料源對象

繼續閱讀