Java資料庫連接(JDBC)由一組用 Java 程式設計語言編寫的類和介面組成。JDBC 為工具/資料庫開發人員提供了一個標準的 API,使他們能夠用純Java API 來編寫資料庫應用程式。然而各個開發商的介面並不完全相同,所以開發環境的變化會帶來一定的配置變化。本文主要集合了不同資料庫的串連方式。
一、串連各種資料庫方式速查表
下面羅列了各種資料庫使用JDBC串連的方式,可以作為一個手冊使用。
1、Oracle8/8i/9i資料庫(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為資料庫的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2、DB2資料庫
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample為你的資料庫名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000資料庫
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb為資料庫
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase資料庫
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB為你的資料庫名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix資料庫
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB為資料庫名
Connection conn= DriverManager.getConnection(url);
6、MySQL資料庫
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB為資料庫名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL資料庫
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB為資料庫名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
8、access資料庫直連用ODBC的
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;
二、JDBC串連MySql方式
下面是使用JDBC串連MySql的一個小的教程
1、尋找驅動程式
MySQL目前提供的java驅動程式為Connection/J,可以從MySQL官方網站下載,並找到mysql-connector-java-3.0.15-ga-bin.jar檔案,此驅動程式為純java驅動程式,不需做其他配置。
2、動態指定classpath
如果需要執行時動態指定classpath,就在執行時採用-cp方式。否則將上面的.jar檔案加入到classpath環境變數中。
3、載入驅動程式
try{
Class.forName(com.mysql.jdbc.Driver);
System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
System.out.println(Error loading Mysql Driver!);
e.printStackTrace();
}
4、設定串連的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
三、以下列出了在使用JDBC來串連Oracle資料庫時可以使用的一些技巧
1、在用戶端軟體開發中使用Thin驅動程式
在開發Java軟體方面,Oracle的資料庫提供了四種類型的驅動程式,二種用於應用軟體、applets、servlets等用戶端軟體,另外二種用於資料庫中的Java預存程序等伺服器端軟體。在客戶機端軟體的開發中,我們可以選擇OCI驅動程式或Thin驅動程式。OCI驅動程式利用Java本地化介面(JNI),通過Oracle用戶端軟體與資料庫進行通訊。Thin驅動程式是純Java驅動程式,它直接與資料庫進行通訊。為了獲得最高的效能,Oracle建議在用戶端軟體的開發中使用OCI驅動程式,這似乎是正確的。但我建議使用Thin驅動程式,因為通過多次測試發現,在通常情況下,Thin驅動程式的效能都超過了OCI驅動程式。
2、關閉自動認可功能,提高系統效能
在第一次建立與資料庫的串連時,在預設情況下,串連是在自動認可模式下的。為了獲得更好的效能,可以通過調用帶布爾值false參數的Connection類的setAutoCommit()方法關閉自動認可功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦關閉了自動認可功能,我們就需要通過調用Connection類的commit()和rollback()方法來人工的方式對事務進行管理。
3、在動態SQL或有時間限制的命令中使用Statement對象
在執行SQL命令時,我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。這可能會使你認為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進行的測試表明,在用戶端軟體中,情況並非如此。因此,在有時間限制的SQL操作中,除非成批地處理SQL命令,我們應當考慮使用Statement對象。
此外,使用Statement對象也使得編寫動態SQL命令更加簡單,因為我們可以將字串串連在一起,建立一個有效SQL命令。因此,我認為,Statement對象可以使動態SQL命令的建立和執行變得更加簡單。
4、利用helper函數對動態SQL命令進行格式化
在建立使用Statement對象執行的動態SQL命令時,我們需要處理一些格式化方面的問題。例如,如果我們想建立一個將名字O'Reilly插入表中的SQL命令,則必須使用二個相連的“''”號替換O'Reilly中的“'”號。完成這些工作的最好的方法是建立一個完成替換操作的helper方法,然後在連接字串心服用公式表達一個SQL命令時,使用建立的helper方法。與此類似的是,我們可以讓helper方法接受一個Date型的值,然後讓它輸出基於Oracle的to_date()函數的字串運算式。
5、利用PreparedStatement對象提高資料庫的總體效率
在使用PreparedStatement對象執行SQL命令時,命令被資料庫進行解析和編譯,然後被放到命令緩衝區。然後,每當執行同一個PreparedStatement對象時,它就會被再解析一次,但不會被再次編譯。在緩衝區中可以發現先行編譯的命令,並且可以重新使用。在有大量使用者的企業級應用軟體中,經常會重複執行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數的減少能夠提高資料庫的總體效能。如果不是在用戶端建立、預備、執行PreparedStatement任務需要的時間長於Statement任務,我會建議在除動態SQL命令之外的所有情況下使用PreparedStatement對象。
6、在成批處理重複的插入或更新操作中使用PreparedStatement對象
如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時間。Oracle提供的Statement和 CallableStatement並不真正地支援批處理,只有PreparedStatement對象才真正地支援批處理。我們可以使用addBatch()和executeBatch()方法選擇標準的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標準的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機制,可以以如下所示的方式調用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
調用setExecuteBatch()時指定的值是一個上限,當達到該值時,就會自動地引發SQL命令執行,標準的executeUpdate()方法就會被作為批處理送到資料庫中。我們可以通過調用PreparedStatement類的sendBatch()方法隨時傳輸批處理任務。
7、使用Oracle locator方法插入、更新大對象(LOB)
Oracle的PreparedStatement類不完全支援BLOB和CLOB等大對象的處理,尤其是Thin驅動程式不支援利用PreparedStatement對象的setObject()和setBinaryStream()方法設定BLOB的值,也不支援利用setCharacterStream()方法設定CLOB的值。只有locator本身中的方法才能夠從資料庫中擷取LOB類型的值。可以使用PreparedStatement對象插入或更新LOB,但需要使用locator才能擷取LOB的值。由於存在這二個問題,因此,我建議使用locator的方法來插入、更新或擷取LOB的值。
8、使用SQL92文法調用預存程序
在調用預存程序時,我們可以使用SQL92或Oracle PL/SQL,由於使用Oracle PL/SQL並沒有什麼實際的好處,而且會給以後維護你的應用程式的開發人員帶來麻煩,因此,我建議在調用預存程序時使用SQL92。
9、使用Object SQL將對象模式轉移到資料庫中
既然可以將Oracle的資料庫作為一種物件導向的資料庫來使用,就可以考慮將應用程式中的物件導向模式轉到資料庫中。目前的方法是建立Java bean作為偽裝的資料庫物件,將它們的屬性對應到關係表中,然後在這些bean中添加方法。儘管這樣作在Java中沒有什麼問題,但由於操作都是在資料庫之外進行的,因此其他訪問資料庫的應用軟體無法利用對象模式。如果利用Oracle的物件導向的技術,可以通過建立一個新的資料庫物件類型在資料庫中模仿其資料和操作,然後使用JPublisher等工具產生自己的Java bean類。如果使用這種方式,不但Java應用程式可以使用應用軟體的對象模式,其他需要共用你的應用中的資料和操作的應用軟體也可以使用應用軟體中的對象模式。
10、利用SQL完成資料庫內的操作
我要向大家介紹的最重要的經驗是充分利用SQL的面向集合的方法來解決資料庫處理需求,而不是使用Java等過程化的程式設計語言。
如果編程人員要在一個表中尋找許多行,結果中的每個行都會尋找其他表中的資料,最後,編程人員建立了獨立的UPDATE命令來成批地更新第一個表中的資料。與此類似的任務可以通過在set子句中使用多列子查詢而在一個UPDATE命令中完成。當能夠在單一的SQL命令中完成任務,何必要讓資料在網上流來流去的?我建議使用者認真學習如何最大限度地發揮SQL的功能。
JDBC基礎教程之驅動設定
1、概述
DriverManager 類是 JDBC 的管理層,作用於使用者和驅動程式之間。它跟蹤可用的驅動程式,並在資料庫和相應驅動程式之間建立串連。另外,DriverManager 類也處理諸如驅動程式登入時間限制及登入和跟蹤訊息的顯示等事務。
對於簡單的應用程式,一般程式員需要在此類中直接使用的唯一方法是 DriverManager.getConnection。正如名稱所示,該方法將建立與資料庫的串連。JDBC 允許使用者調用 DriverManager 的方法 getDriver、getDrivers 和 registerDriver 及 Driver 的方法 connect。但多數情況下,讓 DriverManager 類管理建立串連的細節為上策。
1、跟蹤可用驅動程式
DriverManager 類包含一列 Driver 類,它們已通過調用方法 DriverManager.registerDriver 對自己進行了註冊。所有 Driver 類都必須包含有一個靜態部分。它建立該類的執行個體,然後在載入該執行個體時 DriverManager 類進行註冊。這樣,使用者正常情況下將不會直接調用 DriverManager.registerDriver;而是在載入驅動程式時由驅動程式自動調用。載入 Driver 類,然後自動在 DriverManager 中註冊的方式有兩種:
通過調用方法 Class.forName。這將顯式地載入驅動程式類。由於這與外部設定無關,因此推薦使用這種載入驅動程式的方法。以下代碼載入類 acme.db.Driver:
class.forname("acme.db.driver");
如果將 acme.db.Driver 編寫為載入時建立執行個體,並調用以該執行個體為參數的 DriverManager.registerDriver(本該如此),則它在 DriverManager 的驅動程式列表中,並可用於建立串連。
通過將驅動程式添加到 java.lang.System 的屬性 jdbc.drivers 中。這是一個由 DriverManager 類載入的驅動程式類名的列表,由冒號分隔:初始化 DriverManager 類時,它搜尋系統屬性 jdbc.drivers,如果使用者已輸入了一個或多個驅動程式,則 DriverManager 類將試圖載入它們。以下代碼說明程式員如何在 ~/.hotjava/properties 中輸入三個驅動程式類(啟動時,HotJava 將把它載入到系統屬性列表中):
jdbc.drivers=foo.bah.driver:wombat.sql.driver:bad.test.ourdriver;
對 DriverManager 方法的第一次調用將自動載入這些驅動程式類。
注意:載入驅動程式的第二種方法需要持久的預設環境。如果對這一點不能保證,則調用方法 Class.forName 顯式地載入每個驅動程式就顯得更為安全。這也是引入特定驅動程式的方法,因為一旦 DriverManager 類被初始化,它將不再檢查 jdbc.drivers 屬性列表。
在以上兩種情況中,新載入的 Driver 類都要通過調用 DriverManager.registerDriver 類進行自我註冊。如上所述,載入類時將自動執行這一過程。
由於安全方面的原因,JDBC 管理層將跟蹤哪個類載入器提供哪個驅動程式。這樣,當 DriverManager 類開啟串連時,它僅使用本地檔案系統或與發出串連請求的代碼相同的類載入器提供的驅動程式。
2、建立串連
載入 Driver 類並在 DriverManager 類中註冊後,它們即可用來與資料庫建立串連。當調用 DriverManager.getConnection 方法發出串連請求時,DriverManager 將檢查每個驅動程式,查看它是否可以建立串連。
有時可能有多個 JDBC 驅動程式可以與給定的 URL 串連。例如,與給定遠端資料庫串連時,可以使用 JDBC-ODBC 橋驅動程式、JDBC 到通用網路通訊協定驅動程式或資料庫廠商提供的驅動程式。在這種情況下,測試驅動程式的順序至關重要,因為 DriverManager 將使用它所找到的第一個可以成功串連到給定 URL 的驅動程式。
首先 DriverManager 試圖按註冊的順序使用每個驅動程式(jdbc.drivers 中列出的驅動程式總是先註冊)。它將跳過代碼不可信任的驅動程式,除非載入它們的源與試圖開啟串連的代碼的源相同。
它通過輪流在每個驅動程式上調用方法 Driver.connect,並向它們傳遞使用者開始傳遞給方法 DriverManager.getConnection 的 URL 來對驅動程式進行測試,然後串連第一個認出該 URL 的驅動程式。
這種方法初看起來效率不高,但由於不可能同時載入數十個驅動程式,因此每次串連實際只需幾個程序呼叫和字串比較。
以下代碼是通常情況下用驅動程式(例如 JDBC-ODBC 橋驅動程式)建立串連所需所有步驟的樣本:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //載入驅動程式
String url = "jdbc:dbc:fred";
DriverManager.getConnection(url, "userID", "passwd");