來(lái)源: huangmp 發(fā)布時(shí)間:2018-11-14 11:25:44 閱讀量:914
Java數(shù)據(jù)庫(kù)連接(JDBC)由一組用 Java 編程語(yǔ)言編寫的類和接口組成。JDBC 為工具/數(shù)據(jù)庫(kù)開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的 API,使他們能夠用純Java API 來(lái)編寫數(shù)據(jù)庫(kù)應(yīng)用程序。然而各個(gè)開發(fā)商的接口并不完全相同,所以開發(fā)環(huán)境的變化會(huì)帶來(lái)一定的配置變化。本文主要集合了不同數(shù)據(jù)庫(kù)的連接方式。
一、連接各種數(shù)據(jù)庫(kù)方式:
1、Oracle8/8i/9i數(shù)據(jù)庫(kù)(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數(shù)據(jù)庫(kù)的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2、DB2數(shù)據(jù)庫(kù)
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample為你的數(shù)據(jù)庫(kù)名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000數(shù)據(jù)庫(kù)
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb為數(shù)據(jù)庫(kù)
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase數(shù)據(jù)庫(kù)
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB為你的數(shù)據(jù)庫(kù)名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix數(shù)據(jù)庫(kù)
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為數(shù)據(jù)庫(kù)名
Connection conn= DriverManager.getConnection(url);
6、MySQL數(shù)據(jù)庫(kù)
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB為數(shù)據(jù)庫(kù)名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL數(shù)據(jù)庫(kù)
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB為數(shù)據(jù)庫(kù)名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
8、access數(shù)據(jù)庫(kù)直連用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的一個(gè)小的教程
1、查找驅(qū)動(dòng)程序
MySQL目前提供的java驅(qū)動(dòng)程序?yàn)镃onnection/J,可以從MySQL官方網(wǎng)站下載,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驅(qū)動(dòng)程序?yàn)榧僯ava驅(qū)動(dòng)程序,不需做其他配置。
2、動(dòng)態(tài)指定classpath
如果需要執(zhí)行時(shí)動(dòng)態(tài)指定classpath,就在執(zhí)行時(shí)采用-cp方式。否則將上面的.jar文件加入到classpath環(huán)境變量中。
3、加載驅(qū)動(dòng)程序
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、設(shè)置連接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
三、以下列出了在使用JDBC來(lái)連接Oracle數(shù)據(jù)庫(kù)時(shí)可以使用的一些技巧,這些技巧能夠使我們更好地發(fā)揮系統(tǒng)的性能和實(shí)現(xiàn)更多的功能(系轉(zhuǎn)載)。
1、在客戶端軟件開發(fā)中使用Thin驅(qū)動(dòng)程序
在開發(fā)Java軟件方面,Oracle的數(shù)據(jù)庫(kù)提供了四種類型的驅(qū)動(dòng)程序,二種用于應(yīng)用軟件、applets、servlets等客戶端軟件,另外二種用于數(shù)據(jù)庫(kù)中的Java存儲(chǔ)過(guò)程等服務(wù)器端軟件。在客戶機(jī)端軟件的開發(fā)中,我們可以選擇OCI驅(qū)動(dòng)程序或Thin驅(qū)動(dòng)程序。OCI驅(qū)動(dòng)程序利用Java本地化接口(JNI),通過(guò)Oracle客戶端軟件與數(shù)據(jù)庫(kù)進(jìn)行通訊。Thin驅(qū)動(dòng)程序是純Java驅(qū)動(dòng)程序,它直接與數(shù)據(jù)庫(kù)進(jìn)行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發(fā)中使用OCI驅(qū)動(dòng)程序,這似乎是正確的。但我建議使用Thin驅(qū)動(dòng)程序,因?yàn)橥ㄟ^(guò)多次測(cè)試發(fā)現(xiàn),在通常情況下,Thin驅(qū)動(dòng)程序的性能都超過(guò)了OCI驅(qū)動(dòng)程序。
2、關(guān)閉自動(dòng)提交功能,提高系統(tǒng)性能
在第一次建立與數(shù)據(jù)庫(kù)的連接時(shí),在缺省情況下,連接是在自動(dòng)提交模式下的。為了獲得更好的性能,可以通過(guò)調(diào)用帶布爾值false參數(shù)的Connection類的setAutoCommit()方法關(guān)閉自動(dòng)提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦關(guān)閉了自動(dòng)提交功能,我們就需要通過(guò)調(diào)用Connection類的commit()和rollback()方法來(lái)人工的方式對(duì)事務(wù)進(jìn)行管理。
3、在動(dòng)態(tài)SQL或有時(shí)間限制的命令中使用Statement對(duì)象
在執(zhí)行SQL命令時(shí),我們有二種選擇:可以使用PreparedStatement對(duì)象,也可以使用Statement對(duì)象。無(wú)論多少次地使用同一個(gè)SQL命令,PreparedStatement都只對(duì)它解析和編譯一次。當(dāng)使用Statement對(duì)象時(shí),每次執(zhí)行一個(gè)SQL命令時(shí),都會(huì)對(duì)它進(jìn)行解析和編譯。這可能會(huì)使你認(rèn)為,使用PreparedStatement對(duì)象比使用Statement對(duì)象的速度更快。然而,我進(jìn)行的測(cè)試表明,在客戶端軟件中,情況并非如此。因此,在有時(shí)間限制的SQL操作中,除非成批地處理SQL命令,我們應(yīng)當(dāng)考慮使用Statement對(duì)象。
此外,使用Statement對(duì)象也使得編寫動(dòng)態(tài)SQL命令更加簡(jiǎn)單,因?yàn)槲覀兛梢詫⒆址B接在一起,建立一個(gè)有效的SQL命令。因此,我認(rèn)為,Statement對(duì)象可以使動(dòng)態(tài)SQL命令的創(chuàng)建和執(zhí)行變得更加簡(jiǎn)單。
4、利用helper函數(shù)對(duì)動(dòng)態(tài)SQL命令進(jìn)行格式化
在創(chuàng)建使用Statement對(duì)象執(zhí)行的動(dòng)態(tài)SQL命令時(shí),我們需要處理一些格式化方面的問(wèn)題。例如,如果我們想創(chuàng)建一個(gè)將名字O'Reilly插入表中的SQL命令,則必須使用二個(gè)相連的"''"號(hào)替換O'Reilly中的"'"號(hào)。完成這些工作的最好的方法是創(chuàng)建一個(gè)完成替換操作的helper方法,然后在連接字符串心服用公式表達(dá)一個(gè)SQL命令時(shí),使用創(chuàng)建的helper方法。與此類似的是,我們可以讓helper方法接受一個(gè)Date型的值,然后讓它輸出基于Oracle的to_date()函數(shù)的字符串表達(dá)式。
5、利用PreparedStatement對(duì)象提高數(shù)據(jù)庫(kù)的總體效率
在使用PreparedStatement對(duì)象執(zhí)行SQL命令時(shí),命令被數(shù)據(jù)庫(kù)進(jìn)行解析和編譯,然后被放到命令緩沖區(qū)。然后,每當(dāng)執(zhí)行同一個(gè)PreparedStatement對(duì)象時(shí),它就會(huì)被再解析一次,但不會(huì)被再次編譯。在緩沖區(qū)中可以發(fā)現(xiàn)預(yù)編譯的命令,并且可以重新使用。在有大量用戶的企業(yè)級(jí)應(yīng)用軟件中,經(jīng)常會(huì)重復(fù)執(zhí)行相同的SQL命令,使用PreparedStatement對(duì)象帶來(lái)的編譯次數(shù)的減少能夠提高數(shù)據(jù)庫(kù)的總體性能。如果不是在客戶端創(chuàng)建、預(yù)備、執(zhí)行PreparedStatement任務(wù)需要的時(shí)間長(zhǎng)于Statement任務(wù),我會(huì)建議在除動(dòng)態(tài)SQL命令之外的所有情況下使用PreparedStatement對(duì)象。
6、在成批處理重復(fù)的插入或更新操作中使用PreparedStatement對(duì)象
如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時(shí)間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對(duì)象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標(biāo)準(zhǔn)的JDBC批處理,或者通過(guò)利用PreparedStatement對(duì)象的setExecuteBatch()方法和標(biāo)準(zhǔn)的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機(jī)制,可以以如下所示的方式調(diào)用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);
...
pstmt.executeUpdate();
}
調(diào)用setExecuteBatch()時(shí)指定的值是一個(gè)上限,當(dāng)達(dá)到該值時(shí),就會(huì)自動(dòng)地引發(fā)SQL命令執(zhí)行,標(biāo)準(zhǔn)的executeUpdate()方法就會(huì)被作為批處理送到數(shù)據(jù)庫(kù)中。我們可以通過(guò)調(diào)用PreparedStatement類的sendBatch()方法隨時(shí)傳輸批處理任務(wù)。
7、使用Oracle locator方法插入、更新大對(duì)象(LOB)
Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對(duì)象的處理,尤其是Thin驅(qū)動(dòng)程序不支持利用PreparedStatement對(duì)象的setObject()和setBinaryStream()方法設(shè)置BLOB的值,也不支持利用setCharacterStream()方法設(shè)置CLOB的值。只有l(wèi)ocator本身中的方法才能夠從數(shù)據(jù)庫(kù)中獲取LOB類型的值??梢允褂肞reparedStatement對(duì)象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個(gè)問(wèn)題,因此,我建議使用locator的方法來(lái)插入、更新或獲取LOB的值。
8、使用SQL92語(yǔ)法調(diào)用存儲(chǔ)過(guò)程
在調(diào)用存儲(chǔ)過(guò)程時(shí),我們可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并沒(méi)有什么實(shí)際的好處,而且會(huì)給以后維護(hù)你的應(yīng)用程序的開發(fā)人員帶來(lái)麻煩,因此,我建議在調(diào)用存儲(chǔ)過(guò)程時(shí)使用SQL92。
9、使用Object SQL將對(duì)象模式轉(zhuǎn)移到數(shù)據(jù)庫(kù)中
既然可以將Oracle的數(shù)據(jù)庫(kù)作為一種面向?qū)ο蟮臄?shù)據(jù)庫(kù)來(lái)使用,就可以考慮將應(yīng)用程序中的面向?qū)ο竽J睫D(zhuǎn)到數(shù)據(jù)庫(kù)中。目前的方法是創(chuàng)建Java bean作為偽裝的數(shù)據(jù)庫(kù)對(duì)象,將它們的屬性映射到關(guān)系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒(méi)有什么問(wèn)題,但由于操作都是在數(shù)據(jù)庫(kù)之外進(jìn)行的,因此其他訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用軟件無(wú)法利用對(duì)象模式。如果利用Oracle的面向?qū)ο蟮募夹g(shù),可以通過(guò)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)對(duì)象類型在數(shù)據(jù)庫(kù)中模仿其數(shù)據(jù)和操作,然后使用JPublisher等工具生成自己的Java bean類。如果使用這種方式,不但Java應(yīng)用程序可以使用應(yīng)用軟件的對(duì)象模式,其他需要共享你的應(yīng)用中的數(shù)據(jù)和操作的應(yīng)用軟件也可以使用應(yīng)用軟件中的對(duì)象模式。
10、利用SQL完成數(shù)據(jù)庫(kù)內(nèi)的操作
我要向大家介紹的最重要的經(jīng)驗(yàn)是充分利用SQL的面向集合的方法來(lái)解決數(shù)據(jù)庫(kù)處理需求,而不是使用Java等過(guò)程化的編程語(yǔ)言。
如果編程人員要在一個(gè)表中查找許多行,結(jié)果中的每個(gè)行都會(huì)查找其他表中的數(shù)據(jù),最后,編程人員創(chuàng)建了獨(dú)立的UPDATE命令來(lái)成批地更新第一個(gè)表中的數(shù)據(jù)。與此類似的任務(wù)可以通過(guò)在set子句中使用多列子查詢而在一個(gè)UPDATE命令中完成。當(dāng)能夠在單一的SQL命令中完成任務(wù),何必要讓數(shù)據(jù)在網(wǎng)上流來(lái)流去的?我建議用戶認(rèn)真學(xué)習(xí)如何最大限度地發(fā)揮SQL的功能
應(yīng)用Java技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)
Java 語(yǔ)言是Sun MicroSystems 公司于1995年正式命名并推出的一種面向?qū)ο蟮木幊陶Z(yǔ)言-OOP(abbr.Object Oriented Programming)。Sun 公司說(shuō):Java 程序設(shè)計(jì)語(yǔ)言被設(shè)計(jì)成是 by programmers for programmers,其隨著 Internet 的發(fā)展而廣為流行。用它開發(fā)的系統(tǒng)“一次開發(fā),到處運(yùn)行”的特色以及程序開發(fā)設(shè)計(jì)時(shí)所體現(xiàn)出的面向?qū)ο蟮乃枷肷钌畹赜|動(dòng)著人們。它的語(yǔ)言簡(jiǎn)潔、集多種程序設(shè)計(jì)語(yǔ)言之大成,且面向?qū)ο?、具有可移植性、分布性、安全性、高性能等特色。Java在向Internet/Intranet,甚至計(jì)算機(jī)世界的各個(gè)領(lǐng)域滲透,慢慢改變著人們的思維。而今Internet 熱浪一浪高過(guò)一浪,從外部世界走向企業(yè)內(nèi)部形成Intranet,促進(jìn)了Java 技術(shù)的利用開發(fā)。計(jì)算機(jī)業(yè)界中的IBM、ORACAL 、APPLE、Sun、Netscape五家公司還聯(lián)合推出“網(wǎng)絡(luò)計(jì)算機(jī)(NC-1)”規(guī)范。拋開“Wintel”臃腫不堪的體系結(jié)構(gòu),使用戶端價(jià)格低廉、易于使用,并成為能夠連接網(wǎng)絡(luò)的簡(jiǎn)單計(jì)算機(jī)-NC(Network Computer),即所說(shuō)的“瘦客戶”機(jī),NC 支持Java 虛擬機(jī)(JVM),能夠運(yùn)行Java開發(fā)的應(yīng)用程序(Application)和小程序(Applet)并支持多媒體應(yīng)用。NC 和Java 的結(jié)合誕生了新的時(shí)代:網(wǎng)絡(luò)計(jì)算機(jī)時(shí)代。就連Sun的冤家對(duì)頭Microsoft的比爾.蓋茨也不得不承認(rèn):“Java是長(zhǎng)時(shí)間以來(lái)最卓越的程序設(shè)計(jì)語(yǔ)言”。
一、 Java 數(shù)據(jù)庫(kù)基礎(chǔ) JDBC API
Java語(yǔ)言在數(shù)據(jù)庫(kù)應(yīng)用方面,特別在基于Web 的B/S結(jié)構(gòu)的在線數(shù)據(jù)庫(kù)應(yīng)用方面的煩瑣復(fù)雜配置等,并不能使用戶和程序開發(fā)雙方都十分滿意。SunSoft雖提供了用Java語(yǔ)言編寫成的Java與數(shù)據(jù)庫(kù)的接口規(guī)范JDBC(Java DataBase Connectivity,而JavaSoft說(shuō)JDBC并不代表什么),使Java程序可以通過(guò)統(tǒng)一標(biāo)準(zhǔn)規(guī)范的JDBC API來(lái)與不同的數(shù)據(jù)庫(kù)通信。確保了“100%純Java”的解決方案。JDBC API 定義了Java中的類和接口,表示數(shù)據(jù)庫(kù)連接、SQL 指令、結(jié)果集合等。它允許Java程序員發(fā)送SQL 指令并處理結(jié)果。JDBC API 提供兩種主要接口:一是面向開發(fā)人員的java.sql程序包,使得Java程序員能夠進(jìn)行數(shù)據(jù)庫(kù)連接,執(zhí)行SQL查詢,并得到結(jié)果集合。Java2 的java.sql包提供了6個(gè)類和18個(gè)接口,下文將介紹;另一是面向底層數(shù)據(jù)庫(kù)廠商的JDBC Drivers ,目前為止,Java2的JDBC Drivers僅提供下述四種類型的數(shù)據(jù)庫(kù)驅(qū)動(dòng)方式,且各有利弊:
(1) JDBC-ODBC bridge plus ODBC driver 方式:JDBC-ODBC 橋接方式利用微軟的開放數(shù)據(jù)庫(kù)互連接口(ODBC API)同數(shù)據(jù)庫(kù)服務(wù)器通訊,客戶端計(jì)算機(jī)首先應(yīng)該安裝并配置ODBC driver 和JDBC-ODBC bridge兩種驅(qū)動(dòng)程序。這是Applets訪問(wèn)你的數(shù)據(jù)庫(kù)最可能的解決方式,但這對(duì)Internet 和Intranet 用戶而言簡(jiǎn)直是一個(gè)非常令人討厭和麻煩的解決方案。
(2) Native-API partly Java driver方式:這種驅(qū)動(dòng)方式將數(shù)據(jù)庫(kù)廠商的特殊協(xié)議轉(zhuǎn)換成Java代碼及二進(jìn)制類碼,使Java 數(shù)據(jù)庫(kù)客戶方與數(shù)據(jù)庫(kù)服務(wù)器方通信。例如:Oracle用SQLNet協(xié)議,DB2用IBM 的數(shù)據(jù)庫(kù)協(xié)議。數(shù)據(jù)庫(kù)廠商的特殊協(xié)議也應(yīng)該被安裝在客戶機(jī)上。這也是令人討厭和麻煩的解決方案。
(3) JDBC-Net pure Java driver方式:這種方式是純Java driver。數(shù)據(jù)庫(kù)客戶以標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議(如HTTP、SHTTP)同數(shù)據(jù)庫(kù)訪問(wèn)服務(wù)器通信,數(shù)據(jù)庫(kù)訪問(wèn)服務(wù)器然后翻譯標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議成為數(shù)據(jù)庫(kù)廠商的專有特殊數(shù)據(jù)庫(kù)訪問(wèn)協(xié)議(也可能用到ODBC driver)與數(shù)據(jù)庫(kù)通信。對(duì)Internet 和Intranet 用戶而言這是一個(gè)理想的解決方案。Java driver 被自動(dòng)的,以透明的方式隨Applets自Web服務(wù)器而下載并安裝在用戶的計(jì)算機(jī)上。
(4) Native-protocol pure Java driver方式:這種方式也是純Java driver。數(shù)據(jù)庫(kù)廠商提供了特殊的JDBC協(xié)議使Java數(shù)據(jù)庫(kù)客戶與數(shù)據(jù)庫(kù)服務(wù)器通信。然而,將把代理協(xié)議同數(shù)據(jù)庫(kù)服務(wù)器通信改用數(shù)據(jù)庫(kù)廠商的特殊JDBC driver。這對(duì)Intranet 應(yīng)用是高效的,可是數(shù)據(jù)庫(kù)廠商的協(xié)議可能不被防火墻支持,缺乏防火墻支持在Internet 應(yīng)用中會(huì)存在潛在的安全隱患。
綜上四種方式中,只有第三、四種方式的驅(qū)動(dòng)支持 Applet的零安裝。因?yàn)镴DBC drivers 完全用Java 寫成,并從Web 服務(wù)器上隨applet下載。為了支持零安裝,驅(qū)動(dòng)程序應(yīng)該被放在Web上,并與applet 在相同目錄。而第四種存在安全隱患,第三種產(chǎn)品為數(shù)不多,現(xiàn)今較成熟的IDS JDBC driver屬于此種(http://www.idssoftware.com),但也要用到ODBC driver輔助。
即便如此,利用Java技術(shù)開發(fā)單機(jī)環(huán)境應(yīng)用程序,局域網(wǎng)范圍或Intranet環(huán)境下的應(yīng)用程序、動(dòng)態(tài)Web應(yīng)用(Live Intranet)等,Java語(yǔ)言是高效、安全、穩(wěn)定的。Java語(yǔ)言已贏得了眾多廠商的支持,基于其上的Java API-JDBC也發(fā)展迅速。Sun承諾任何Java Applet 或Java應(yīng)用軟件都能夠與數(shù)據(jù)庫(kù)結(jié)合,并且仍將不遺余力的支持未來(lái)Java技術(shù)的發(fā)展。Java語(yǔ)言的跨平臺(tái)特性,使之成為Internet和Intranet環(huán)境下開發(fā)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的理想選擇方案。
二、 Java 數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的實(shí)現(xiàn)
基于此,筆者用Java 2 SDK,Standard Edition Version 1.2.1版本為開發(fā)工具,以已經(jīng)成功開發(fā)的Java數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)案例為模板,結(jié)合Java2程序語(yǔ)句及java.sql包,介紹一下Java數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開發(fā)的具體實(shí)現(xiàn)步驟、方法等。
1.設(shè)置數(shù)據(jù)庫(kù)的連接
為了利用JDBC,你將需要一個(gè)數(shù)據(jù)庫(kù)服務(wù)器和一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)器。因?yàn)榇蠖鄶?shù)讀者的計(jì)算機(jī)已經(jīng)安裝了Windows95/98,我就用微軟的 Access 97做為我的數(shù)據(jù)庫(kù)服務(wù)器(具體為Action.mdb),當(dāng)然你也可以用其它的數(shù)據(jù)庫(kù)作為數(shù)據(jù)庫(kù)服務(wù)器。因?yàn)閷?duì)JDBC而言,數(shù)據(jù)庫(kù)服務(wù)器的類型無(wú)關(guān)緊要,JDBC會(huì)提供一個(gè)獨(dú)立于數(shù)據(jù)庫(kù)服務(wù)器的訪問(wèn)數(shù)據(jù)庫(kù)的方法。這是JDBC的主要優(yōu)勢(shì)所在。
你將還需要一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)器,用來(lái)提供JDBC與你的數(shù)據(jù)庫(kù)的連接。作者選用了較可能的JDBC-ODBC bridge 方式。為此需設(shè)置32-bit ODBC的數(shù)據(jù)源,選擇System DSN(數(shù)據(jù)可被多用戶訪問(wèn),User DSN不同),增加新的數(shù)據(jù)源,配置新數(shù)據(jù)源的路徑為Action.mdb數(shù)據(jù)庫(kù)服務(wù)器的所在位置。
安裝完成,Java程序員可以進(jìn)行編制程序的階段。首先程序員引用java.sql 包中相應(yīng)的類與接口來(lái)進(jìn)行對(duì)JDBC驅(qū)動(dòng)器的管理:用Class 類中的 forName() 方法裝入 JDBC驅(qū)動(dòng)器,以JDBC-ODBC bridge 方式為例,裝入JDBC驅(qū)動(dòng)執(zhí)行的語(yǔ)句為Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);用DriverManager 類中g(shù)etDrivers()方法返回所有安裝在你的計(jì)算機(jī)中的JDBC驅(qū)動(dòng)器,getConnection()建立與數(shù)據(jù)庫(kù)的連接等。getConnection()方法提供下面三種形式:
getConnection(String url)
getConnection(String url,String userID,String password)
getConnection(String url,Properties arguments)
其中字符串url表示數(shù)據(jù)庫(kù)服務(wù)器所在處的特殊的URL。URL是被用來(lái)與不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)建立連接的統(tǒng)一網(wǎng)絡(luò)資源,其形式如下:
jdbc:subprotocol:subname
所有的JDBC數(shù)據(jù)庫(kù)協(xié)議開始于jdbc:。Subprotocol是被用來(lái)辨別JDBC驅(qū)動(dòng)方式的。例如:JDBC-ODBC bridge 用jdbc:odbc:subname 這種用戶協(xié)議形式,IDS JDBC driver 用jdbc:ids:subname 形式。數(shù)據(jù)庫(kù)協(xié)議的subname標(biāo)識(shí)數(shù)據(jù)庫(kù)并且與subprotocol 和JDBC驅(qū)動(dòng)方式有關(guān)。例如,以JDBC-ODBC bridge方式,我用下面的URL形式建立與數(shù)據(jù)源Tend建立連接:
jdbc:odbc:tend
getDrivers()和getConnection()方法是DriverManager類中最重要的方法,還有其它一些方法在此略。
2.與數(shù)據(jù)庫(kù)進(jìn)行連接
用DriverManager類的getConnection() 方法建立起與數(shù)據(jù)庫(kù)連接,getConnection()返回一個(gè)對(duì)象,此對(duì)象是java.sql包中的Connection 接口對(duì)象。該接口定義了與之連接的數(shù)據(jù)庫(kù)交互的一些方法、常量等,這些方法用來(lái)管理數(shù)據(jù)庫(kù)的連接、獲得連接的信息、提交數(shù)據(jù)庫(kù)處理事件并且預(yù)處理可執(zhí)行的SQL語(yǔ)句。下面是Connection 接口的一些重要的方法:
close()-關(guān)閉一個(gè)數(shù)據(jù)庫(kù)連接
getMetaData()-返回一個(gè)DatabaseMetaData 接口對(duì)象,該接口能被用來(lái)獲得有關(guān)數(shù)據(jù)庫(kù)的詳細(xì)信息,包括數(shù)據(jù)庫(kù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)內(nèi)容等。
createStatement()-創(chuàng)建一個(gè)SQL語(yǔ)句對(duì)象。
prepareStatement()-用SQL字符串創(chuàng)建一個(gè)SQL 預(yù)處理語(yǔ)句對(duì)象。預(yù)處理語(yǔ)句對(duì)象是可以被高效執(zhí)行的預(yù)編譯過(guò)的SQL語(yǔ)句。
下面提供一段程序,實(shí)現(xiàn)了JDBC的驅(qū)動(dòng)及數(shù)據(jù)庫(kù)的連接,供參考:
import java.sql.*;
import java.util.*;
class ConnectApp {
public static void main(String args[]) {
try{
// Load the JDBC-ODBC bridge driver方式
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:tend";
// 連接到數(shù)據(jù)庫(kù)
Connection connection=DriverManager.getConnection(url);
// 得到數(shù)據(jù)庫(kù)的信息
DatabaseMetaData meta=connection.getMetaData();
3.利用結(jié)果集工作
數(shù)據(jù)庫(kù)查詢被執(zhí)行后,查詢的結(jié)果作為一個(gè)兩維(行、列)數(shù)據(jù)表返回。ResultSet接口被用來(lái)提供訪問(wèn)查詢結(jié)果的數(shù)據(jù)表,查詢結(jié)果被當(dāng)作ResultSet對(duì)象而返回,ResultSet對(duì)象提供“指針”,指針每次訪問(wèn)數(shù)據(jù)庫(kù)表的一行。當(dāng)ResultSet對(duì)象從查詢中返回時(shí),指針初始指向數(shù)據(jù)表的第一行,ResultSet 的next() 方法用來(lái)移動(dòng)指針到數(shù)據(jù)表的下一行,如果到達(dá)表尾,next() 方法返回假的布爾值-false,否則為真。ResultSet接口提供大量的獲得數(shù)據(jù)的方法,這些方法返回?cái)?shù)據(jù)表中任意位置的數(shù)據(jù),不論是基本數(shù)據(jù)類型或引用數(shù)據(jù)類型的數(shù)據(jù)。getMetaData()方法返回ResultSetMetaData接口對(duì)象,該對(duì)象包含數(shù)據(jù)表行的信息。ResultSetMetaData 接口提供變量和從ResultSet對(duì)象獲取信息的方法,getColumnCount() 方法返回?cái)?shù)據(jù)表的列數(shù),getColumnName() 方法返回提取的數(shù)據(jù)庫(kù)中的列名稱,即數(shù)據(jù)庫(kù)字段名,getColumnType() 方法返回列的SQL類型,ResultMetaData中其它的方法被用訪問(wèn)列的額外屬性,如列的顯示寬度、數(shù)據(jù)格式及讀/寫狀態(tài)等。注意ResultSet中的列其始索引號(hào)為1而不是0。下面提供一段程序:
static void displayResults(ResultSet r) throws SQLException {
// 獲得數(shù)據(jù)結(jié)果集合
ResultSetMetaData rmeta = r.getMetaData();
// 確定數(shù)據(jù)集的列數(shù),亦字段數(shù)
int numColumns=rmeta.getColumnCount();
// 輸出每一個(gè)數(shù)據(jù)值
for(int i=1;i<=numColumns;++i) {
if(i System.out.print(rmeta.getColumnName(i)+" | ");
else
System.out.println(rmeta.getColumnName(i));
}
while(r.next()){
for(int i=1;i<=numColumns;++i) {
if(i System.out.print(r.getString(i)+" | ");
else
System.out.println(r.getString(i).trim());
}
}
}
4.執(zhí)行SQL語(yǔ)句
SQL代表著結(jié)構(gòu)化查詢語(yǔ)言,即 Structured Query Language的縮寫。SQL是用來(lái)同數(shù)據(jù)庫(kù)服務(wù)器交互的一種語(yǔ)言。SQL被IBM在70-80年代開發(fā),80年代后進(jìn)行了標(biāo)準(zhǔn)化。但標(biāo)準(zhǔn)已經(jīng)更新,現(xiàn)已出現(xiàn)好幾個(gè)版本。另外一些數(shù)據(jù)庫(kù)廠商也增加擴(kuò)展了一些特殊的功能語(yǔ)句等。JDBC需要與JDBC兼容的SQL驅(qū)動(dòng)支持,即支持ANSI SQL72標(biāo)準(zhǔn)。SQL有很多用途,當(dāng)SQL語(yǔ)句被用來(lái)創(chuàng)建、設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),它是一個(gè)數(shù)據(jù)定義語(yǔ)言;當(dāng)用來(lái)向數(shù)據(jù)庫(kù)插入信息、更新或刪除已經(jīng)存在的信息時(shí),它是一個(gè)數(shù)據(jù)維護(hù)語(yǔ)言;當(dāng)從數(shù)據(jù)庫(kù)中查詢提取信息時(shí),它是數(shù)據(jù)查詢語(yǔ)言。有關(guān)SQL語(yǔ)句的一些語(yǔ)法規(guī)則,請(qǐng)參考有關(guān)書籍,在此略。Java語(yǔ)言設(shè)計(jì)java.sql 包的目的就是讓你執(zhí)行符合Java的SQL語(yǔ)句。java.sql中的Statement 接口定義了一些方法,這些方法通過(guò)SQL語(yǔ)句的執(zhí)行來(lái)與數(shù)據(jù)庫(kù)交互,也支持通過(guò)ResultSet對(duì)象返回查詢結(jié)果集合的處理和提供查詢處理機(jī)制的控制。execute()、 executeQuery() 和executeUpdate() 方法是Statement接口的主要方法。executeQuery() 方法執(zhí)行一個(gè) SQL語(yǔ)句(如SELECT語(yǔ)句等)并查詢返回一個(gè)ResultSet對(duì)象。executeUpdate() 方法執(zhí)行一個(gè)SQL 語(yǔ)句 (如INSERT、UPDATE、DELETE 語(yǔ)句等)并更新數(shù)據(jù)庫(kù)、返回SQL查詢結(jié)果集合的行數(shù)(記錄數(shù)),如果結(jié)果集合為空則行數(shù)為0。
Java中有關(guān)SQL語(yǔ)句的程序片段如下:
import java.sql.*;
import java.util.*;
class ResultApp {
public static void main(String args[]) {
try{
// Load the JDBC-ODBC bridge driver方式
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:tend";
// 連接到數(shù)據(jù)庫(kù)
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
String sql="SELECT * FROM courses";
// 執(zhí)行SQL 語(yǔ)句得到結(jié)果集合
ResultSet result = statement.executeQuery(sql);
displayResults(result);
// 關(guān)閉數(shù)據(jù)庫(kù)連接
connection.close();
}catch(Exception ex){
System.out.println(ex);
System.exit(0);
}
}
5.數(shù)據(jù)庫(kù)安全性
數(shù)據(jù)庫(kù)的安全性問(wèn)題是很多機(jī)構(gòu)非常關(guān)心的問(wèn)題。因?yàn)閿?shù)據(jù)庫(kù)中可能包含一些比較敏感的信息需要加以限制訪問(wèn)范圍;數(shù)據(jù)的完整性也是極為重要的,未授權(quán)的肆意修改數(shù)據(jù)庫(kù)信息可能造成公司巨大的損失;數(shù)據(jù)的有效提供也是重要的,Internet/Intranet用戶隨時(shí)需要信息,這就常常需要提供每天24小時(shí)、每周7天的可訪問(wèn)。JDBC支持?jǐn)?shù)據(jù)庫(kù)安全嗎?答案不是非常滿意。當(dāng)前JDBC要依靠數(shù)據(jù)庫(kù)服務(wù)器自身提供安全保護(hù)。企業(yè)范圍的數(shù)據(jù)庫(kù)服務(wù)器,如微軟的SQL Server提供用戶ID和口令,然而,即使是口令保護(hù)也不是非常安全的,如果口令在客戶與服務(wù)器之間未加密,它們能很容易被截獲而危及安全。
Java的安全機(jī)制很高,Java2改進(jìn)了沙箱,為用戶和程序人員提供了靈活的安全管理及配置工具。Applet程序安全性更加靈活,建議利用Java的安全機(jī)制及提供的一些工具來(lái)進(jìn)行數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的開發(fā)。
Java2(JDK1.2)提供的安全工具如下:
用jar工具打包你的applets成為Java 存檔文件 (JAR);
用jarsigner對(duì)JAR文件進(jìn)行數(shù)字簽名;
用policytool對(duì)信任applets的Java運(yùn)行環(huán)境Java Runtime Environment (JRE)配置;
用keytool進(jìn)行數(shù)字證書的簽證;
三、 Java 的數(shù)據(jù)庫(kù)應(yīng)用開發(fā)展望
至此,你已知道:要進(jìn)行Java 數(shù)據(jù)庫(kù)應(yīng)用程序的設(shè)計(jì),需要具備多方面的技能,包括了解或熟練數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序、SQL( 結(jié)構(gòu)化查詢語(yǔ)言)以及java.sql包所包含的類、接口等。JavaSoft 已經(jīng)注意到了Java 在數(shù)據(jù)庫(kù)程序設(shè)計(jì)方面的棘手而復(fù)雜,他們現(xiàn)在正在開發(fā)新的同Java一樣容易使用的產(chǎn)品JavaBlend ,該產(chǎn)品將大大簡(jiǎn)化利用JDBC構(gòu)建數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的過(guò)程。JavaBlend 將自動(dòng)鏡像Java 對(duì)象成為存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息。所有對(duì)對(duì)象的操作,都將產(chǎn)生與之鏡像的數(shù)據(jù)庫(kù)的動(dòng)作,包括對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中信息的自動(dòng)查詢、更新等。一旦Java 的對(duì)象到數(shù)據(jù)庫(kù)鏡像(Java object-to-database mapping)被成功建立,JavaBlend 將免費(fèi)發(fā)放給Java 程序員,以使Java 程序員從利用繁瑣SQL語(yǔ)句、結(jié)果集合解決方案過(guò)渡到利用JavaBlend 把對(duì)Java 對(duì)象的方法調(diào)用相應(yīng)地自動(dòng)轉(zhuǎn)化成SQL語(yǔ)句和結(jié)果集合這一簡(jiǎn)單方案。這將使JDBC和SQL知識(shí)在數(shù)據(jù)庫(kù)開發(fā)時(shí)不必考慮過(guò)多,而使程序員專心于用戶業(yè)務(wù)方案的提供解決。JavaBlend目前并不包含在JDK 1.2中。
Java 語(yǔ)言及其技術(shù)是當(dāng)今世界程序設(shè)計(jì)語(yǔ)言的主流。應(yīng)用Java 技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)是未來(lái)的發(fā)展方向,Java 的數(shù)據(jù)庫(kù)應(yīng)用現(xiàn)已成功地應(yīng)用于商業(yè)、政府及大學(xué)等領(lǐng)域,應(yīng)用才剛剛起步。相信不久的將來(lái),Java 技術(shù)將更加完善成熟。Java的數(shù)據(jù)庫(kù)應(yīng)用也將遍地開花。
---------------------
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信