使用 Microsoft SQL Server JDBC Driver 3.0 讀取 SQL Server 2008 資料庫
本篇文章介紹使用 Microsoft SQL Server JDBC 3.0 連接 SQL Server 2008 資料庫, 並且透過簡單的 Java 範例程式讀取資料表內容。
首先,請到 Microsoft Download Center 下載 Microsoft SQL Server JDBC Driver 3.0
如果是 Windows 平台請下載 sqljdbc_3.0.1301.101_cht.exe, Unix-Like 平台則下載 sqljdbc_3.0.1301.101_cht.tar.gz
按照指示將下載的檔案解壓縮後,就可以讀取 sqljdbc_3.0 –> cht –> help –> default.htm 了解 JDBC Driver 的介紹
help 內的 default.htm 說明相當完整,這也是艾小克非常喜歡 Microsoft 的一點,許多的產品都擁有相當完整的說明,如 MSDN Library
JDBC Driver 3.0 裡面包含兩個 jar 檔:sqljdbc.jar 和 sqljdbc4.jar,可以視專案需求引用:
本篇文章 Java 範例是以 Java SDK 6.0 及 Eclipse 開發,所以引用 sqljdbc4.jar 進行開發。
sqljdbc4.jar 類別庫會提供 JDBC 4.0 的支援。 它包括 sqljdbc.jar 的所有功能以及新增的 JDBC 4.0 方法。
sqljdbc4.jar 類別庫需要使用 JRE 6.0 版或更新版本。 在 JRE 1.4 或 5.0 上使用 sqljdbc4.jar 將會擲回例外狀況。
SQL Server 2008 同時支援 JDBC 3.0 及 4.0
(如果還不會引用 jar 檔案,請參考 「Java TDD 開發流程」 與 「Eclipse - 加入外部 JAR」)
如同 .Net 中 ADO.Net 的使用 Java 讀取資料的步驟,也包含:建立 Connection、建立 sql 語法、執行 sql 語法、讀取 sql 結果。
1. 建立 Connection Url (Connection String)
字串格式為: jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
其中:
- jdbc:sqlserver:// (必要項) 也就是子通訊協定,並且是常數。
- serverName (選擇項) 是要連接的伺服器位址。 此項可以是 DNS 或 IP 位址,或也可以是本機電腦的 localhost 或 127.0.0.1。
- instanceName (選擇項) 是 serverName 上要連接的執行個體。 如果未指定,將會連接到預設執行個體。
- portNumber (選擇項) 是 serverName 上要連接的通訊埠。 預設值是 1433。 如果您使用預設值,則不需在 URL 中指定通訊埠,也不需指定前面的 ':'。
-
property (選擇項) 是一或多個選項連接屬性。 可以指定清單中的任何屬性。 屬性只能使用分號 (';') 來分隔,且不能重複。
例如:integratedSecurity=true; 設定為整合性驗證 -
注意: 若要達到最佳的連接效能,在連接到具名執行個體時應設定 portNumber。
如此可避免為了判斷通訊埠號碼而徒勞往返於伺服器。
如果同時使用 portNumber 及 instanceName,將優先使用 portNumber 並忽略 instanceName。
連結範例:
-
使用整合式驗證,連接到本機電腦上的預設資料庫:
jdbc:sqlserver://localhost;integratedSecurity=true; -
連接到遠端伺服器上的具名資料庫:
jdbc:sqlserver://localhost;databaseName=AdventureWorks;integratedSecurity=true; -
以預設通訊埠連接到遠端伺服器:
jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks;integratedSecurity=true; -
指定自訂的應用程式名稱以進行連接:
jdbc:sqlserver://localhost;databaseName=AdventureWorks;integratedSecurity=true;applicationName=MyApp;
2. 檢視資料表內容,設計 Class 類別。
艾小克以 Products 資料表為範例,我們先利用 SSMS 來檢視 Northwind 的 Products 資料表 Schema:
在 JDBC 資料說明文件,有建議的 SQL Server 資料型態與 Java 資料型態的對應表,可以自行參閱「了解 JDBC 驅動程式 資料類型」:
因此,我們可以設計 Product 類別,如下:
3. 建立 sql 語法
本篇範例,則挑出 Products 資料表前 10 筆資料,
語法如下:「SELECT TOP 10 ProductID, ProductName, UnitPrice, UnitsInStock, Discontinued FROM dbo.Products;」
我們會使用到的 Java 程式碼中,要記得要引用相關的命名空間,如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
4. 完整程式碼,如下:
其中 17 行 DriverManager.getConnection 就是幫助我們建立 SQL Server 2008 的連線 (相當於 .Net 的 SqlConnection)
第一個參數就是 ConnectionUrl,
第二、三個參數是登入 Northwind 資料庫的帳號及密碼,如果沒有設定帳號密碼,則只帶入一個參數的多載方法即可。
20 行 sql 就是我們 sql 語法的字串值
21 行 利用 conn 連線物件的 createStatement() 方法建立 Statement 物件 stmt (相當於 .Net 的 SqlCommand)
22 行則是利用 Statement 物件執行 exexcuteQuery() 方法,取得 ResultSet 物件 rs (相當於 .Net 的 SqlDataReader)
24 – 28 行則是透過 ResultSet 物件不斷地使用 next() 方法讀取資料列,
其中 rs.getXXX() 方法則依照 SQL Server 資料型態與 Java 資料型態的對應表讀出,
例如: int 則使用 getInt();nvarchar, varchar 等則使用 getString();smallint 則使用 getShort();money 則使用 getBigDecimal() …等
則 getXXX() 方法參數,則可以使用 column 或是 columnsName 代入。
29-31 行則是保持好習慣,該關的物件不使用的時候就要關閉。
5. 以下是該範例的執行結果: