Java數據庫編程

1、JDBC概述

(1)JDBC簡介
JDBC:Java數據庫連接,提供了一種與平臺無關的用於執行SQL語句的標準Java API,可以方便地實現多種關係型數據庫的統一操作,它由一組用Java羽凡編寫的類和接口組成。

(2)JDBC驅動分類
針對每一個數據庫廠商會提供一個JDBC的驅動程序。
常見的JDBC驅動程序可以分爲以下4類:
①JDBC-ODBC 驅動
JDBC-ODBC是SUN提供的一個標準的JDBC操作,直接利用微軟的ODBC進行數據庫的連接操作,但是這種操作性能較低,故不推薦使用。
②JDBC本地驅動
直接使用各個數據庫生產商提供的JDBC驅動程序,但是因爲其只能應用在特定的數據庫上,會喪失掉程序的可移植性,但是這樣操作的性能較高。
開發中使用此種模式最多。
③JDBC網絡驅動
這種驅動程序將JDBC轉換爲與DBMS無關的網絡協議,之後這種協議又被某個服務器轉換爲一種DBMS協議。這種網絡服務器中間件能夠將它的純Java客戶機連接到多種不同的數據庫上。所用的具體協議取決於提供者。通常,這是最爲靈活的JDBC驅動程序。
④本地協議純JDBC驅動
這種類型的驅動程序將JDBC調用直接轉換爲DBMS所使用的網絡協議。這將允許從庫戶籍機器上直接調用DBMS服務器,是Internet訪問的一個很實用的解決方法。

(3)JDBC的主要操作類及接口
這裏寫圖片描述
這裏寫圖片描述

2、MySQL數據庫

MySQL是一個小型關係型數據庫管理系統。
常用命令:
連接mysql數據庫:mysql -u 用戶名 -p 密碼
創建數據庫:CREATE DATABASE 數據庫名稱;
刪除數據庫:DROP DATABASE 數據庫名稱;
使用數據庫:USE 數據庫名稱;
創建數據庫表:CREATE TABLE 表名稱{
字段名稱1 字段類型 [DEFAULT 默認值][約束],
字段名稱2 字段類型 [DEFAULT 默認值][約束],
字段名稱3 字段類型 [DEFAULT 默認值][約束],

}
刪除數據庫表:DROP TABLE 表名稱;
查看錶結構:DESC 表名稱;
查看全部數據庫:SHOW DATABASES;
查看一個數據庫的全部表:SHOW TABLES;

3、SQL語法基礎

SQL(結構查詢語言)是一個功能強大的數據庫語言。SQL通常用於與數據庫的通訊。SQL是關係數據庫管理系統的標準語言。
SQL可以分爲:
①DML(數據操作語言):用於檢索或修改數據;
②DDL(數據定義語言):用於定義數據的結構,如創建、修改或者刪除數據庫對象;
③DCL(數據控制語言):用於定義數據庫用戶的權限。

這裏寫圖片描述
這裏寫圖片描述
增加數據:INSERT INTO 表名稱[(字段1,字段2,字段3,…,字段n)] VALUES (值1,值2,值3,…,值n);
刪除數據:DELETE FORM 表名稱 [刪除條件];
更新數據:UPDATE 表名稱 SET 字段1=值1,…,字段n=值1 [WHERE 更新條件]
查詢數據:SELECT {*|column alias} FORM 表名稱 別名 [WHERE condition(s)];

4、JDBC操作步驟

①加載數據庫驅動程序;
②連接數據庫;
③使用語句進行數據庫操作;
④關閉數據庫連接。
這裏寫圖片描述

5、連接數據庫

(1)配置MySQL數據庫的驅動程序
(2)加載驅動程序
(3)連接及關閉數據庫
數據庫驅動程序可以正常加載的話,可以使用DriverManager類進行連接操作。
其常用方法:
這裏寫圖片描述
在連接的時候需要一個連接地址,這些連接地址將由各個數據庫生產商提供的。
在DrvierManager中,提供的主要操作是得到一個數據庫的連接,getConnection()
方法就是取得連接對象,此方法返回的類型是Connection,不管使用哪種方式連接,都必須提供一個數據庫的連接地址,如果在連接數據庫的時候需要用戶名和密碼,則還需要將用戶名和密碼設置上。
MySQL數據庫的連接地址格式:jdbc:mqsql://IP地址:端口號/數據庫名稱

Connection接口的常用方法:

通過DriverManager取得Connection對象之後,實際上就表示數據庫連接上了,連接上數據庫之後就可以進行數據庫的更新及查詢操作,但是操作的最後數據庫連接必須關閉。

6、執行數據庫的更新操作

數據庫可以連接之後,就可以進行數據庫的具體操作了,如果要想對數據庫進行操作,則肯定要使用Statement接口完成,此接口可以使用Connection接口中提供的createStatement()方法實例化。
常用方法如下:
這裏寫圖片描述

7、ResultSet接口(接收查詢結果)

使用SQL中的SELECT語句將數據庫的全部結果查詢出來,在JDBC的操作中數據庫的所有查詢記錄將使用 ResuleSet進行接收,並使用ResultSet顯示內容。
這裏寫圖片描述
注:雖然結果保存在了ResultSet對象中,實際上就是保存在了內存中。所以開發中藥限制查詢數量。

數據庫的更新操作可以使用Statement()接口定義的executeUpdate()方法。
數據庫的查詢操作可以使用Statement()接口定義的executeQuery()方法,此方法的返回值類型就是一個ResultSet的對象,此對象中存放了所有的查詢結果。
通過ResultSet接口依次取出其中的對象。
ResultSet中的所有數據都可以通過getString()方法取得。

8、PreparedStatement接口

PreparedStatement是Statement的子接口,屬於預處理操作,與直接使用Statement不同的是,PreparedStatement在操作時,是先在數據表之中準備好了一條SQL語句,但是此SQL語句的具體內容暫時不設置,而之後再進行設置,以插入數據爲例,使用PreparedStatement插入數據時,數據表中的指針首先指向最好一條數據之後,但是裏面的內容是不知道的,而是等待用戶分別設置。
PreparedStatement對象已編譯過,所以其執行速度要高於Statement對象。因此,對於需要多次執行SQL語句經常使用PreparedStatement對象操作,以提高效率。

PreparedStatement的基本操作方法
這裏寫圖片描述

注:正常情況下都使用java.util.Date表示日起,但是在PreparedStatement中如果要想使用日起必須使用java.sql.Date類型。

注意:設置日期格式的問題
在PreparedStatement中定義了setDate()方法,此方法可以設置日期內容,但是此方法使用時,後面的Date類型變量是java.sql.Date,而不是java.util.Date,所以如果要想將一個java,util.Date類型的內容變爲java.sql.Date類型的內容應用使用如下的語句形式:

String birthdat=2007-12-21”;
java,util.Date temp=null;
temp=new SimpleDateFormat(“yyyy-MM-dd”).parse(birthday);
java.sql.Date bir=new java.sql.Date(temp.getTime());

在開發中很少使用Statement對象進行操作,因爲Statement執行的是一個完整的SQL語句,這樣在程序中往往要使用拼湊的SQL語句完成,而且如果此時由用戶自己輸入數據,往往會出現輸入非法字符而造成程序出錯,也可能引起系統的安全漏洞。
所以開發中不建議使用Statement完成,而都是使用PreparedStatement完成操作。

9、處理大數據對象

大數據處理主要指的是CLOB和BLOB兩種類型的字段。在CLOB中可以存儲海量文字;在BLOB中可以存儲二進制數據。
如果程序中想處理這樣的大數據操作,則必須使用PreparedStatement完成,所有的內容要通過IO流的方式從大文本字段中保存和讀取。
這裏寫圖片描述

PreparedStatement有如下方法專門用來寫入大對象數據。
這裏寫圖片描述

大對象設置到數據庫中後,在查詢時就需要使用Result將其讀取進來,在Result中提供如下方法來讀取大對象數據。
這裏寫圖片描述

(1)處理CLOB數據
CLOB表示大文本數據,在MySQL中提供了LONGTEXT表示大文本數據,此字段的最大保存數據量爲4GB。

大文本數據內容可以通過ResultSet讀取進來;也可以使用ResultSet中提供的getClob()方法,將全部的內容變爲Clob對象的內容,直接使用Clob可以方便的取得大文本數據,也可以對這些數據進行一些簡單的操作,如截取指定長度的文本等。

(2)處理BLOB數據
BLOB專門用於存放二進制數據,如圖片、電影等。
在MySQL中使用LONGBLOB聲明,最高可以保存4GB大小的內容。

雖然在JDBC中提供了大對象的操作支持,但是如果內容太大(如電影),則不建議使用以上方式進行保存,可以通過做映射路徑的方式保存具體的信息,即在數據庫中使用一個VARCHAR的普通字段保存一個文件的文件名稱,且文件直接保存在硬盤上。

10、CallableStatement接口(調用存儲過程) 很少使用

CallableStatement主要是調用數據庫中的存儲過程,CallableStatement接口也是Statement的子接口,在使用CallableStatement時可以接收過程的返回值,此接口的常用方法如下:
這裏寫圖片描述

在JDBC中,如果要想設置過程的返回值類型,可以使用Types完成, 在Types中定義了很多的常量,如果現在返回值類型爲Int,則使用Types.INTEGER。

11、JDBC2.0操作

在JDBC2.0中,加強了結果集ResultSet的功能,可以直接使用ResultSet執行更新的操作或者實現雙向滾動。
(1)可滾動的結果集
如果要想創建可滾動的結果集,則在創建PrepareStatement(Statement)的時候必須指定了創建的類型。
可滾動的結果集操作本身並不難理解,只是在創建數據庫操作對象時加入若干參數即可。

Conn=DriverManager.getConnection(DBURL,DBUSR,DBPASS);
Pstmt=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=pstmt.executeQuery();

注:其中的兩個常量第一個表示結果集可滾動,第二個表示以只讀的形式打開結果集。
(2)使用結果集插入數據
(3)使用結果集更新數據
(4)使用結果集刪除數據

(5)批處理
使用批處理可以直接一次完成多個語句的執行。
要完成批處理操作,則要使用addBatch()加入要執行的一條SQL命令以及executeBatch()執行全部命令兩個方法完成。

12、事務處理

事務就是保證操作的一致性,所有的操作要麼全部成功,要麼全部失敗。
事務本身具有原子性、一致性、隔離性或獨立性、持久性4個特徵。

MySQL中提供瞭如下幾個命令,可以進行事務的處理。
這裏寫圖片描述

以上所有操作都是針對於一個session的,在數據庫操作中把每一個連接到此數據庫上的用戶都稱爲一個session。
在MySQL中,如果要應用事務處理,則必須按照以下的步驟完成:
①取消掉自動提交,執行:SET AUTOCOMMIT=0。這樣所有的更新指令並不會立刻發送到數據表中,而之存在於當前的session。
②開啓事務,執行:START TRANSACTION或BEGIN。
③編寫數據庫更新語句,如增加、刪除、修改,可以在編寫的更新語句之間記錄事務的保存點,使用SAVEPOINT指令。
④提交事務,如果確信數據庫的修改沒有任何的錯誤,則使用COMMIT提交事務。在提交之前對數據庫所做的全部操作都保存在session中。
⑤事務回滾,如果發現執行的SQL語句有錯誤,則使用ROLLBACK命令全部撤銷,或者使用ROLLBACK TO SAVEPOINT記錄點,讓其回滾到指定的位置。
當一個事務進行時,其他的session是無法看到此事務的操作狀態的。即此session對數據庫所做的一切修改,如果沒有提交事務,則其他session是無法看到此session操作結果的。

JDBC操作事務的步驟:
①取消掉自動提交;
②執行多條SQL語句;
③如果沒有異常,則提交事務;
④否則則進行事務的回滾操作。

保存點操作一般來說並不常用。

13、使用元數據分析數據庫

(1)DatabaseMetaData
DatabaseMetaData可以得到數據庫的一些基本信息,包括數據庫的名稱、版本,以及得到表的信息。
這裏寫圖片描述

(2)ResultSetMetaData
使用ResultSetMetaData可獲取關於ResultSet對象中列的類型和屬性信息的對象,ResultSetMetaData存儲了ResultSet的MetaData。可以通過以下的方法取得一些ResultSet的信息。
這裏寫圖片描述

注:以上的兩個操作在一般的數據的開發底層上比較常用,實際上也就是類似於反射的操作機制,取得一些基本的信息,在正常的開發中基本是不會使用的。

14、使用JDBC連接Oracle數據庫

JDBC操作Oracle和MySQL本身沒有太大的區別,所以JDBC提供的是一個標準的操作,但是各個數據庫本身是有差異的,例如:MySQL中自動增長使用的AUTO_INCREMENT不需要用戶調用,而在Oracle中就必須使用手工調用SEQUENCE的形式完成。

如果數據量比較少,可以選擇MySQL;而數據量比較大的話,建議使用Oracle。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章